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

回答編集履歴

2

コードを変更

2017/10/27 08:26

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -7,29 +7,28 @@
7
7
  (2) fx:controllerも定義しておく
8
8
  (3) loadするより前にFXMLLoader#setControllerFactoryでコントローラーファクトリーを設定しておく
9
9
 
10
- (3)は具体的に以下のように書けます。
10
+ (3)は具体的に以下のように書けます。(訂正:最初に書いたコードはカスタムコントロールっぽくなかったので書き直しました)
11
11
 
12
12
  ```java
13
13
  public class TestController extends VBox implements Initializable {
14
14
  @FXML // fx:controllerを指定できるので@FXMLに関する開発ツールのサポートが享受できる
15
15
  Label label;
16
16
 
17
+ // 他のfxml内でこのクラスを利用できるようにコンストラクターでロード
17
- public static TestController getInstance() {
18
+ public TestController() {
18
19
  FXMLLoader fxmlLoader = new FXMLLoader(Test.class.getResource("..."));
19
- TestController self = new TestController();
20
+ TestController self = this;
20
21
  fxmlLoader.setRoot(self);
21
22
  // fx:controllerを書いて場合でもControllerFactoryを設定しておけば
22
23
  // 新たなインスタンスが生成されない。
23
24
  fxmlLoader.setControllerFactory((cls) -> self);
24
25
  try {
25
- return fxmlLoader.load();
26
+ fxmlLoader.load();
26
27
  } catch (IOException e) {
27
28
  throw new RuntimeException(e);
28
29
  }
29
30
  }
30
31
 
31
- private TestCont() {} // きちんとprivateにできます!!
32
-
33
32
  // これ以降は普通に...
34
33
  @Override
35
34
  public void initialize(URL location, ResourceBundle resources) {

1

訂正

2017/10/27 08:26

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,3 +1,47 @@
1
+ 蛇足な?訂正:
2
+
3
+ 既に解決済みですが、元の回答で「回避策」として書いたことを訂正させていただきます。本当にカスタムコントロールとしたい場合は以下の方法が使えたのでした。
4
+
5
+ (1) カスタムコントロールなのであくまでfx:rootとしてfxmlを定義する
6
+ mainのfxmlからカスタムコントロールのfxmlをincludeする感じでしょうか。
7
+ (2) fx:controllerも定義しておく
8
+ (3) loadするより前にFXMLLoader#setControllerFactoryでコントローラーファクトリーを設定しておく
9
+
10
+ (3)は具体的に以下のように書けます。
11
+
12
+ ```java
13
+ public class TestController extends VBox implements Initializable {
14
+ @FXML // fx:controllerを指定できるので@FXMLに関する開発ツールのサポートが享受できる
15
+ Label label;
16
+
17
+ public static TestController getInstance() {
18
+ FXMLLoader fxmlLoader = new FXMLLoader(Test.class.getResource("..."));
19
+ TestController self = new TestController();
20
+ fxmlLoader.setRoot(self);
21
+ // fx:controllerを書いて場合でもControllerFactoryを設定しておけば
22
+ // 新たなインスタンスが生成されない。
23
+ fxmlLoader.setControllerFactory((cls) -> self);
24
+ try {
25
+ return fxmlLoader.load();
26
+ } catch (IOException e) {
27
+ throw new RuntimeException(e);
28
+ }
29
+ }
30
+
31
+ private TestCont() {} // きちんとprivateにできます!!
32
+
33
+ // これ以降は普通に...
34
+ @Override
35
+ public void initialize(URL location, ResourceBundle resources) {
36
+ ...
37
+ }
38
+ }
39
+ ```
40
+
41
+ [https://docs.oracle.com/javase/jp/8/javafx/fxml-tutorial/custom_control.htm](https://docs.oracle.com/javase/jp/8/javafx/fxml-tutorial/custom_control.htm)にある例だとsetControllerを使ってますが、SceneBuilderなどのサポートを享受するためのfx:controllerが書けない点が何も言及されてない(?)ので今までモヤモヤしてたのですが、APIリファレンスを落ち着いて読めば答えがありました orz
42
+
43
+ 以下元の回答
44
+ ---
1
45
  本件は自分もモヤモヤしていてスッキリした解決法をしらないのですが・・・
2
46
 
3
47
  ###回避策