回答編集履歴
2
追記
answer
CHANGED
@@ -7,4 +7,16 @@
|
|
7
7
|
#対処
|
8
8
|
簡単な対処はtest.fxmlのfx:controllerの記述を削除し、コード側で`setController(this)`でコントローラを指定してやるとうまくいくと思います。
|
9
9
|
|
10
|
-
というより、本来コントローラのインスタンスはfxmlのfx:controllerの指定からインスタンスを生成するべきであり、new TestController()で直接インスタンスを作るのは邪道です。
|
10
|
+
というより、本来コントローラのインスタンスはfxmlのfx:controllerの指定からインスタンスを生成するべきであり、new TestController()で直接インスタンスを作るのは邪道です。
|
11
|
+
|
12
|
+
邪道です、というだけではなんなので、私がコントローラを取るやり方を書いておきます。
|
13
|
+
1. fxmlにfx:controllerを指定しておく
|
14
|
+
2. コントローラ側にFMXLLoader関連の処理は書かない
|
15
|
+
3. 呼び出し側で以下のコードでコントローラのインスタンスを得る
|
16
|
+
```Java
|
17
|
+
FXMLLoader loader = new FXMLLoader(getClass().getResource("test.fxml"));
|
18
|
+
Parent root = loader.load(); // fx:rootに紐付いたノードインスタンスが得られる
|
19
|
+
TestController controller = loader.getController(); // fx:controllerに紐付いたコントローラインスタンスが得られる
|
20
|
+
```
|
21
|
+
|
22
|
+
回りくどい方法ですが、これらの処理をメソッド化してしまえばそれほど気にならなくなります。
|
1
修正
answer
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
#原因
|
2
|
-
|
2
|
+
fxmlでfx:controllerに指定しているクラスは、FXMLLoaderでfxmlをロードしたときに一緒にコントローラのインスタンスが生成されます。なので、このコードの場合、以下の処理が永遠に続きます。
|
3
|
-
|
3
|
+
1. インスタンス生成時にFXMLLoaderでFXMLをロード
|
4
|
+
1. FXMLロード時にfx:controllerで指定されたインスタンスが生成される
|
5
|
+
1. インスタンス生成時にFXMLLoaderでFXMLをロード
|
6
|
+
1. 以下繰り返し
|
4
7
|
#対処
|
5
8
|
簡単な対処はtest.fxmlのfx:controllerの記述を削除し、コード側で`setController(this)`でコントローラを指定してやるとうまくいくと思います。
|
6
9
|
|