2009/06/19

今日の JavaFX 1.2

このエントリーをはてなブックマークに追加

明日のオープンソースカンファレンスのために札幌に前泊。ぜっかく札幌まで来ているのですから、札幌 Java コミュニティ渡辺さんに連絡をとって、勉強会をやっていただくことにしました。

Swing とかの GUI 系の話題がいいということであったので、Swing のスレッドモデルと非同期処理についてお話しすることにしました。

しかし、明日の資料作成が全然終わらない。

JavaFX のプレゼンツール Caraibe は JavaFX 1.1 で作っていたので、せっかくだから JavaFX 1.2 に対応させようと思ったのが運のつき。

安易に NetBeans の JavaFX Plugin を JavaFX 1.2 対応のものにアップデートしてしまったのです。

そうしたら、動かない、動かない。

もう JavaFX 1.2 をやめて 1.1 に戻そうと思ったのですが、プラグインのダウングレードってどうやるかよく分からないし... しかたないので、例外はでるけど動くというところで、妥協することにしました。

ドキュメントには書いていないところで変更されていたのが、Scene Graph プロジェクトの Scenario.jar に関する部分。ようするに、JavaFX の描画要素と Swing を連携させる部分です。

まず、Scenrario.jar がありません。しかたないので、JAR ファイルを展開して (といっても jar コマンドの t オプションで調べるだけですが)、対応しそうなクラスを探すというところから。

その結果、javafx-sg-common.jar ファイルと javafx-sg-swing.jar の 2 つの JAR ファイルが Scenario.jar ファイルに対応することが分かりました。

今まで Node オブジェクトが貼られている Swing コンポーネントは

    var node: Node = ...;
    var pane: JSGPanel = node.impl_getSGNode().getPanel();

で取得することができたのですが、これができません。

var panel = (node.impl_createPGNode() as SGGroup).getPanel();

でパネルは取得できることがわかったのですが、どうもちゃんと Node オブジェクトが貼られているパネルではないようなのです。

この時点でこれはあきらめました。このため、ポップアップメニューで指定のページに移動することや、終了させることは省略。まぁ、プレゼン自体には影響ないので、大丈夫です。

この問題はもう少し時間をかけて調べれば、どうにかなるでしょう。Scene Graph プロジェクトのソースが公開されていれば、もっと簡単に調べられるのですが...

もう 1 点、分からないところがあります。

Caraibe ではマウスクリックによって、動的に Node オブジェクトを生成し、シーングラフに追加していきます。しかし、以下のようなメッセージと例外が発生してしまうのです。

WARNING * WARNING * WARNING * WARNING * WARNING
An attempt has been made to add node to a new group without
first removing it from its current group. See the class
documentation for javafx.scene.Node for further information.
This request will be granted temporarily but it will
be refused in the future. Please change your code now.
node=Group [id=background] oldgroup=Group newgroup=Group
Stack trace follows.
java.lang.IllegalArgumentException
        at javafx.scene.Group$_SBECL.onChange(Group.fx:162)
      <<以下、省略>>

この理由が全然分からない。例外が投げられている箇所の動的追加をやめたとしても、やっぱりまだ例外が発生します。

Caraibe 全体だと大きすぎるので、小さいサンプルを作って現象を再現させようと思ったのですが、普通に追加できます。

一体全体、なにがわるいんだろう。全然分からない。

幸いなことに、例外が投げられたとしても、動作はそのまま続けられるので、これも追求するのをやめました。クリックするたびに例外が投げられるのは気持ち悪いけど、背に腹は代えられません。

ほんとは札幌 Java コミュの勉強会に出るまでに、写真を撮りにいったり、なにか軽く食べたりしたかったのですが、断念。

今日は、朝からなにも食べていないのですごいおなかへっているのですが、しかたありません。

私がこうやってホテルで資料作り & デバッグをしている間、Java カンの人たちは、寿司食べに行って、その後ジンギスカンまで食べたというじゃないですか。いいなぁ。

4 件のコメント:

naotoj さんのコメント...

impl_XXXのclass/functionは名前が示す通り、あくまでimplementationでAPIではないです(リファレンスには載ってないはず)。なので将来の互換性は保証されません。

Nodeクラスはcommon profileのため、1.2では直接SwingのScenegraph(1.1のScenario.jar)に依存しない形に書き換えられています。Scenegraph本体の方は新しく共用レイヤー(javafx-sg-common)をかませる事により、いろいろなScenegraphの実装(たとえばSwingをつかった実装はjavafx-sg-swing)を組み込めるようになりました。

これで説明になってると良いのですが。

Yuichi Sakuraba さんのコメント...

naotoj さん、コメントありがとうございます。
impl_XXXX が内部的に使われる関数で、互換性を保障しないことは分かっているのですが...

たとえば JPopupMenu など、表示するときに親のコンポーネントの参照が必要になるようなコンポーネントをラップしたクラスを作りたいのです。
親のコンポーネントが必要なので、確信犯的に impl_XXXX な関数を使用して親を取り出していました。
もちろん、SwingPopuupMenu クラスなどを JavaFX が提供してくれれば何の問題もないのですが ^ ^;;

javafx-sg-common.jar と javafx-sg-swing.jar の役割分担は、自分で調べてみたことが正しかったと認識できてよかったです。

JavaFX 1.2 で生成されるクラスファイルも 1.1 とはずいぶん変わったようですね。これから、少しずつ解析していこうと思っています。

匿名 さんのコメント...

記事内容と無関係なコメントで失礼します。

Java in the Boxのトップにある
@tk.airnet.ne.jpドメインのアドレスから
櫻庭さまに連絡をとろうとしたのですが、
不通になっているようです。
(User unknownになってしまう)

念のため確認していただけると幸いです。

Yuichi Sakuraba さんのコメント...

もうしわけありませんが、tk.airnet.ne.jp のメールアドレスは使えなくなっています。
もし、なにかありましたら、yuichi.sakuraba [at] gmail.com へお願いします。