ご存じの通り配列は0から始まります。
i=1
としてしまうと、button[0]
がnullになりaddAll(button)
が失敗します。
forは普通に作り、"button " + (i + 1)
と使うところでi
に1を足しましょう。
文章をボタンの右に設置したい
VBox
は縦に並べます。HBox
にすれば横に並びます。
java
1import javafx.application.Application;
2import javafx.geometry.Insets;
3import javafx.scene.Scene;
4import javafx.scene.control.Button;
5import javafx.scene.control.Label;
6import javafx.scene.layout.HBox;
7import javafx.scene.layout.TilePane;
8import javafx.stage.Stage;
9
10public class Tile extends Application {
11 @Override
12 public void start(Stage stage) {
13
14 stage.setTitle("Tile");
15 stage.setWidth(300);
16 stage.setHeight(150);
17
18 Label status = new Label();
19 status.setPadding(new Insets(10)); // ラベルの余白
20
21 Button[] button = new Button[3];
22 for (int i = 0; i < 3; i++) {
23 button[i] = new Button("button " + (i + 1));
24// button[i].setPrefWidth(80);
25// button[i].setPrefHeight(20);
26 String txt = String.format("button %d がクリックされました", i + 1);
27 button[i].setOnAction(event -> status.setText(txt));
28 }
29
30 TilePane pane = new TilePane();
31 pane.getChildren().addAll(button);
32 pane.setPrefColumns(1); // 縦1列
33 pane.setVgap(5); // ボタン間の隙間
34
35 HBox root = new HBox(); // 横に並べるレイアウトペイン
36 root.getChildren().addAll(pane, status);
37
38 stage.setScene(new Scene(root));
39 stage.show();
40 }
41}
縦1列に並べるだけだとあまりTilePane
の意味を感じませんが、これでいいのでしょうか?
縦1列ならVBox
でいいんじゃないかと思いましたが、(ウィンドウのリサイズ等で)TilePane
と同じ動作にしようとしたら1行増えてしまいました。。。
1列に並べるがサイズは同じにしたいのであれば、TilePane
で良いと思い直しました^^;
setPrefWidth
をするならsetMinWidth
・setMaxWidth
がいらなくなって1行減らせます。
しかし何故setPrefWidth
をコメント化したかですが、私の環境だとフォントの関係かボタンテキストが収まっていなかったからです。
推奨幅を入れなければテキストが収まるように自動計算されるので、環境に左右されなくなります。
Java
1import javafx.application.Application;
2import javafx.geometry.Insets;
3import javafx.scene.Scene;
4import javafx.scene.control.Button;
5import javafx.scene.control.Control;
6import javafx.scene.control.Label;
7import javafx.scene.layout.HBox;
8import javafx.scene.layout.VBox;
9import javafx.stage.Stage;
10
11public class Tile extends Application {
12 @Override
13 public void start(Stage stage) {
14
15 stage.setTitle("Tile");
16 stage.setWidth(300);
17 stage.setHeight(150);
18
19 Label status = new Label();
20 status.setPadding(new Insets(10));
21
22 Button[] button = new Button[3];
23 for (int i = 0; i < 3; i++) {
24 button[i] = new Button("button " + (i + 1));
25// button[i].setPrefWidth(80);
26// button[i].setPrefHeight(20);
27 button[i].setMinWidth(Control.USE_PREF_SIZE); // 最小幅を推奨幅に(小さくなりすぎないように)
28 button[i].setMaxWidth(Double.MAX_VALUE); // 最大幅を制限なしに(ほかのボタンのうち一番大きいものに合わせるように)
29 String txt = String.format("button %d がクリックされました", i + 1);
30 button[i].setOnAction(event -> status.setText(txt));
31 }
32
33 VBox pane = new VBox(); // 縦に並べるレイアウトペイン
34 pane.getChildren().addAll(button);
35 pane.setSpacing(5); // ボタン間の隙間
36
37 HBox root = new HBox();
38 root.getChildren().addAll(pane, status);
39
40 stage.setScene(new Scene(root));
41 stage.show();
42 }
43}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/26 22:24
2020/07/26 22:39
2020/07/30 02:09
2020/07/30 03:07
2020/07/30 03:30