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

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

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

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

Java

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

FXML

FXMLは、JavaFXに用意されているXMLベースのGUI記述言語です

Q&A

解決済

1回答

4241閲覧

Scene builderを使いJavaFxで画像を表示させたいのですがエラーが出て困ってます

asakuta

総合スコア100

JavaFX

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

Java

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

FXML

FXMLは、JavaFXに用意されているXMLベースのGUI記述言語です

0グッド

0クリップ

投稿2019/06/12 06:06

編集2019/06/12 07:58

前提・実現したいこと

Scene builderを使いJavaFxで画像を表示させたいのですがエラーが出て困ってます
画像はJavaやfxmlと同じパスに入ています

発生している問題・エラーメッセージ

java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found at javafx.scene.image.Image.validateUrl(Image.java:1118) at javafx.scene.image.Image.<init>(Image.java:620) at application.Main.start(Main.java:21) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$166(LauncherImpl.java:863) at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$179(PlatformImpl.java:326) at com.sun.javafx.application.PlatformImpl.lambda$null$177(PlatformImpl.java:295) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl.lambda$runLater$178(PlatformImpl.java:294) at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.lambda$null$152(WinApplication.java:177) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found at javafx.scene.image.Image.validateUrl(Image.java:1110) ... 11 more

該当のソースコード

java

1package application; 2import javafx.application.Application; 3import javafx.stage.Stage; 4import javafx.scene.Group; 5import javafx.scene.Scene; 6import javafx.scene.image.Image; 7import javafx.scene.image.ImageView; 8import javafx.scene.layout.AnchorPane; 9import javafx.fxml.FXML; 10import javafx.fxml.FXMLLoader; 11 12public class Main extends Application { 13 @FXML 14 private ImageView Image_Back; 15 16 @Override 17 public void start(Stage primaryStage) { 18 try { 19 AnchorPane root = (AnchorPane) FXMLLoader.load(getClass().getResource("Sample.fxml")); 20 Scene scene = new Scene(root); 21 22 Image image = new Image("back.jpg"); 23 ImageView iv = new ImageView(image); 24 iv.setImage(image); 25 26 Image image2 = new Image("money_okanemochi.png"); 27 ImageView iv2 = new ImageView(image2); 28 iv2.setImage(image2); 29 30 scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 31 primaryStage.setScene(scene); 32 primaryStage.show(); 33 } catch (Exception e) { 34 e.printStackTrace(); 35 } 36 } 37 38 public static void main(String[] args) { 39 launch(args); 40 } 41} 42

fxml

1<?xml version="1.0" encoding="UTF-8"?> 2 3<?import javafx.scene.control.Button?> 4<?import javafx.scene.image.Image?> 5<?import javafx.scene.image.ImageView?> 6<?import javafx.scene.layout.AnchorPane?> 7 8<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.SampleController"> 9 <children> 10 <ImageView fitHeight="403.0" fitWidth="659.0" layoutX="-48.0" layoutY="-1.0" pickOnBounds="true"> 11 <image> 12 <Image url="@back.jpg" /> 13 </image> 14 </ImageView> 15 <ImageView fitHeight="362.0" fitWidth="494.0" layoutX="66.0" layoutY="21.0" pickOnBounds="true" preserveRatio="true"> 16 <image> 17 <Image url="@money_okanemochi.png" /> 18 </image> 19 </ImageView> 20 <Button layoutX="268.0" layoutY="225.0" mnemonicParsing="false" prefHeight="31.0" prefWidth="63.0" text="スタート" /> 21 <Button layoutX="269.0" layoutY="279.0" mnemonicParsing="false" prefHeight="31.0" prefWidth="63.0" text="終了" /> 22 </children> 23</AnchorPane> 24

試したこと

パスを変えたり、絶対パスで指定したが表示できませんでした。

補足情報(FW/ツールのバージョンなど)

JavaFX Scene Builder 8.5.0

追記

全てのファイル階層を追記いたします
src
└application
├ Main.java
├ SampleController.java
├ Sample.fxml
├ back.jpg(使いたい画像)
├ money_okanemochi.png(使いたい画像)
└ application.css

SampleController.javaの中には何も記述していません

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

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

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

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

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

KSwordOfHaste

2019/06/12 06:17 編集

srcの下の全てのファイルを階層がわかるようにして質問に追記ください。 本件には関係が薄いと思いますが一応SampleController.javaの内容も追記しておいた方がよいと思います。(Eclipseをお使いであると想定しています。srcの下ってのが何を意味するかおわかりと思います)
asakuta

2019/06/12 07:18

追記いたしました
KSwordOfHaste

2019/06/12 07:50

Main.javaの先頭には package application; と書いてあるはずですが質問に転記しわすれているのですよね?追記しておいてください。
asakuta

2019/06/12 07:58

申し訳ありません追記いたしました
guest

回答1

0

ベストアンサー

色々質問に注文をつけてしまいましたが・・・

問題の原因はMain.javaにあるImageコンストラクターの引数urlの指定の誤りです。ここ少々わかりにくくAPIリファレンスを見てもすぐに気づきにくいですね。

new Image("back.jpg")
ではなく、正しくは
new Image("application/back.jpg")
と書かねばならないのです。JavaFX関連クラスでURLを文字列として相対指定するとベースとなる場所はデフォルトパッケージの場所になります。


Imageを生成する処理が書いてあるメソッドはあなたが書いたapplication.Mainクラスのmainメソッドです。そのメソッドが定義されているクラスのパッケージはapplicationですが、呼び出された側のImageクラスの立場にたってみますと自分がどのパッケージのどのクラスのどのメソッドから呼び出されたかによってURLの位置のベースを左右するような芸当は(技術的に不可能ではないですが)やりたくないわけで、アプリケーション全体のコードベースを起点として相対位置として解釈するようになっているのだと思います。

一方getClass().getResource("xxx")のgetResourceメソッドの場合は意味が違っていて、クラスのパッケージの場所からの相対になります。
このメソッドの目的は「このクラス用のリソースをアクセスするためのURLを生成する」といえ、「このクラスのパッケージを起点とする仕様が自然」と考えられたのだと思います。

投稿2019/06/12 08:42

編集2019/06/12 22:29
KSwordOfHaste

総合スコア18394

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

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

asakuta

2019/06/12 23:58

無事表示できました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問