SSブログ

FXMLでレイアウトを定義する [JavaFX]

前置き

自分がSwingからJavaFXへ移行する上で、一番の動機付けになっている変更点が、XMLでレイアウトを定義できるようになった所だった。
FXMLというXML形式のファイルに、コンテナにコントロールの配置を定義する。

FXMLはSceneBuilderというツールで、コントロールをドラッグアンドドロップして配置していく要領で、簡単に作成することができる。
これをクラスローダで読み込んで、コントロールに対し必要な処理部分を定義していく流れとなり、 WEBアプリケーションを作成するのに近くなったことで、MVCライクな設計が可能となる。
ということは、設計によってはWEBアプリケーションとGUIアプリケーションの資産を相互に流用することもできる。

準備

後述の手順でSceneBuilderを準備していく。

  • SceneBuilderインストーラーをダウンロードする
  • SceneBuilderをインストールする
  • SceneBuilderを起動すると文字化けしている[涙]
  • 製造元のGitHubリポジトリからSceneBuilderApp_ja.propertiesをダウンロードする
  • ダウンロードしたSceneBuilderApp_ja.propertiesはUTF-8で保存する(必要に応じて)
  • C:\Program Files\SceneBuilder\app\scenebuilder-11.0.0-all.jarの拡張子をzipに変更して解凍する
  • 解凍後のcom\oracle\javafx\scenebuilder\app\i18n\SceneBuilderApp_ja.propertiesをダウンロードしたSceneBuilderApp_ja.propertiesで置き換える
  • 解凍したscenebuilder-11.0.0-allをzipで圧縮しなおして拡張子をjarに戻す
  • SceneBuilderを起動すると文字化が解消されている

  • ここまでいろいろと書いているが、この方の説明の方が遥かに分かり易いのでお勧め。

    実装

    SceneBuilderでコンテナにコントロールを配置していく。
    操作が直感的に行えるので配置に関する説明は割愛するが、ポイントだけ押さえておく。

    まずはfx:idについて。
    コントロール毎に識別子を指定する。これがJava側でのフィールド名となる。
    コントロールを選択して、右側のインスペクタからCodeを展開しfx:idにJavaでのフィールド名を指定する。

    SceneBuilderKaiso.png

    次に、Controllerクラスを指定する。
    これはFXMLとJavaクラスをバインドさせるための指定で、左側のドキュメントからコントローラを展開し、 Controller classに、パッケージを含めたクラス名を指定する。

    SceneBuilderController.png

    コントローラクラスに指定されたクラスは、javafx.fxml.Initializableインタフェースをimplementsする必要がある。
    これによって、@FXMLアノテーションでfx:idとフィールド名をバインドさせることができる。
    また、Initializableインタフェースには、initializeという抽象メソッドが用意されており、 FXMLで定義できないコントロールの処理や設定などを、文字通り初期化することができる。

    以上、SceneBuilderで作成したFXMLファイルは、リソースフォルダに保存する。
    コントローラクラスからgetResourceメソッドで読み込みを想定しているので、 コントローラクラスと同じパッケージを用意し、FXDemo.fxmlというファイル名で保存することにする。

    FXDemoKaiso.png

    FXDemo.fxml


    FXDemo.java

    今回は、FXMLでは定義していない初期値やボタン名を、initializeメソッドで変更してみた。

    実行結果

    FXDemo実行.png


    nice!(0)  コメント(0) 

    nice! 0

    コメント 0

    コメントを書く

    お名前:
    URL:
    コメント:
    画像認証:
    下の画像に表示されている文字を入力してください。

    この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。