質問編集履歴

1 必要な情報を入力していなかったため

BOKETAMIAN

BOKETAMIAN score 3

2020/07/13 16:04  投稿

Scene builderを使いJavaFxで画像を表示させたいのですがエラーが出て困ってます
### 前提・実現したいこと
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
```
### 該当のソースコード
```Javafx
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);
   }
}
```
```java
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();
}
```
```java
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);
   }
}
```
```java
package model;
public class BaseModel {
}
```
###階層
src
  └application
    ├ Main.java
  └fxml
     ├ MainPage.fxml
     ├ application.css
     ├ MainPage.css
  └model
     ├ BaseModel.java
  └view
     ├ BaseView.java
    ├ MainPageView.java
     ├ MainPageView.java
     ├vegetable.jpg
     
### 試したこと
パスを変えたり絶対パスで指定しました。
 
vegetable.jpgのファイル位置を変えました  
### 補足情報(FW/ツールのバージョンなど)
JavaFX Scene Builder 11.0.0
JavaSE-11
ここにより詳細な情報を記載してください。
  • Java

    21849 questions

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

  • JavaFX

    637 questions

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

  • FXML

    45 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る