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

回答編集履歴

4

訂正3

2018/02/24 00:33

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -73,8 +73,12 @@
73
73
  ---
74
74
  訂正2:
75
75
 
76
- 回答に誤りがありました。コントローラーに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()`というメソッドを定義しておけばよいそうです。
76
+ 回答に誤りがありました。コントローラーに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()`というメソッドを定義しておけばよいそうです。
77
77
 
78
78
  [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)
79
79
 
80
- 大変失礼しました!
80
+ 大変失礼しました!
81
+
82
+ 訂正3:訂正2のメソッド名の綴りが間違ってました。度々失礼しました。
83
+ ×:initializable()
84
+ 〇:initialize()

3

訂正

2018/02/24 00:33

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -45,16 +45,15 @@
45
45
  ...
46
46
  ```
47
47
 
48
- コントローラークラス:
48
+ コントローラークラス:(**訂正2で内容を変更しました。元のコードはInitializableを実装したクラスとしていましたがそれは古いスタイルでした**)
49
49
  ```java
50
50
  package controller.package;
51
51
 
52
- // 基本的にInitializableを実装したクラスにします。
53
- public MyController implements Initializable {
52
+ public MyController {
54
53
  @FXML
55
54
  private Button button1;
56
55
 
57
- public void initialize(URL location, ResourceBundle resources) {
56
+ public void initialize() {
58
57
  // このメソッドで画面制御用の初期化などを行います。
59
58
  // ここではじめて@FXMLアノテーション付きのフィールドがアクセスできます。
60
59
  }
@@ -68,4 +67,14 @@
68
67
 
69
68
  > 参考にした書籍では initialize メソッドについて触れていなかった
70
69
 
71
- FXMLを用いた画面を作るというトピックでは必ずinitializeメソッドの説明があると思います。よく探してみることをお奨めします。
70
+ ~~FXMLを用いた画面を作るというトピックでは必ずinitializeメソッドの説明があると思います。よく探してみることをお奨めします。~~
71
+ =>訂正2をご覧ください。
72
+
73
+ ---
74
+ 訂正2:
75
+
76
+ 回答に誤りがありました。コントローラーに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()`というメソッドを定義しておけばよいそうです。
77
+
78
+ [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)
79
+
80
+ 大変失礼しました!

2

不正確な点を訂正

2018/02/23 16:27

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -17,7 +17,7 @@
17
17
  追記:追記された内容を受けて。
18
18
 
19
19
  ###原因
20
- コントローラークラスの使い方が間違ってます。アプリケーションクラスとコントロールクラスは別のクラスにしてください。@FXMLアノテーションはコントロールクラスで使うものです。アプリケーションクラスで使っても効果がない(そこにNodeが設定されることは決してない)と思ってください。
20
+ コントローラークラスの使い方が間違ってます。アプリケーションクラスとコントロールクラスは別のクラスにしてください。
21
21
 
22
22
  ###対処
23
23
  まず典型的な使い方覚えましょう
@@ -34,7 +34,7 @@
34
34
  }
35
35
  }
36
36
  ```
37
- 普通は上の程度しか書くことはありません。@FXMLは使いません(使えません)。コントローラークラスと兼用するのはNGと思ってください。(やろうとおもえばできなくはないですがかなり不自然なのでお勧めしません)
37
+ 普通は上の程度しか書くことはありません。コントローラークラスと兼用するのはNGと思ってください。(やろうとおもえばできなくはないですがかなり不自然なのでお勧めしません)
38
38
 
39
39
  FXML:
40
40
  ```xml

1

追記

2018/02/23 14:54

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -11,4 +11,61 @@
11
11
 
12
12
  > 4 Javaプログラムにて「String str = topButton.getId();」を実行
13
13
 
14
- 1~3が適切に行えているなら、initializeメソッドの中にこう書けばNPEは起きないと思います。しかし例えばこれをstrというフィールドの宣言の場所に書いたならNGです。コントローラーのインスタンス生成時点ではtopButtonの値はまだ未設定(null)だからです。1~3の記述によってはそれが原因でNPEが起きるようなケースも考えられます。
14
+ 1~3が適切に行えているなら、initializeメソッドの中にこう書けばNPEは起きないと思います。しかし例えばこれをstrというフィールドの宣言の場所に書いたならNGです。コントローラーのインスタンス生成時点ではtopButtonの値はまだ未設定(null)だからです。1~3の記述によってはそれが原因でNPEが起きるようなケースも考えられます。
15
+
16
+ ---
17
+ 追記:追記された内容を受けて。
18
+
19
+ ###原因
20
+ コントローラークラスの使い方が間違ってます。アプリケーションクラスとコントロールクラスは別のクラスにしてください。@FXMLアノテーションはコントロールクラスで使うものです。アプリケーションクラスで使っても効果がない(そこにNodeが設定されることは決してない)と思ってください。
21
+
22
+ ###対処
23
+ まず典型的な使い方覚えましょう
24
+
25
+ アプリケーションクラス:
26
+ ```Java
27
+ package your.application.package;
28
+
29
+ public class MyApplication extends Application {
30
+ @Override public void start(Stage stage) {
31
+ ルートノードの型 root = FXMLLoader.load(...);
32
+ stage.setScene(new Scene(root));
33
+ stage.show();
34
+ }
35
+ }
36
+ ```
37
+ 普通は上の程度しか書くことはありません。@FXMLは使いません(使えません)。コントローラークラスと兼用するのはNGと思ってください。(やろうとおもえばできなくはないですがかなり不自然なのでお勧めしません)
38
+
39
+ FXML:
40
+ ```xml
41
+ ...
42
+ <ルートノード ... fx:controller="controller.package.MyController">
43
+ ...
44
+ <Button fx:id="button1" onAction="#onClick1"...>
45
+ ...
46
+ ```
47
+
48
+ コントローラークラス:
49
+ ```java
50
+ package controller.package;
51
+
52
+ // 基本的にInitializableを実装したクラスにします。
53
+ public MyController implements Initializable {
54
+ @FXML
55
+ private Button button1;
56
+
57
+ public void initialize(URL location, ResourceBundle resources) {
58
+ // このメソッドで画面制御用の初期化などを行います。
59
+ // ここではじめて@FXMLアノテーション付きのフィールドがアクセスできます。
60
+ }
61
+
62
+ @FXML
63
+ private void onClick1() {
64
+ ...
65
+ }
66
+ }
67
+ ```
68
+
69
+ > 参考にした書籍では initialize メソッドについて触れていなかった
70
+
71
+ FXMLを用いた画面を作るというトピックでは必ずinitializeメソッドの説明があると思います。よく探してみることをお奨めします。