回答編集履歴

2

補足

2018/09/15 13:48

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -44,6 +44,8 @@
44
44
 
45
45
 
46
46
 
47
+ リスト1
48
+
47
49
  ```java
48
50
 
49
51
  public class Controller {
@@ -83,3 +85,119 @@
83
85
 
84
86
 
85
87
  こうしておくと最初のコードに書いたような繰り返し文が書けるようになります。
88
+
89
+
90
+
91
+ ---
92
+
93
+ 補足:
94
+
95
+ コメントいただくまで、実際にやってみてなかったのですが、やってみると(多分SceneBuilderにクセがあるため)ひっかかりそうな点がありそうなので補足します。
96
+
97
+
98
+
99
+ SceneBuilderをつかってGridPaneにButtonなどを配置するとちょっと都合の悪いFXMLが出来上がります。多分以下のようなFXMLになってしまうことでしょう。(関係ないプロパティーは省略してます)
100
+
101
+
102
+
103
+ ```XML
104
+
105
+ <GridPane fx:id="gridPane" ...省略...>
106
+
107
+ ...省略...
108
+
109
+ <children>
110
+
111
+ <Button text="0_0" />
112
+
113
+ <Button text="0_1" GridPane.columnIndex="1" />
114
+
115
+ <Button text="1_0" GridPane.rowIndex="1" />
116
+
117
+ <Button text="1_1" GridPane.columnIndex="1" GridPane.rowIndex="1" />
118
+
119
+ </children>
120
+
121
+ </GridPane>
122
+
123
+ ```
124
+
125
+
126
+
127
+ どうもrowIndexやcolumnIndexが0だとその値がデフォルト値という意味でSceneBuilderはFXMLプロパティ(GridPane.columnIndex および GridPane.rowIndex)を生成してくれないようです。
128
+
129
+ 単に画面を表示するだけなら問題ないのですが、上のリスト1にあるようにgetRowIndex, getColumnIndexを取り出すと結果がnullとなりNPE(Null Pointer Exception)が発生してしまいます。
130
+
131
+
132
+
133
+ FXML上に手書きでcolumnIndex, rowIndexとして"0"というプロパティー値を明記すればリスト1のコードのままでも動作するのですが、そんなことをしても再度SceneBuilderで編集するとまたプロパティー値が消されてしまうため、よい対処とは言えません。
134
+
135
+
136
+
137
+ ということで、リスト1に対してgetRowIndex, getColumnIndexを取得した結果がnullの場合は0を仮定するという対処をすれば動くと思います。いちいちこんな配慮をするのは業腹な気がしますが・・・
138
+
139
+
140
+
141
+ リスト1(NPE対策版)
142
+
143
+ ```java
144
+
145
+ ...
146
+
147
+ import java.util.Optional;
148
+
149
+
150
+
151
+ public class Controller {
152
+
153
+ @FXML
154
+
155
+ GridPane gridPane; // Buttonを配置しているGridPane
156
+
157
+ ...
158
+
159
+ Button[][] buttons = new Button[8][8];
160
+
161
+
162
+
163
+ @FXML
164
+
165
+ void initialize() {
166
+
167
+ for (Node child: gridPane.getChildren()) {
168
+
169
+ int rowIndex = Optional.ofNullable(GridPane.getRowIndex(child)).orElse(0);
170
+
171
+ int columnIndex = Optional.ofNullable(GridPane.getColumnIndex(child)).orElse(0);
172
+
173
+ buttons[rowIndex][columnIndex] = (Button)child;
174
+
175
+ }
176
+
177
+ ...
178
+
179
+ }
180
+
181
+ }
182
+
183
+ ```
184
+
185
+ ---
186
+
187
+ さらに蛇足:
188
+
189
+ NPE対策コードではnullチェックを多少なりとも簡潔に書こうと思ったのでOptionalを使っています。これはおおむね次のようなコードと同義です。
190
+
191
+
192
+
193
+ ```java
194
+
195
+ Integer _rowIndex = GridPane.getRowIndex(child);
196
+
197
+ int rowIndex = _rowIndex == null ? 0 : _rowIndex;
198
+
199
+ ...
200
+
201
+ ```
202
+
203
+ 本件に関係ないのですが「SceneBuilderのいけてない」感を多少なりとも緩和したいなぁとなんとなく思ったのでこういうコードにしてみました。緩和できてないかもしれませんが・・・

1

コード変更

2018/09/15 13:48

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -64,9 +64,9 @@
64
64
 
65
65
  for (Node child: gridPane.getChildren()) {
66
66
 
67
- int rowIndex = gridPane.getRowIndex(child);
67
+ int rowIndex = GridPane.getRowIndex(child);
68
68
 
69
- int columnIndex = gridPane.getColumnIndex(child);
69
+ int columnIndex = GridPane.getColumnIndex(child);
70
70
 
71
71
  buttons[rowIndex][columnIndex] = (Button)child;
72
72