回答編集履歴

2

コードを変更

2017/10/27 08:26

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
 
19
- (3)は具体的に以下のように書けます。
19
+ (3)は具体的に以下のように書けます。(訂正:最初に書いたコードはカスタムコントロールっぽくなかったので書き直しました)
20
20
 
21
21
 
22
22
 
@@ -30,11 +30,13 @@
30
30
 
31
31
 
32
32
 
33
+ // 他のfxml内でこのクラスを利用できるようにコンストラクターでロード
34
+
33
- public static TestController getInstance() {
35
+ public TestController() {
34
36
 
35
37
  FXMLLoader fxmlLoader = new FXMLLoader(Test.class.getResource("..."));
36
38
 
37
- TestController self = new TestController();
39
+ TestController self = this;
38
40
 
39
41
  fxmlLoader.setRoot(self);
40
42
 
@@ -46,7 +48,7 @@
46
48
 
47
49
  try {
48
50
 
49
- return fxmlLoader.load();
51
+ fxmlLoader.load();
50
52
 
51
53
  } catch (IOException e) {
52
54
 
@@ -55,10 +57,6 @@
55
57
  }
56
58
 
57
59
  }
58
-
59
-
60
-
61
- private TestCont() {} // きちんとprivateにできます!!
62
60
 
63
61
 
64
62
 

1

訂正

2017/10/27 08:26

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -1,3 +1,91 @@
1
+ 蛇足な?訂正:
2
+
3
+
4
+
5
+ 既に解決済みですが、元の回答で「回避策」として書いたことを訂正させていただきます。本当にカスタムコントロールとしたい場合は以下の方法が使えたのでした。
6
+
7
+
8
+
9
+ (1) カスタムコントロールなのであくまでfx:rootとしてfxmlを定義する
10
+
11
+ mainのfxmlからカスタムコントロールのfxmlをincludeする感じでしょうか。
12
+
13
+ (2) fx:controllerも定義しておく
14
+
15
+ (3) loadするより前にFXMLLoader#setControllerFactoryでコントローラーファクトリーを設定しておく
16
+
17
+
18
+
19
+ (3)は具体的に以下のように書けます。
20
+
21
+
22
+
23
+ ```java
24
+
25
+ public class TestController extends VBox implements Initializable {
26
+
27
+ @FXML // fx:controllerを指定できるので@FXMLに関する開発ツールのサポートが享受できる
28
+
29
+ Label label;
30
+
31
+
32
+
33
+ public static TestController getInstance() {
34
+
35
+ FXMLLoader fxmlLoader = new FXMLLoader(Test.class.getResource("..."));
36
+
37
+ TestController self = new TestController();
38
+
39
+ fxmlLoader.setRoot(self);
40
+
41
+ // fx:controllerを書いて場合でもControllerFactoryを設定しておけば
42
+
43
+ // 新たなインスタンスが生成されない。
44
+
45
+ fxmlLoader.setControllerFactory((cls) -> self);
46
+
47
+ try {
48
+
49
+ return fxmlLoader.load();
50
+
51
+ } catch (IOException e) {
52
+
53
+ throw new RuntimeException(e);
54
+
55
+ }
56
+
57
+ }
58
+
59
+
60
+
61
+ private TestCont() {} // きちんとprivateにできます!!
62
+
63
+
64
+
65
+ // これ以降は普通に...
66
+
67
+ @Override
68
+
69
+ public void initialize(URL location, ResourceBundle resources) {
70
+
71
+ ...
72
+
73
+ }
74
+
75
+ }
76
+
77
+ ```
78
+
79
+
80
+
81
+ [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
82
+
83
+
84
+
85
+ 以下元の回答
86
+
87
+ ---
88
+
1
89
  本件は自分もモヤモヤしていてスッキリした解決法をしらないのですが・・・
2
90
 
3
91