回答編集履歴
2
コードを変更
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
|
18
|
+
public TestController() {
|
18
19
|
FXMLLoader fxmlLoader = new FXMLLoader(Test.class.getResource("..."));
|
19
|
-
TestController self =
|
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
|
-
|
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
訂正
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
|
###回避策
|