CUBは子供の白熊

Java SE 8 実践プログラミングの練習問題を解く

第4章 JavaFX による GUI プログラミング : 問題 8 : FXML

問題

FXML ファイルを解析する際には、JavaFX 固有の知識は必要ない
JavaFX で何もせずに、入れ子になっているオブジェクトを持つオブジェクトをロードし、FXML 構文でプロパティを設定する例を作成せよ

注入を使用できれば、さらに良い

解答

この問題も、出題者の意図がいまひとつはっきりしない

JavaFX で何もせずに” ってどうゆうこと?

  1. FXMLLoaderを使わずに、自力で FXML ファイルをパースしろ
  2. 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));
        }
    }
}