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

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

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

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

Java

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

Q&A

解決済

1回答

2409閲覧

JavaFXにてボタンを押してダイアログを表示することはできたが、今度は画像が表示されない

mr0237

総合スコア164

JavaFX

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

Java

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

0グッド

0クリップ

投稿2017/02/10 13:31

編集2017/02/12 03:36

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

Java

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

(追記)すいません。違うソースコードを上げてしまいました。アップしたのでよろしくお願いします。

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

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

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

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

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

KSwordOfHaste

2017/02/10 14:26

mr0237さんの質問のコードは字下げが毎回乱れているのですが(^^; も少し字下げを配慮したほうがいいと思います。
guest

回答1

0

ベストアンサー

コードが違ってたようなので改めてコメントします
fisをcloseしてからImageをfisから作っているように見えます。

java

1File file = dialog.showOpenDialog(); 2try (FileInputStream fis = new FileInputStream(file)) { 3 image = new Image(fis); 4 ImageView imageView = new Image(image); 5 ... 6}

のようにしかるべき場所でImageを作れば解決すると思います。

なおJava7からtry-resource文が利用できますのでこれをうまく利用してはいかがでしょう?

java

1class XX implements AutoClosable { } 2 3try (XX x = new XX(...)) { 4 // x の有効範囲(スコープ)はtryブロックの中だけ 5} 6// tryブロックのスコープ外に出るとxは自動的にcloseされる 7...

try-resourceを使うと明示的にcloseする必要もなくストリームを保持する変数の有効範囲(tryブロック)を抜けると同時に確実にcloseするようなコードを表現できます。こうすると今回の問題のように「変数が参照可能な場所(スコープ内)で実際にはcloseされてしまっているストリームを誤って参照してしまう」といったようなバグの可能性を排除できます。


コード変更前の回答:

filepathに何も代入しないまま new FileInputStream(filepath)しているように見えます。これだとNull Pointer Exceptionが発生するような気がします。

今度は画像が表示されません

もしNPEが発生しているなら「画像が表示されない」ではなくNPEがこの行で発生すると書いた方がよいと思います。

投稿2017/02/10 14:31

編集2017/02/12 07:07
KSwordOfHaste

総合スコア18394

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

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

mr0237

2017/02/12 07:26

うまくいきました。ありがとうこざいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問