2011年12月27日火曜日

iPhoneでJavaFXを動かすマジック その2

(まずは休憩から)

休憩しながらいろいろ考えたんだが、FXMLLoader自体、ローダーって言っているところが気に入らない。まず、DOMのようなFXMLオブジェクトであるべきじゃないか。ただその為には、ある種GUIがFXMLと等価でなければならない。それはちょっと無いんじゃないの?と、安直には思いたい所だが、FXMLのドキュメントとしての価値を考えた場合、言い換えればそれがFXMLである必要はまるでないのだけどもJavaのコンテンツだと考えた場合、ある種のアクティブなドキュメントである必要があるのではないか、あるいはそうあってほしいと思う。

欲しいといっても自分が願っているわけではないという、矛盾もあるのだが、それはまだWebが商用サービスとしては(少なくとも日本では)なかった時代から、システム開発を行う自分たちの間で求められて来た(JavaやJavaFXとは無関係なところで)『動くドキュメント』という概念があるからとも言える。

なんて言っていたら案の定、あらぬ方向に文字が走ってしまったので全カット。要するにFXMLLoaderでいいか悪いかは置いておいて、自分が何をしたいのか、それがFXMLで可能なのか、あるいは他のXMLにした方がいいのかも含めて、ちょっと別な紙に書いて整理しよう。ここに書くと多分書ききれない。

そうだ、取りあえずサンプルが動かない原因で試してみたいことがあったのでそれだけやっておこう。怪しいreplaceSceneContentのオリジナルのコードはこう。


FXML-LoginDemo.jarのApp.javaのAppクラスのreplaceSceneContentメソッド

    private Parent replaceSceneContent(String fxml) throws Exception {
        Parent page = (Parent) FXMLLoader.load(App.class.getResource(fxml), null, new JavaFXBuilderFactory());
        Scene scene = stage.getScene();
        if (scene == null) {
            scene = new Scene(page, 700, 450);
            scene.getStylesheets().add(App.class.getResource("demo.css").toExternalForm());
            stage.setScene(scene);
        } else {
            stage.getScene().setRoot(page);
        }
        stage.sizeToScene();
        return page;
    }

sceneがnullじゃないと、setRoot(page);でお茶を濁しているが、これをやめて毎回sceneのインスタンスを作ったらどうなるか。

            //stage.getScene().setRoot(page);
            scene = new Scene(page, 700, 450);
            scene.getStylesheets().add(App.class.getResource("demo.css").toExternalForm());
            stage.setScene(scene);

ほら、動いた。profileの画面が表示され、右上のlogoutをクリックすると、元のlogin画面に戻る。
だが、次のコードにしてstage.setScene(scene);だけにするとやはり動かない。

            //stage.getScene().setRoot(page);
            //scene = new Scene(page, 700, 450);
            //scene.getStylesheets().add(App.class.getResource("demo.css").toExternalForm());
            stage.setScene(scene);

他にも追求しようはあるが、面倒なので止めておく。

0 件のコメント:

コメントを投稿