回答編集履歴

2

見直しキャンペーン中

2023/07/22 09:28

投稿

TN8001
TN8001

スコア9862

test CHANGED
@@ -1,217 +1,109 @@
1
1
  ご存じの通り配列は0から始まります。
2
-
3
2
  `i=1`としてしまうと、`button[0]`がnullになり`addAll(button)`が失敗します。
4
-
5
-
6
3
 
7
4
  forは普通に作り、`"button " + (i + 1)`と使うところで`i`に1を足しましょう。
8
5
 
9
-
10
-
11
6
  > 文章をボタンの右に設置したい
12
-
13
-
14
7
 
15
8
  `VBox`は縦に並べます。`HBox`にすれば横に並びます。
16
9
 
17
-
18
-
19
10
  ```java
20
-
21
11
  import javafx.application.Application;
22
-
23
12
  import javafx.geometry.Insets;
24
-
25
13
  import javafx.scene.Scene;
26
-
27
14
  import javafx.scene.control.Button;
28
-
29
15
  import javafx.scene.control.Label;
30
-
31
16
  import javafx.scene.layout.HBox;
32
-
33
17
  import javafx.scene.layout.TilePane;
34
-
35
18
  import javafx.stage.Stage;
36
19
 
37
-
38
-
39
20
  public class Tile extends Application {
40
-
41
21
  @Override
42
-
43
22
  public void start(Stage stage) {
44
23
 
45
-
46
-
47
24
  stage.setTitle("Tile");
48
-
49
25
  stage.setWidth(300);
50
-
51
26
  stage.setHeight(150);
52
27
 
53
-
54
-
55
28
  Label status = new Label();
56
-
57
29
  status.setPadding(new Insets(10)); // ラベルの余白
58
30
 
59
-
60
-
61
31
  Button[] button = new Button[3];
62
-
63
32
  for (int i = 0; i < 3; i++) {
64
-
65
33
  button[i] = new Button("button " + (i + 1));
66
-
67
34
  // button[i].setPrefWidth(80);
68
-
69
35
  // button[i].setPrefHeight(20);
70
-
71
36
  String txt = String.format("button %d がクリックされました", i + 1);
72
-
73
37
  button[i].setOnAction(event -> status.setText(txt));
74
-
75
38
  }
76
39
 
77
-
78
-
79
40
  TilePane pane = new TilePane();
80
-
81
41
  pane.getChildren().addAll(button);
82
-
83
42
  pane.setPrefColumns(1); // 縦1列
84
-
85
43
  pane.setVgap(5); // ボタン間の隙間
86
44
 
87
-
88
-
89
45
  HBox root = new HBox(); // 横に並べるレイアウトペイン
90
-
91
46
  root.getChildren().addAll(pane, status);
92
47
 
93
-
94
-
95
48
  stage.setScene(new Scene(root));
96
-
97
49
  stage.show();
98
-
99
50
  }
100
-
101
51
  }
102
-
103
52
  ```
104
-
105
53
  縦1列に並べるだけだとあまり`TilePane`の意味を感じませんが、これでいいのでしょうか?
106
-
107
-
108
54
 
109
55
  ---
110
56
 
111
-
112
-
113
57
  縦1列なら`VBox`でいいんじゃないかと思いましたが、(ウィンドウのリサイズ等で)`TilePane`と同じ動作にしようとしたら1行増えてしまいました。。。
114
-
115
58
  1列に並べるがサイズは同じにしたいのであれば、`TilePane`で良いと思い直しました^^;
116
59
 
117
-
118
-
119
- `setPrefWidth`をするなら`setMinWidth` `setMaxWidth`がいらなくなって1行減らせます。
60
+ `setPrefWidth`をするなら`setMinWidth``setMaxWidth`がいらなくなって1行減らせます。
120
-
121
61
  しかし何故`setPrefWidth`をコメント化したかですが、私の環境だとフォントの関係かボタンテキストが収まっていなかったからです。
122
-
123
62
  推奨幅を入れなければテキストが収まるように自動計算されるので、環境に左右されなくなります。
124
63
 
125
64
 
126
-
127
-
128
-
129
65
  ```Java
130
-
131
66
  import javafx.application.Application;
132
-
133
67
  import javafx.geometry.Insets;
134
-
135
68
  import javafx.scene.Scene;
136
-
137
69
  import javafx.scene.control.Button;
138
-
139
70
  import javafx.scene.control.Control;
140
-
141
71
  import javafx.scene.control.Label;
142
-
143
72
  import javafx.scene.layout.HBox;
144
-
145
73
  import javafx.scene.layout.VBox;
146
-
147
74
  import javafx.stage.Stage;
148
75
 
149
-
150
-
151
76
  public class Tile extends Application {
152
-
153
77
  @Override
154
-
155
78
  public void start(Stage stage) {
156
79
 
157
-
158
-
159
80
  stage.setTitle("Tile");
160
-
161
81
  stage.setWidth(300);
162
-
163
82
  stage.setHeight(150);
164
83
 
165
-
166
-
167
84
  Label status = new Label();
168
-
169
85
  status.setPadding(new Insets(10));
170
86
 
171
-
172
-
173
87
  Button[] button = new Button[3];
174
-
175
88
  for (int i = 0; i < 3; i++) {
176
-
177
89
  button[i] = new Button("button " + (i + 1));
178
-
179
90
  // button[i].setPrefWidth(80);
180
-
181
91
  // button[i].setPrefHeight(20);
182
-
183
92
  button[i].setMinWidth(Control.USE_PREF_SIZE); // 最小幅を推奨幅に(小さくなりすぎないように)
184
-
185
93
  button[i].setMaxWidth(Double.MAX_VALUE); // 最大幅を制限なしに(ほかのボタンのうち一番大きいものに合わせるように)
186
-
187
94
  String txt = String.format("button %d がクリックされました", i + 1);
188
-
189
95
  button[i].setOnAction(event -> status.setText(txt));
190
-
191
96
  }
192
97
 
193
-
194
-
195
98
  VBox pane = new VBox(); // 縦に並べるレイアウトペイン
196
-
197
99
  pane.getChildren().addAll(button);
198
-
199
100
  pane.setSpacing(5); // ボタン間の隙間
200
101
 
201
-
202
-
203
102
  HBox root = new HBox();
204
-
205
103
  root.getChildren().addAll(pane, status);
206
104
 
207
-
208
-
209
105
  stage.setScene(new Scene(root));
210
-
211
106
  stage.show();
212
-
213
107
  }
214
-
215
108
  }
216
-
217
109
  ```

1

VBox

2020/07/30 03:07

投稿

TN8001
TN8001

スコア9862

test CHANGED
@@ -103,3 +103,115 @@
103
103
  ```
104
104
 
105
105
  縦1列に並べるだけだとあまり`TilePane`の意味を感じませんが、これでいいのでしょうか?
106
+
107
+
108
+
109
+ ---
110
+
111
+
112
+
113
+ 縦1列なら`VBox`でいいんじゃないかと思いましたが、(ウィンドウのリサイズ等で)`TilePane`と同じ動作にしようとしたら1行増えてしまいました。。。
114
+
115
+ 1列に並べるがサイズは同じにしたいのであれば、`TilePane`で良いと思い直しました^^;
116
+
117
+
118
+
119
+ `setPrefWidth`をするなら`setMinWidth` `setMaxWidth`がいらなくなって1行減らせます。
120
+
121
+ しかし何故`setPrefWidth`をコメント化したかですが、私の環境だとフォントの関係かボタンテキストが収まっていなかったからです。
122
+
123
+ 推奨幅を入れなければテキストが収まるように自動計算されるので、環境に左右されなくなります。
124
+
125
+
126
+
127
+
128
+
129
+ ```Java
130
+
131
+ import javafx.application.Application;
132
+
133
+ import javafx.geometry.Insets;
134
+
135
+ import javafx.scene.Scene;
136
+
137
+ import javafx.scene.control.Button;
138
+
139
+ import javafx.scene.control.Control;
140
+
141
+ import javafx.scene.control.Label;
142
+
143
+ import javafx.scene.layout.HBox;
144
+
145
+ import javafx.scene.layout.VBox;
146
+
147
+ import javafx.stage.Stage;
148
+
149
+
150
+
151
+ public class Tile extends Application {
152
+
153
+ @Override
154
+
155
+ public void start(Stage stage) {
156
+
157
+
158
+
159
+ stage.setTitle("Tile");
160
+
161
+ stage.setWidth(300);
162
+
163
+ stage.setHeight(150);
164
+
165
+
166
+
167
+ Label status = new Label();
168
+
169
+ status.setPadding(new Insets(10));
170
+
171
+
172
+
173
+ Button[] button = new Button[3];
174
+
175
+ for (int i = 0; i < 3; i++) {
176
+
177
+ button[i] = new Button("button " + (i + 1));
178
+
179
+ // button[i].setPrefWidth(80);
180
+
181
+ // button[i].setPrefHeight(20);
182
+
183
+ button[i].setMinWidth(Control.USE_PREF_SIZE); // 最小幅を推奨幅に(小さくなりすぎないように)
184
+
185
+ button[i].setMaxWidth(Double.MAX_VALUE); // 最大幅を制限なしに(ほかのボタンのうち一番大きいものに合わせるように)
186
+
187
+ String txt = String.format("button %d がクリックされました", i + 1);
188
+
189
+ button[i].setOnAction(event -> status.setText(txt));
190
+
191
+ }
192
+
193
+
194
+
195
+ VBox pane = new VBox(); // 縦に並べるレイアウトペイン
196
+
197
+ pane.getChildren().addAll(button);
198
+
199
+ pane.setSpacing(5); // ボタン間の隙間
200
+
201
+
202
+
203
+ HBox root = new HBox();
204
+
205
+ root.getChildren().addAll(pane, status);
206
+
207
+
208
+
209
+ stage.setScene(new Scene(root));
210
+
211
+ stage.show();
212
+
213
+ }
214
+
215
+ }
216
+
217
+ ```