回答編集履歴

4

訂正3

2018/02/24 00:33

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -148,7 +148,7 @@
148
148
 
149
149
 
150
150
 
151
- 回答に誤りがありました。コントローラーにInitializableを実装するのは「古いやりかた」と[APIリファレンス](https://docs.oracle.com/javase/jp/8/javafx/api/javafx/fxml/Initializable.html)に書いてありました。JavaFX 2.2以降は`public void initializable()`あるいは`@FXML private void initializable()`というメソッドを定義しておけばよいそうです。
151
+ 回答に誤りがありました。コントローラーにInitializableを実装するのは「古いやりかた」と[APIリファレンス](https://docs.oracle.com/javase/jp/8/javafx/api/javafx/fxml/Initializable.html)に書いてありました。JavaFX 2.2以降は**引数なし**の`public void initialize()`あるいは`@FXML private void initialize()`というメソッドを定義しておけばよいそうです。
152
152
 
153
153
 
154
154
 
@@ -157,3 +157,11 @@
157
157
 
158
158
 
159
159
  大変失礼しました!
160
+
161
+
162
+
163
+ 訂正3:訂正2のメソッド名の綴りが間違ってました。度々失礼しました。
164
+
165
+ ×:initializable()
166
+
167
+ 〇:initialize()

3

訂正

2018/02/24 00:33

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -92,7 +92,7 @@
92
92
 
93
93
 
94
94
 
95
- コントローラークラス:
95
+ コントローラークラス:(**訂正2で内容を変更しました。元のコードはInitializableを実装したクラスとしていましたがそれは古いスタイルでした**)
96
96
 
97
97
  ```java
98
98
 
@@ -100,9 +100,7 @@
100
100
 
101
101
 
102
102
 
103
- // 基本的にInitializableを実装したクラスにします。
104
-
105
- public MyController implements Initializable {
103
+ public MyController {
106
104
 
107
105
  @FXML
108
106
 
@@ -110,7 +108,7 @@
110
108
 
111
109
 
112
110
 
113
- public void initialize(URL location, ResourceBundle resources) {
111
+ public void initialize() {
114
112
 
115
113
  // このメソッドで画面制御用の初期化などを行います。
116
114
 
@@ -138,4 +136,24 @@
138
136
 
139
137
 
140
138
 
141
- FXMLを用いた画面を作るというトピックでは必ずinitializeメソッドの説明があると思います。よく探してみることをお奨めします。
139
+ ~~FXMLを用いた画面を作るというトピックでは必ずinitializeメソッドの説明があると思います。よく探してみることをお奨めします。~~
140
+
141
+ =>訂正2をご覧ください。
142
+
143
+
144
+
145
+ ---
146
+
147
+ 訂正2:
148
+
149
+
150
+
151
+ 回答に誤りがありました。コントローラーにInitializableを実装するのは「古いやりかた」と[APIリファレンス](https://docs.oracle.com/javase/jp/8/javafx/api/javafx/fxml/Initializable.html)に書いてありました。JavaFX 2.2以降は`public void initializable()`あるいは`@FXML private void initializable()`というメソッドを定義しておけばよいそうです。
152
+
153
+
154
+
155
+ [https://www.nakamuri.info/mw/index.php/コントローラを初期化するには](https://www.nakamuri.info/mw/index.php/%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%82%92%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF)
156
+
157
+
158
+
159
+ 大変失礼しました!

2

不正確な点を訂正

2018/02/23 16:27

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
  ###原因
38
38
 
39
- コントローラークラスの使い方が間違ってます。アプリケーションクラスとコントロールクラスは別のクラスにしてください。@FXMLアノテーションはコントロールクラスで使うものです。アプリケーションクラスで使っても効果がない(そこにNodeが設定されることは決してない)と思ってください。
39
+ コントローラークラスの使い方が間違ってます。アプリケーションクラスとコントロールクラスは別のクラスにしてください。
40
40
 
41
41
 
42
42
 
@@ -70,7 +70,7 @@
70
70
 
71
71
  ```
72
72
 
73
- 普通は上の程度しか書くことはありません。@FXMLは使いません(使えません)。コントローラークラスと兼用するのはNGと思ってください。(やろうとおもえばできなくはないですがかなり不自然なのでお勧めしません)
73
+ 普通は上の程度しか書くことはありません。コントローラークラスと兼用するのはNGと思ってください。(やろうとおもえばできなくはないですがかなり不自然なのでお勧めしません)
74
74
 
75
75
 
76
76
 

1

追記

2018/02/23 14:54

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -25,3 +25,117 @@
25
25
 
26
26
 
27
27
  1~3が適切に行えているなら、initializeメソッドの中にこう書けばNPEは起きないと思います。しかし例えばこれをstrというフィールドの宣言の場所に書いたならNGです。コントローラーのインスタンス生成時点ではtopButtonの値はまだ未設定(null)だからです。1~3の記述によってはそれが原因でNPEが起きるようなケースも考えられます。
28
+
29
+
30
+
31
+ ---
32
+
33
+ 追記:追記された内容を受けて。
34
+
35
+
36
+
37
+ ###原因
38
+
39
+ コントローラークラスの使い方が間違ってます。アプリケーションクラスとコントロールクラスは別のクラスにしてください。@FXMLアノテーションはコントロールクラスで使うものです。アプリケーションクラスで使っても効果がない(そこにNodeが設定されることは決してない)と思ってください。
40
+
41
+
42
+
43
+ ###対処
44
+
45
+ まず典型的な使い方覚えましょう
46
+
47
+
48
+
49
+ アプリケーションクラス:
50
+
51
+ ```Java
52
+
53
+ package your.application.package;
54
+
55
+
56
+
57
+ public class MyApplication extends Application {
58
+
59
+ @Override public void start(Stage stage) {
60
+
61
+ ルートノードの型 root = FXMLLoader.load(...);
62
+
63
+ stage.setScene(new Scene(root));
64
+
65
+ stage.show();
66
+
67
+ }
68
+
69
+ }
70
+
71
+ ```
72
+
73
+ 普通は上の程度しか書くことはありません。@FXMLは使いません(使えません)。コントローラークラスと兼用するのはNGと思ってください。(やろうとおもえばできなくはないですがかなり不自然なのでお勧めしません)
74
+
75
+
76
+
77
+ FXML:
78
+
79
+ ```xml
80
+
81
+ ...
82
+
83
+ <ルートノード ... fx:controller="controller.package.MyController">
84
+
85
+ ...
86
+
87
+ <Button fx:id="button1" onAction="#onClick1"...>
88
+
89
+ ...
90
+
91
+ ```
92
+
93
+
94
+
95
+ コントローラークラス:
96
+
97
+ ```java
98
+
99
+ package controller.package;
100
+
101
+
102
+
103
+ // 基本的にInitializableを実装したクラスにします。
104
+
105
+ public MyController implements Initializable {
106
+
107
+ @FXML
108
+
109
+ private Button button1;
110
+
111
+
112
+
113
+ public void initialize(URL location, ResourceBundle resources) {
114
+
115
+ // このメソッドで画面制御用の初期化などを行います。
116
+
117
+ // ここではじめて@FXMLアノテーション付きのフィールドがアクセスできます。
118
+
119
+ }
120
+
121
+
122
+
123
+ @FXML
124
+
125
+ private void onClick1() {
126
+
127
+ ...
128
+
129
+ }
130
+
131
+ }
132
+
133
+ ```
134
+
135
+
136
+
137
+ > 参考にした書籍では initialize メソッドについて触れていなかった
138
+
139
+
140
+
141
+ FXMLを用いた画面を作るというトピックでは必ずinitializeメソッドの説明があると思います。よく探してみることをお奨めします。