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

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

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

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

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

Q&A

解決済

2回答

5613閲覧

JavaFXにて画像を表示させることはできたが、ボタンの上に表示させたいのに、下に表示される。

mr0237

総合スコア164

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

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

0グッド

0クリップ

投稿2017/01/22 08:13

編集2017/01/22 10:19

JAVAの初心者です。練習でJavaFXを使ってボタンを押して選択ダイアログを出して、画像を表示するプログラムを作りたいのですが、一応コードは画像を表示するところまで書いたのですが、画像をボタンの上に表示させたいのに、ボタンの下に表示されます。↓

> イメージ説明

画像をボタンの上に表示させるにはどうすればいいのでしょうか?

Java

1 2package rensyuuyou; 3 4import java.io.*; 5 6import javafx.application.Application; 7import javafx.event.ActionEvent; 8import javafx.event.EventHandler; 9import javafx.geometry.Insets; 10import javafx.geometry.Pos; 11import javafx.scene.Scene; 12import javafx.scene.control.Button; 13import javafx.scene.layout.VBox; 14import javafx.stage.Stage; 15import javafx.stage.FileChooser; 16import javafx.scene.image.Image; 17import javafx.scene.image.ImageView; 18 19 20public class Rensyuuyou extends Application { 21 22 @Override 23 public void start(Stage stage) { 24 stage.setTitle("練習用"); 25 stage.setWidth(2000); 26 stage.setHeight(1000); 27 28 /* 29 画像を表示する 30 */ 31 Image image = new Image(new File 32 ("画像ファイルのパス名").toURI().toString()); 33 ImageView imageView = new ImageView(image); 34 imageView.setFitHeight(500); 35 imageView.setFitWidth(1000); 36 37 /* 38 ボタンの表示 39 */ 40 41 Button botan = new Button("画像表示"); 42 botan.setPrefSize(900, 30); 43 44 45 46 /* 47 ボタンを押したときの動作 48 */ 49 botan.setOnAction(new EventHandler<ActionEvent>() { 50 @Override 51 public void handle(ActionEvent event) { 52 FileChooser fileChooser = new FileChooser(); 53 fileChooser.setTitle("画像を開く"); 54 fileChooser.getExtensionFilters().addAll( 55 new FileChooser.ExtensionFilter("イメージファイル", "*.jpg", "*.png")); 56 fileChooser.showOpenDialog(null); 57 } 58 }); 59 /* 60 画像を表示するためのレイアウトコード 61 */ 62 63 VBox imageBox = new VBox(); 64 imageBox.setAlignment(Pos.TOP_CENTER); 65 imageBox.setPadding(new Insets(30, 30, 30, 30)); 66 imageBox.getChildren().addAll(imageView); 67 68 /* 69 ボタン表示するためのレイアウトコード 70 */ 71 VBox hyouji = new VBox(); 72 hyouji.setAlignment(Pos.BOTTOM_CENTER);//中央下に表示 73 hyouji.setPadding(new Insets(30, 30, 30, 30)); 74 hyouji.getChildren().addAll(botan,imageBox); 75 stage.setScene(new Scene(hyouji)); 76 stage.show(); 77 } 78 79 /** 80 * @param args the command line arguments 81 */ 82 public static void main(String[] args) { 83 launch(args); 84 } 85 86} 87

(追記)
すいません。botanとimageBOxの順番を入れ替えたら、ボタンの上のほうに表示することができましたが、今度は上の部分に空白が空いてしまいました。これを埋めるにはどうすればいいのでしょうか?


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

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

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

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

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

KSwordOfHaste

2017/01/22 09:36

コードの字下げが乱れているのでそれを直すことをお勧めします。質問のコードが見やすくなっている方がよいと思いますので。また一部おかしな文字列を誤ってペースト(?)してしまってます。それも併せて訂正したほうがいいですよ。
mr0237

2017/01/22 09:56

すいません。修正しました。
guest

回答2

0

ベストアンサー

VBoxは子供ノードを追加した順番に上から下へ並べます。一番簡単な対応としてはVBox上に配置する子供の追加順番をイメージ、ボタンの順番にすればよいと思います。


追記:

空白部分が空いた原因

VBoxの親はSceneになりますが、Sceneの大きさに対する制約(prefWidthPropertyなど)が特に指定されていないのでStageの大きさとSceneの大きさは同じになります。さてVBoxは子供であるButtonとImageViewの大きさによって決まるので、以下の関係になります。

Sceneの大きさ>VBoxの大きさ

こうしたときSceneのどこにVBoxを配置するかを決める制約一つがalignmentになります。それをsetAlignmentで「中央下」と指定しているので指定どおりになったわけです。

投稿2017/01/22 10:02

編集2017/01/22 11:02
KSwordOfHaste

総合スコア18394

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

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

mr0237

2017/01/22 10:31

でもこれ追加順番をイメージ、ボタンの順番になってますよ? どこを修正したらいいのですか?
KSwordOfHaste

2017/01/22 10:53

もう解決したと思いますが、元のコードではaddAllの順番がButton, IamgeViewの順だったということでね(MasashiKimuraさんが回答されているとおりです)
mr0237

2017/01/31 10:34

遅くなり申し訳ございませんでした。どうもありがとうこざいました。
guest

0

Java

1 hyouji.getChildren().addAll(imageBox, botan); // ←入れ替え

試していないですが、上のように botan と imageBOx の順番を入れ替えるとうまく行くかもしれません。

投稿2017/01/22 09:55

MasashiKimura

総合スコア1150

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

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

mr0237

2017/01/22 10:00

やってみたらできましたが、今度は上の部分が空白が開いてしまいました。これを埋めるにはどうすればいいのでしょうか? ※また画像を上げます。
KSwordOfHaste

2017/01/22 10:28

hyouji.setAlignment(Pos.BOTTOM_CENTER);//中央下に表示 これが原因だと思いますよ~ Stageの大きさを固定にしているので、SceneもStageの大きさにあわされ、VBoxがSceneに対して「画面下の中央に位置付けられる」結果になると思います。これをPos.CENTERとかにしてみたらどうでしょう?
mr0237

2017/01/22 10:38

やってみたら空白部分がなくなりました。どうもありがとうこざいました。 それで、空白部分が空いた原因を上記のではわかりづらいので、もっとわかりやすく説明してくれませんか?
KSwordOfHaste

2017/01/22 11:05

回答の方へ追記しておきました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問