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

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

ただいまの
回答率

88.93%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 233

BOKETAMIAN

score 3

前提・実現したいこと

SceneBuilderでImageViewに画像を表示させたいです。

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

BaseView:NextView() 例外発生
java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found
    at javafx.graphics/javafx.scene.image.Image.validateUrl(Image.java:1107)
    at javafx.graphics/javafx.scene.image.Image.<init>(Image.java:617)
    at view.MainPageView.Init(MainPageView.java:16)
    at view.BaseView.NextView(BaseView.java:86)
    at application.Main.start(Main.java:38)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found
    at javafx.graphics/javafx.scene.image.Image.validateUrl(Image.java:1099)
    ... 13 more

該当のソースコード

package application;

import javafx.application.Application;
import javafx.stage.Stage;
import model.BaseModel;
import view.BaseView;
import view.MainPageView;

/***********************************
 * 初期起動クラス
 ***********************************/
public class Main extends Application {

    /***********************************
     * 画面の初期設定を行う
     * @Param primaryStage
     ***********************************/
    @Override
    public void start(Stage primaryStage) {
        try{
            BaseView.setSTAGE(primaryStage); //ステージを保持させる
            //最初のページの表示処理


            MainPageView mpv = new MainPageView("MainPage.fxml");
            mpv.NextView(new BaseModel());




        }catch(Exception e){
            System.out.println("Main:start() 例外発生");
            e.printStackTrace();
        }
    }

    /***********************************
     * 最初に呼ばれるメソッド
     * @param args    //コマンドライン
     ***********************************/
    public static void main(String[] args) {
        launch(args);
    }
}
package view;

import java.util.HashMap;
import java.util.Map;

import javafx.collections.ObservableList;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import model.BaseModel;

/***********************************
 * ビューのベースとなるクラス
 ***********************************/
public abstract class BaseView<T extends Pane> {
    static private Stage    STAGE        ;    //ステージクラス
    private BaseModel m_SendParam         ;    //画面遷移時のパラメータ引き渡し用クラス
    private Map<String,Node> m_objectList ;//オブジェクトの配列
    private final String PAGE_FILENAME ;    //fxmlのファイル名
    private T m_pane ;                        //ページのデータ
    /***********************************
     * コンストラクタ
     * @param i_fileName //ファイル名
     ***********************************/
    public BaseView(String i_fileName ){
        PAGE_FILENAME = i_fileName ;
        m_objectList = new HashMap<String,Node>();
    }

    /***********************************
     * ステージを設定する
     * @param i_STAGE
     ***********************************/
    static public void setSTAGE(Stage i_STAGE){
        STAGE=i_STAGE;
    }

    /***********************************
     * 遷移時のパラメータを渡す
     * @return m_SendParam
     ***********************************/
    public BaseModel getParam(){
        return m_SendParam;
    }

    /***********************************
     * ページ遷移処理
     * @param i_Model //引き渡しをしたいデータ
     ***********************************/
    public void NextView( BaseModel i_Data){
        try {

            //データを設定
            m_SendParam = i_Data ;

            //ページを作成
            m_pane =  FXMLLoader.load(getClass().getResource( "../fxml/" + PAGE_FILENAME));

            AnchorPane pane = (AnchorPane)m_pane;



            //Sceneの設定
            Scene scene = new Scene(m_pane,pane.getMaxHeight() , pane.getMaxWidth());
            scene.getStylesheets().add("fxml/application.css");
            STAGE.setTitle("WiZ Sample");
            STAGE.setScene(scene);
            STAGE.show();

            //オブジェクトの取得
            ObjectSet(m_pane.getChildren());

            //初期化処理
            Init();

        } catch(Exception e) {
            System.out.println("BaseView:NextView() 例外発生");
            e.printStackTrace();
        }
    }

    /***********************************
     * ページの配置オブジェクトを取得する
     * @param i_date    //ページのオブジェクト配列を取得(ページ変数.getChildren())
     **********************************/
    public void ObjectSet( ObservableList<Node> i_date) {
        //データを配置
        for( Node object : i_date) {
            m_objectList.put(object.getId(), object);
        }
    }

    /***********************************
     * 配置オブジェクトを取得
     * @param i_objectName    //fx:idの名前を指定
     * @return 指定のオブジェクトを取得 取得できなければnullが返る
     **********************************/
    public Node getObject(String i_objectName) {
        return m_objectList.get(i_objectName) ;
    }

    /***********************************
     * ページのインスタンスを渡す
     * @return
     **********************************/
    public T getPane() {
        return m_pane ;
    }

    /***********************************
     * 初期化処理
     **********************************/
     abstract public void Init();

}
package view;

import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;

public class MainPageView extends BaseView<AnchorPane> {

    public MainPageView(String i_fileName) {
        super(i_fileName);
    }

    @Override
    public void Init() {

        Image image = new Image("vegetable.jpg");

        ImageView imageview = (ImageView) getObject("imageview");
        imageview.setImage(image);

    }

}
package model;

public class BaseModel {

}

階層

src
└application
├ Main.java
└fxml
├ MainPage.fxml
├ application.css
├ MainPage.css
└model
├ BaseModel.java
└view
├ BaseView.java
├ MainPageView.java
├vegetable.jpg

試したこと

パスを変えたり絶対パスで指定しました。

vegetable.jpgのファイル位置を変えました

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

JavaFX Scene Builder 11.0.0

JavaSE-11

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

エラーの原因は、指定されたURLのリソースがみつからなかったこと。JavaFX以前のはなしです。

java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found

発生元は、この行。

Image image = new Image("vegetable.jpg");

明記されているかぎり、リソースファイルvegetable.jpgの在り処は、ここ。

src
└view
├ BaseView.java
├ MainPageView.java
├vegetable.jpg

srcディレクトリに、リソースを置いても、srcディレクトリを、ふつうはclasspathに設定はしませんから、見つけられないのでしょう。classpathを設定した場所、たとえば、classファイルの在り処に、リソースファイルを置かれてはいかがでしょうか。たとえば。

classes
└view
├ BaseView.class
├ MainPageView.class
├ vegetable.jpg

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/14 16:10

    JavaFX以前の問題だったとは...
    ありがとうございました。初心者ながらこれからも頑張っていこうとおもいます
    本当にありがとうございました。

    キャンセル

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る