teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2017/02/16 00:39

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,5 +1,36 @@
1
- ImageViewはイメージを生成する際に作るのではなく、初めから作ってしまう方法が簡単かと思います。表示すべきImageを指定しなくてもImageView自体は生成でき、そのまま画面上に配置してかまいません。
1
+ ImageViewはイメージを生成する際に作るのではなく、初めから作ってしまう方法が簡単かと思います。表示すべきImageを指定しなくてもImageView自体は生成でき、そのまま画面上に配置してかまいません。**...(A)**
2
2
 
3
- またImageViewへのImageの設定は、そのImageViewに画像が指定ずみであってもなくても気にする必要はありません。単に表示させたいImageを好きな時に設定してやりさえすればOKです。画面の更新はJavaFXランタイムが自動的に行ってくれます。
3
+ またImageViewへのImageの設定は、そのImageViewに画像が指定ずみであってもなくても気にする必要はありません。単に表示させたいImageを好きな時に設定してやりさえすればOKです。**...(B)**
4
+ 画面の更新はJavaFXランタイムが自動的に行ってくれます。
4
5
 
5
- 大雑把にいえばJavaFXは画面に表示すべきもの(この場合はImage)をプロパティーへ設定しさえすれば画面の更新はプログラマーが気にしなくても自動的に行われます。その辺りは古いGUIシステムであるswingと使い勝手が大きく異なる点といえましょう。
6
+ 大雑把にいえばJavaFXは画面に表示すべきもの(この場合はImage)をプロパティーへ設定しさえすれば画面の更新はプログラマーが気にしなくても自動的に行われます。その辺りは古いGUIシステムであるswingと使い勝手が大きく異なる点といえましょう。
7
+
8
+ ---
9
+
10
+ 追記:簡単にコードで表すと次のようなイメージになります。
11
+ 質問者さんはif文による切り分けが必要と考えておられたようですが、そのような必要はありません。
12
+ ```java
13
+ public class Rensyuuyou extends Application {
14
+ VBox imageBox = new VBox();
15
+ ImageView imageView = new ImageView();
16
+
17
+ @Override
18
+ public void start(Stage stage) {
19
+ ...
20
+ imageBox.getChildren().add(imageView); // <=「上の回答の(A)」
21
+ button.setOnAction(this::onOpenButton); // <=※メソッド参照(後述)
22
+ ...
23
+ }
24
+
25
+ void onOpenButton(ActionEvent event) {
26
+ // FileChooserでファイルを選びそこからイメージを生成する
27
+ // 以降の処理は初回のボタンクリックでも2回目以降のボタンクリックでも処理を
28
+ // 変える必要はない。
29
+ Image image = ...;
30
+ imageView.setImage(image); // <= 「上の回答の(B)」
31
+ ...
32
+ }
33
+ }
34
+ ```
35
+ ※メソッド参照:
36
+ 本件とは関係ないことですがボタンへのアクションハンドラーの設定コードをメソッド参照を用いる方法に書き換えました。メソッド参照やlambda式はJava8以降でしか使えませんが、JavaFXを使うならJava8以降が推奨バージョンだと思いますのでlambda式やメソッド参照を用いすっきりしたコードにすることをお勧めしたいと思いこうしました。