2009年 3月 11日 水曜日
JavaFX で Yahoo! map を - JavaFX から javascript を起動する -
数日前、営業部の方 (といっても、エンジニアの方ですが) から、「JavaFX から JavaScript を使いたいのですが?」というご質問をいただきました。
実は、以前から JavaFX から、google や yahoo の地図を起動できないかなぁ、と思っていました。これらの API は、javascript もしくは web サービスで提供されていて、JavaFX から、javascript を起動する方法を考えたのですが、あまりいい方法が見つからず挫折していたので、一瞬、「できないと思います」と答えようとしてしまいました。ところが、その後の説明を聞くと「Java から JavaScript を起動する方法は見つけたのですが、JavaFX から使えないでしょうか?」ということだったのです。
JavaFX では、ご存じの通り、Java のオブジェクトはほとんどそのまま利用できます。なので、「それならできるかも」と思い、サンプルコードを見せていただきました。
... 結局のところ、私は何の役にもたたず、その方が自己解決してくださり、JavaFX から JavaScript を起動する方法を教えていただきました。(ありがとうございます!)
その方法をもとに、以前挫折した、Yahoo Map を JavaFX から起動する方法について、書いておこうと思います(IDE は NetBeans を使っています)。
上の図では、サンマイクロシステムズ本社のある SBS タワーの緯度と経度 (35.62355719, 139.63583278) を入力して、表示した地図です。
JavaFX から JavaScript の関数を呼び出すには、JSObject を利用します。 Java から JavaScript への通信 に JSObject に関する記述がありますが、java1.4 時代のもので、内容的にはちょっと古そうです。なので、ほとんどの情報は、WWW を探して見つけてきたものです。
JSObject は、JRE の plugin.jar にあります。使い方を簡単に説明すると、getWindow メソッドで、
JSObject クラスのインスタンスを取得し、call メソッドで、HTML 上で定義されている javascript の関数を呼び出すことができます。
windonw = JSObject.getWindow(アプレット);
window.call("関数名", 引数);
私の環境の場合、plugin.jar は以下のディレクトリにありました。
C:\Program Files\Java\jdk1.6.0_11\jre\lib\plugin.jar
var applet: Applet = javafx.lang.FX.getArgument("javafx.applet") as Applet;
var window = netscape.javascript.JSObject.getWindow(applet);
window.call("関数名", 引数);
var testval = window.call("関数名", 引数) as String;
JavaFX 側の説明はいったんここまでにします。というのは、呼び出される側の JavaScript がないと、呼び出せないので!
次に、JavaFX から起動できるように、window.onload() 時ではなく、関数として指定して、任意の時点で地図を表示するように変更します。これらを head タグの間に定義しておきます。
<head>
<script type="text/javascript" src="http://map.yahooapis.jp/MapsService/js/V2/?appid=マップキー"></script>
<script langauge="javascript">
function Start() {
ymap = new YahooMapsCtrl("map");
}
</script>
</head>
マップキーは取得したマップキーを入力してください。
この Start() 関数を JavaFX 側から呼び出すことになります。
ここでは緯度、経度の引数はまだ考えていないので、この関数が実行されると、
Yahoo Japan の本社 (六本木ヒルズ) に飛ぶはずです。
次に body には、Yahoo! Map を表示する領域と、JavaFX スクリプトから生成されるアプレットを配置します。以下は Yahoo! Map を表示する領域です。
<div id="map" style="width:600px; height:300px"></div>
そして、アプレットは以下の通りです。JavaFX スクリプトをアプレットとして配備する方法の詳細は、櫻庭さんの「ついにベールを脱いだJavaFX:第13回 デプロイメントとアプレット を参照してください。
<script src="http://dl.javafx.com/1.1/dtfx.js"></script>
<script>
javafx(
{
archive: "JavaFXApplication5.jar",
draggable: true,
width: 200,
height: 200,
code: "javafxapplication5.Main",
name: "JavaFXApplication5"
}
);
</script>
この部分は、NetBeans が生成してくれる html (プロジェクトの dist ディレクトリに生成されます) をコピーしたものです。draggable は false でいいかもしれませんね。
この作成した HTML (ページの下部に最終的な HTML のリンクがあります) を dist に NetBeans で生成される HTML とは別の名前で保存しておきます。右クリックから、「表示」選ぶと、ブラウザから表示することができます。
var nsew = "latitude, longitude";
(略)
SwingTextField {
columns: 20
text: bind nsew with inverse
editable: true
},
SwingButton {
text: "Yahoo Map"
onMouseClicked: function( e: MouseEvent ):Void {
var args: String[] = [nsew];
window.call("Start", args);
}
}
JavaFX の完全なソースは、 ここ にあります。
http://chaichan.web.infoseek.co.jp/qa6000/qa6015.htm
argument[] に渡されているんですね。
なので、JavaScript の Start() 関数を下記のように変更しました。
function Start() {
ymap = new YahooMapsCtrl("map", String(arguments[0]));
}
これで完成です!
作成した HTML を ここ においておきました。ただしリンクをクリックすると html として表示してしまうので、ファイルにセーブしてから参照してください。
最後に一点だけ誤解の無いように付け足しておきます。この方法では、あくまで JavaScript の関数を呼び出しているだけなので、Yahoo! Map 自体を JavaFX 側で操作することはできません。つまり、表示させたマップを回転させたり、拡大させたりはできないです。これは Yahoo Japan に対応していただくしか方法はないですかね...
Posted at 04:11午後 3 11, 2009 by kenji in JavaFX の素人 | 投稿されたコメント[3]
Yahoo Maps! はよく分らないのですが、Google Maps であれば、拡大や移動、マークを付けるなどがすべてJavaScriptの関数になっているので、JavaFXからでもコントロールできますよ。
Posted by さくらば on 3月月 11日, 2009年 at 05:41 午後 JST #
さくらばさん、コメントありがとうございます。
確かに、Google Maps だといろいろできそうですね。この blog の英語版を書こうと思っているので、そっちは、google maps にしてみようかな。
# リンクを無断で張らせていただいていますが、「ついにベールを脱いだJavaFX」は、いつも参考にさせていただいています。これ、出版される予定はないのですか?書籍として手元に置いておきたいですね。
Posted by Kenji Tachibana on 3月月 12日, 2009年 at 11:42 午前 JST #
リンクは全然OKですよ。
書籍になればいいんですけどねぇ。今のところそういう話はないんです。
Posted by さくらば on 3月月 12日, 2009年 at 01:43 午後 JST #