2

私はかなり新しい Java プログラマーです。ゼロから始めて約 5 週間の経験しかありません。Scene Builder で作成された javafx fxml ファイルがコントローラー クラスと同じフォルダーにない場合、正しくロードするのに問題があります。

私は使っている

Win7x64 running jre7x86 for this build

Eclipse Juno Service Release 1
Build id: 20120920-0800

jre version 1.7.0_07

javaFx version 2.2.1-b03

SceneBuilder version 1.0-b50

私のシーンローダーコードは

private static final String RESOURCE_PATH = "/resources/";
public static Stage buildStage(@SuppressWarnings("rawtypes") Class pClass,
         String stageTitle, String resourceLocation)
   {
      Stage temp = new Stage();
      Pane page = null;
      try
      {
         page = FXMLLoader.load(pClass.getResource(RESOURCE_PATH + resourceLocation), null,
               new JavaFXBuilderFactory());
      }
      catch (IOException e)
      {
         e.printStackTrace();
      }
      Scene scene = new Scene(page);
      temp.setScene(scene);
      temp.setTitle(stageTitle);
      temp.setResizable(false);
      return temp;
   }

プロジェクトディレクトリは/workspace/projectName/理論的には、相対パスが与えられていればローダーはファイルを見つけられるはずです 私が得ているエラーは

Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:403)
    at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:47)
    at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:115)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException: Location is required.
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2737)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2721)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2707)
    at outofunit.system.StageFactory.buildStage(StageFactory.java:32)
    at outofunit.desktop.ArcMaster.start(ArcMaster.java:28)
    at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319)
    at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:206)
    at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:173)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
    at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73)
    ... 1 more

ローダーにも絶対パスを指定しようとしましたが、同じディレクトリに直接ないものは受け入れられません。私はこれを理解しようとして、ここでストローをつかんでいます。

私は自分でこれを調査しようとしましたが、あまり得られませんでした.類似しているように見えるいくつかの答えは役に立たなかったようです. それらは、JavaFX 2.0 のイベント ハンドラーを使用した fxml ファイルの読み込みに失敗しJavaFX 2.0 FXML リソースの読み込みエラーです。

私の仲間は、このコードを使用してこの問題を克服することができました

public void load(String pFileName, Stage pStage, String pTitle)
   {
      String fName = RESOURCE_PATH + pFileName;

      try
      {
         String externalForm = getClass().getResource(fName)
            .toExternalForm();

         InputStream inStream = new URL(externalForm).openStream();

         FXMLLoader loader = new FXMLLoader();
         Pane p = (Pane)loader.load(inStream);

         pStage.setTitle(pTitle);
         pStage.setScene(new Scene(p));

         mWindowControl = loader.getController();
         mWindowControl.setUp(pStage);

         pStage.show();
      }
      catch (Exception e)
      {
         e.printStackTrace();
      }
   }

最大の違いと、私が彼のコードを使用していない理由は、ルート ペインが通常のペインではなくアンカー ペインであり、彼の方法で URL インストリームが通常のペインを強制するためです。通常のペインをベースとして使用しないのは私に責任がありますか? 皆さんが提供できる助けや情報があれば幸いです。ありがとうございました。

編集:この問題に取り組んできたので、エラーメッセージが変更されました。

コードをこれに変更しました

private final String RESOURCE_PATH = "resources/";
public void load(String pFileName, Stage pStage, String pTitle)
   {
      String fName = RESOURCE_PATH + pFileName;

      Pane page = null;

      FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(fName));

      try
      {
         page = (Pane) fxmlLoader.load();
      }
      catch (IOException exception)
      {
         throw new RuntimeException(exception);
      }

      Scene scene = new Scene(page);
      pStage.setScene(scene);
      pStage.setTitle(pTitle);

      mWindowControl = fxmlLoader.getController();
      mWindowControl.setUp(pStage);

      pStage.show();
   }

しかし、私が今得ているエラーは

java.lang.IllegalStateException: Location is not set.
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2021)
    at outofunit.desktop.WindowLoader.load(WindowLoader.java:136)
    at outofunit.desktop.WindowLoader.load(WindowLoader.java:62)
    at outofunit.desktop.ArcMaster.start(ArcMaster.java:30)
    at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319)
    at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:206)
    at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:173)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
    at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73)
    at java.lang.Thread.run(Unknown Source)

場所が設定されていない理由がわかりません

4

2 に答える 2

7

これはパスの問題です。Java は、パッケージ階層からファイルを取得する場所を知る必要があります。したがって、を使用"/package1/resourcename.fxml"すると、ツリーのルートからソースを見つける必要があります。"/"すでにパッケージ ツリーの最上位にいるため、通常は開始時に を省略します。

于 2013-12-27T05:02:03.053 に答える
4

どちらの例外も、「ロードしようとしている (FXML) ファイルが、指定した場所に見つかりません」と表示されます。ファイル名またはそのパスが間違っています。パッケージ構造、または少なくともload(String pFileName, Stage pStage, String pTitle)メソッドを含むクラス ファイルのパスとロードする FXML ファイルのパスを指定します。の javadoc API を読んで、getResource()それに関するサンプル コードをネットで調べてください。

于 2012-12-10T17:29:55.847 に答える