第4章 JavaFX による GUI プログラミング : 問題 8 : FXML
問題
FXML ファイルを解析する際には、JavaFX 固有の知識は必要ない
JavaFX で何もせずに、入れ子になっているオブジェクトを持つオブジェクトをロードし、FXML 構文でプロパティを設定する例を作成せよ
注入を使用できれば、さらに良い
解答
この問題も、出題者の意図がいまひとつはっきりしない
“JavaFX で何もせずに” ってどうゆうこと?
FXMLLoader
を使わずに、自力で FXML ファイルをパースしろFXMLLoader
に FXML ファイルを読ませて、JavaFX とは関係ないオブジェクトを作ってみろ
のどちらかなのか?
さすがに 1 は車輪の再発明なので、2 の意味だとする
まず、入れ子になっているオブジェクトとそれを持つオブジェクトのクラスをjavase8.chapter4.Exercise8
クラスのネストクラスで定義する
■ 入れ子になっているオブジェクトを持つオブジェクト
public static class Hoge { // プロパティ child private Child child; // List のプロパティ children private List<Child> children = new ArrayList<Child>(); // Default コンストラクタ public Hoge() { : } // プロパティ child のゲッター public Child getChild() { return child; } // プロパティ child のセッター public void setChild(Child child) { this.child = child; } // List のプロパティ children のゲッター public List<Child> getChildren() { return children; } }
■ Hoge のメンバー
public static class Child { // プロパティ foo private String foo; // Default コンストラクタ public Child() { : } // プロパティ foo のゲッター public String getFoo() { return foo; } // プロパティ foo のセッター public void setFoo(String value) { foo = value; } }
■ FXMLファイル
<?xml version="1.0" encoding="UTF-8"?> <?import java.lang.*?> <?import java.util.*?> <?import javase8.chapter4.Exercise8.Hoge?> <?import javase8.chapter4.Exercise8.Child?> <Exercise8.Hoge xmlns:fx="http://javafx.com/fxml" fx:controller="javase8.chapter4.Exercise8"> <child> <Exercise8.Child fx:id="foo" foo="foo"/> </child> <children> <Exercise8.Child foo="bar"/> <Exercise8.Child foo="hoge"/> </children> </Exercise8.Hoge>
では、この FXML ファイルを読み込んで Hoge オブジェクトを生成してみよう
javase8.chapter4.Exercise8
クラスはコントローラになってChild
を注入する
package javase8.chapter4; public class Exercise8 implements Initializable { @FXML private Child foo; // Initializable インターフェースの実装 public void initialize(URL location, ResourceBundle resources) { System.out.println("foo is " + foo); System.out.println(this); } public static void main(String[] args) throws Exception { Hoge hoge = FXMLLoader.load(Exercise8.class.getResource("Exercise8.fxml")); System.out.println("Hoge is " + hoge); System.out.println("Hoge.child is " + hoge.getChild()); for (int i = 0; i < hoge.getChildren().size(); i++) { System.out.println("Hoge.children[" + i + "] is " + hoge.getChildren().get(i)); } } }