質問するログイン新規登録

回答編集履歴

2

追記

2017/10/25 00:17

投稿

masaya_ohashi
masaya_ohashi

スコア9210

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

修正

2017/10/25 00:17

投稿

masaya_ohashi
masaya_ohashi

スコア9210

answer CHANGED
@@ -1,6 +1,9 @@
1
1
  #原因
2
- test.fxmlでfx:controller指定しているクラスは、FXMLLoaderでロードしたときに一緒にインスタンスが生成されます。なので、new TestController()と書いて使った場合、インスタンス生成時にFXMLLoaderでロード、ロード時にインスタンス生成、インスタンス生成時にFXMLLoaderでロード、が永遠に続きます。
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