質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

787閲覧

タイルペインの配置と構成

tama_beginner

総合スコア6

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

0クリップ

投稿2020/07/25 16:35

図のようなタイルペインを作成しようと思っています。ボタンの番号は、1から3までにしたいのですがi=1にすると下記のようなエラーが出てしまいます。あと、文章をボタンの右に設置したいのですが、下に設置されてしまいます。どうすれば解決できますか?

Exception in Application start method
Exception in thread "main" java.lang.reflect.InvocationTargetException

プログラム

// Tile.java
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.TilePane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Tile extends Application {

@Override public void start(Stage stage) throws Exception { stage.setTitle("Tile"); stage.setWidth(170); stage.setHeight(140); Label status = new Label(); // ボタンを3個作る Button button[] = new Button[4]; for (int i = 1; i < 4; i++) { button[i] = new Button("button " + Integer.toString(i)); button[i].setPrefWidth(80); button[i].setPrefHeight(20); String txt = String.format("button %d がクリックされました", i); button[i].setOnAction(event -> status.setText(txt)); } // TileFloePaneに配置する TilePane pane = new TilePane(); pane.getChildren().addAll(button); VBox root = new VBox(); root.getChildren().addAll(pane, status); stage.setScene(new Scene(root)); stage.show(); }

}

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ご存じの通り配列は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をするならsetMinWidthsetMaxWidthがいらなくなって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/25 21:01

編集2023/07/22 09:28
TN8001

総合スコア9862

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tama_beginner

2020/07/26 22:24

回答していただきありがとうございます。おかげで上手くいきました。すみませんが、HBoxでの書き方もお願いします。
TN8001

2020/07/26 22:39

> HBoxでの書き方 どういう意味でしょうか? ボタンを横に並べるんですか? root.getChildren().addAll(pane, status); の説明が足りないという意味ですか?
tama_beginner

2020/07/30 02:09

時間が空いてしまいすみません。もし、TilePane以外の書き方もあればそれを教えて頂けないでしょうか?
TN8001

2020/07/30 03:07

> 縦1列に並べるだけだとあまりTilePaneの意味を感じませんが、これでいいのでしょうか? ここへの返信だったんですね。 VBoxと書いてあれば分かったのですが、HBoxだったので??となってしまいました^^; 引用文は、 ・ほんとは(テンキーのように)もっとボタンが多いんじゃないか。 ・縦1列ならVBoxでいいんじゃないか。 という疑問でした。 一応VBoxでの例を追記しますが、TilePaneで良いと思い直しました^^;
tama_beginner

2020/07/30 03:30

丁寧に教えて頂きありがとうございます。ペインは目的に合わせてどのペインを使うかを変える必要がありますからね。分かりやすかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問