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

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

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

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

Java

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

Q&A

1回答

4028閲覧

JavaFXにて既存の画像がある場合は、次に画像を読み込む際はその画像をクリアしてからダイアログから新たに選択した画像を表示させたい

mr0237

総合スコア164

JavaFX

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

Java

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

0グッド

0クリップ

投稿2017/02/12 11:47

編集2022/01/12 10:55

JAVAの初心者です。練習でJavaFXを使って既に読み込んである画像をクリアして新たにダイアログから選択した画像を表示させるプログラムを作成しているのですが、どのようにコードを書いたらベストなのか(初心者なので)思いつきません。

if文を使って書こうと思いますが、なんか他に良いのが思いつきません。ネットで探しても見つかりませんでした。

なんかいいアドバイスがあったら教えてください。よろしくお願いします。

いままでできたソースコードを上げておきます

Java

1package rensyuuyou; 2 3import java.io.*; 4import java.util.logging.Level; 5import java.util.logging.Logger; 6 7import javafx.application.Application; 8import javafx.event.ActionEvent; 9import javafx.event.EventHandler; 10import javafx.geometry.Insets; 11import javafx.geometry.Pos; 12import javafx.scene.Scene; 13import javafx.scene.control.Button; 14import javafx.scene.layout.VBox; 15import javafx.stage.Stage; 16import javafx.stage.FileChooser; 17import javafx.scene.image.Image; 18import javafx.scene.image.ImageView; 19import javafx.stage.FileChooser; 20import javafx.scene.control.Alert; 21 22 23public class Rensyuuyou extends Application { 24 25 String filepath; 26 VBox imageBox = new VBox(); 27 28 29 @Override 30 public void start(Stage stage) { 31 stage.setTitle("練習用"); 32 stage.setWidth(2000); 33 stage.setHeight(1000); 34 35 Button botan = new Button("画像表示"); 36 botan.setPrefSize(900, 30); 37 botan.setOnAction(new EventHandler<ActionEvent>() { 38 39 @Override 40 public void handle(ActionEvent event) { 41 42 FileChooser fileChooser = new FileChooser(); 43 fileChooser.setTitle("画像を開く"); 44 fileChooser.getExtensionFilters().addAll( 45 new FileChooser.ExtensionFilter("イメージファイル", "*.jpg", "*.png")); 46 File file = fileChooser.showOpenDialog(stage); 47 filepath = file.getAbsolutePath(); 48 /* 49 画像を表示する 50 */ 51 FileInputStream fis = null; 52 try{ 53 fis = new FileInputStream(filepath); 54 }catch(IOException e){ 55 Alert keikoku = new Alert(Alert.AlertType.ERROR); 56 keikoku.setContentText("ファイルが読み込めません"); 57 58 59 }finally{ 60 if(fis != null){ 61 try { 62 } catch (Exception e) { 63 } 64 } 65 } 66 Image image = new Image(fis); 67 ImageView imageView = new ImageView(image); 68 imageView.setFitHeight(500); 69 imageView.setFitWidth(1000); 70 71 imageBox.setAlignment(Pos.TOP_CENTER); 72 imageBox.setPadding(new Insets(40, 40, 40, 40)); 73 imageBox.getChildren().addAll(imageView); 74 75 } 76 }); 77 VBox hyouji = new VBox(); 78 hyouji.setAlignment(Pos.CENTER); 79 hyouji.setPadding(new Insets(30, 30, 30, 30)); 80 hyouji.getChildren().addAll(imageBox,botan); 81 82 stage.setScene(new Scene(hyouji)); 83 stage.show(); 84 85 86 87 } 88 89 public static void main(String[] args) { 90 launch(args); 91 } 92 93}

(追記)
すいません。どこの部分を変えたらいいのでしょうか? 具体的にどのように書けばいいのでしょうか? よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ImageViewはイメージを生成する際に作るのではなく、初めから作ってしまう方法が簡単かと思います。表示すべきImageを指定しなくてもImageView自体は生成でき、そのまま画面上に配置してかまいません。...(A)

またImageViewへのImageの設定は、そのImageViewに画像が指定ずみであってもなくても気にする必要はありません。単に表示させたいImageを好きな時に設定してやりさえすればOKです。...(B)
画面の更新はJavaFXランタイムが自動的に行ってくれます。

大雑把にいえばJavaFXは画面に表示すべきもの(この場合はImage)をプロパティーへ設定しさえすれば画面の更新はプログラマーが気にしなくても自動的に行われます。その辺りは古いGUIシステムであるswingと使い勝手が大きく異なる点といえましょう。


追記:簡単にコードで表すと次のようなイメージになります。
質問者さんはif文による切り分けが必要と考えておられたようですが、そのような必要はありません。

java

1public class Rensyuuyou extends Application { 2 VBox imageBox = new VBox(); 3 ImageView imageView = new ImageView(); 4 5 @Override 6 public void start(Stage stage) { 7 ... 8 imageBox.getChildren().add(imageView); // <=「上の回答の(A)」 9 button.setOnAction(this::onOpenButton); // <=※メソッド参照(後述) 10 ... 11 } 12 13 void onOpenButton(ActionEvent event) { 14 // FileChooserでファイルを選びそこからイメージを生成する 15 // 以降の処理は初回のボタンクリックでも2回目以降のボタンクリックでも処理を 16 // 変える必要はない。 17 Image image = ...; 18 imageView.setImage(image); // <= 「上の回答の(B)」 19 ... 20 } 21}

※メソッド参照:
本件とは関係ないことですがボタンへのアクションハンドラーの設定コードをメソッド参照を用いる方法に書き換えました。メソッド参照やlambda式はJava8以降でしか使えませんが、JavaFXを使うならJava8以降が推奨バージョンだと思いますのでlambda式やメソッド参照を用いすっきりしたコードにすることをお勧めしたいと思いこうしました。

投稿2017/02/12 13:28

編集2017/02/16 00:39
KSwordOfHaste

総合スコア18392

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

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

mr0237

2017/02/13 13:56

すいません。言っている意味が分かりません。つまり、Imageクラスを書く必要はないということでしょうか?
KSwordOfHaste

2017/02/13 14:46

「大雑把にいえばJavaFXは画面に表示すべきもの(この場合はImage)をプロパティーへ設定しさえすれば」という説明が混乱されたのでしょうか?自分が申し上げたかったのは、 「ImageViewのインスタンスは最初から生成して画面上へ配置しておく」 「ファイルからImageのインスタンスを生成したら、それが初回でも2回目でも処理を変える必要はなく単にImageViewのimageプロパティーへ設定すればよい」 ということです。
mr0237

2017/02/15 14:25

すいません。似た質問になりますが、具体的にどこの部分をどのように書けばいいのでしょうか? よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問