回答編集履歴

2

追記

2017/10/25 00:17

投稿

masaya_ohashi
masaya_ohashi

スコア9206

test CHANGED
@@ -17,3 +17,27 @@
17
17
 
18
18
 
19
19
  というより、本来コントローラのインスタンスはfxmlのfx:controllerの指定からインスタンスを生成するべきであり、new TestController()で直接インスタンスを作るのは邪道です。
20
+
21
+
22
+
23
+ 邪道です、というだけではなんなので、私がコントローラを取るやり方を書いておきます。
24
+
25
+ 1. fxmlにfx:controllerを指定しておく
26
+
27
+ 2. コントローラ側にFMXLLoader関連の処理は書かない
28
+
29
+ 3. 呼び出し側で以下のコードでコントローラのインスタンスを得る
30
+
31
+ ```Java
32
+
33
+ FXMLLoader loader = new FXMLLoader(getClass().getResource("test.fxml"));
34
+
35
+ Parent root = loader.load(); // fx:rootに紐付いたノードインスタンスが得られる
36
+
37
+ TestController controller = loader.getController(); // fx:controllerに紐付いたコントローラインスタンスが得られる
38
+
39
+ ```
40
+
41
+
42
+
43
+ 回りくどい方法ですが、これらの処理をメソッド化してしまえばそれほど気にならなくなります。

1

修正

2017/10/25 00:17

投稿

masaya_ohashi
masaya_ohashi

スコア9206

test CHANGED
@@ -1,8 +1,14 @@
1
1
  #原因
2
2
 
3
- test.fxmlでfx:controller指定しているクラスは、FXMLLoaderでロードしたときに一緒にインスタンスが生成されます。なので、new TestController()と書いて使った場合、インスタンス生成時にFXMLLoaderでロード、ロード時にインスタンス生成、インスタンス生成時にFXMLLoaderでロード、が永遠に続きます。
3
+ fxmlでfx:controller指定しているクラスは、FXMLLoaderでfxmlをロードしたときに一緒にコントローラのインスタンスが生成されます。なので、このコードの場合、以下の処理が永遠に続きます。
4
4
 
5
+ 1. インスタンス生成時にFXMLLoaderでFXMLをロード
5
6
 
7
+ 1. FXMLロード時にfx:controllerで指定されたインスタンスが生成される
8
+
9
+ 1. インスタンス生成時にFXMLLoaderでFXMLをロード
10
+
11
+ 1. 以下繰り返し
6
12
 
7
13
  #対処
8
14