61

menuItem が選択されているときに、現在のシーンを閉じて別のシーンを開こうとすると問題が発生します。私のメインステージは次のようにコーディングされています:

public void start(Stage primaryStage) throws Exception {
    primaryStage.setTitle("Shop Management");
    FXMLLoader myLoader = new FXMLLoader(getClass().getResource("cartHomePage.fxml"));

    Pane myPane = (Pane) myLoader.load();

    CartHomePageUI controller = (CartHomePageUI) myLoader.getController();

    controller.setPrevStage(primaryStage);
    Scene myScene = new Scene(myPane);
    primaryStage.setScene(myScene);
    primaryStage.show();
}

プログラムが実行されると、cartHomePage.fxml に移動します。そこから、メニュー項目が選択されたときに、製品の作成またはカテゴリの作成を選択できます。これが私のアクションイベントです:

Stage prevStage;

public void setPrevStage(Stage stage){
     this.prevStage = stage;
}

 public void gotoCreateCategory(ActionEvent event) throws IOException {
  Stage stage = new Stage();
    stage.setTitle("Shop Management");
    FXMLLoader myLoader = new FXMLLoader(getClass().getResource("createCategory.fxml"));
    Pane myPane = (Pane) myLoader.load();            
    Scene scene = new Scene(myPane);
    stage.setScene(scene);
    prevStage.close();
    setPrevStage(stage);
    stage.show();       
}

//Method to change scene when menu item create product is on click
@FXML
public void gotoCreateProduct(ActionEvent event) throws IOException {
   Stage stage = new Stage();
    stage.setTitle("Shop Management");
    FXMLLoader myLoader = new FXMLLoader(getClass().getResource("creatProduct.fxml"));
    Pane myPane = (Pane) myLoader.load();            
    Scene scene = new Scene(myPane);
    stage.setScene(scene);
    prevStage.close();
    setPrevStage(stage);
    stage.show();      
}

ただし、ステージの切り替えは一度しかできません。たとえば、デフォルトのページは cartHomePage.fxml です。プログラムを実行すると、まずプロダクト ステージを作成します。その後、私はもうどこにも行けません。エラーメッセージは次のとおりです。

java.lang.IllegalStateException: Location is not set.
and Null Pointer Exception

ステージを閉じて回した後、ステージを設定しました。どの部分が間違っていたのだろうか。

前もって感謝します。

4

21 に答える 21

28

私はこの例外を受け取っていましたが、私が見つけた「解決策」は、単純に Netbeans IDE によるものでした:

  1. 右クリック→「クリーン&ビルド」
  2. プロジェクトを再度実行する

なぜこれがうまくいったのかわかりませんが、うまくいきました!

于 2014-01-04T10:56:27.020 に答える
21

シンプルな NetBeans 8 Java FXML アプリケーションを Maven 駆動型アプリケーションに変換しました。その後、getResource()メソッドが .fxml ファイルを見つけることができなかったため、問題が発生しました。私の元のアプリケーションでは、fxml はパッケージ ツリー全体に散らばっていました - それぞれがそのコントローラ クラス ファイルの横にありました。Clean を作成して NetBeans でビルドした後、結果の .jar をターゲット フォルダーで確認しました。.jar には fxml がまったく含まれていませんでした。すべての fxml が奇妙に消えました。

次に、すべての fxml を resources/fxml フォルダーに配置し、それに応じて getResource メソッドのパラメーターを設定します。たとえば、次のようにしますFXMLLoader(App.class.getClassLoader().getResource("fxml/ObjOverview.fxml")); 。この場合、すべて問題ありませんでした。fxml フォルダーは .jar のルートに表示され、すべての fxml が含まれていました。プログラムは期待どおりに機能していました。

于 2014-07-24T21:38:17.590 に答える
5

私は速くて簡単なことを試しました:

私は2つのパッケージを持っています->app.guiそしてapp.login

私のログインクラスではmainview.fxmlfromを使用してapp.guiいるので、これをlogin.fxml

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../gui/MainView.fxml"));

そしてそれは動作します:)

于 2015-11-10T09:37:52.450 に答える
5

JavaFX アプリケーションでも同じ問題が発生しました。さらに奇妙なことに、私の Windows 開発環境では、fxml ローダーですべてが正常に機能しました。しかし、Debian マシンでまったく同じコードを実行すると、「場所が設定されていません」という同様のエラーが発生しました。

ここですべての回答を読みましたが、実際に問題を「解決」しているようには見えませんでした。私の解決策は簡単でした。

getClass()メソッドによって、Java が混乱する可能性があります。何かが別のスレッドで実行されるか、クラスが何らかのインターフェースを実装している場合、getClass() メソッドによって返されるクラスとは異なるクラスになることがあります。この場合、creatProduct.fxml への相対パスは間違っているでしょう。なぜなら、あなたの "are" はあなたが思っているパスにないからです...

したがって、節約するために:より具体的にして、クラスで静的クラスフィールドを使用してみてください(YourClassHere.class に注意してください)。

@FXML
public void gotoCreateProduct(ActionEvent event) throws IOException {
   Stage stage = new Stage();
    stage.setTitle("Shop Management");
    FXMLLoader myLoader = new FXMLLoader(YourClassHere.class.getResource("creatProduct.fxml"));
    Pane myPane = (Pane) myLoader.load();            
    Scene scene = new Scene(myPane);
    stage.setScene(scene);
    prevStage.close();
    setPrevStage(stage);
    stage.show();      
}

これに気付いた後、私はいつもこのようにします。それが役立つことを願っています!

于 2015-09-08T20:46:40.153 に答える
2

私も同じ問題を抱えていました。

数分後、間違った場所から file.fxml をロードしようとしていたことがわかりました。

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/[wrong-path]/abc.fxml"));
fxmlLoader.setClassLoader(getClass().getClassLoader());
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
fxmlLoader.load();
于 2015-09-21T09:38:05.513 に答える
1

私は次のようなことを意味します:

FXMLLoader myLoader = null; Scene myScene = null; Stage prevStage = null;

public void start(Stage primaryStage) throws Exception {
  primaryStage.setTitle("Shop Management");
  myLoader = new FXMLLoader(getClass().getResource("cartHomePage.fxml"));
  Pane myPane = (Pane) myLoader.load();
  CartHomePageUI controller = (CartHomePageUI) myLoader.getController();
  controller.setPrevStage(primaryStage);
  myScene = new Scene(myPane);
  primaryStage.setScene(myScene);
  primaryStage.show();
}

その後

public void setPrevStage(Stage stage){
    this.prevStage = stage;
}

public void gotoCreateCategory(ActionEvent event) throws IOException {
    Stage stage = new Stage();
    stage.setTitle("Shop Management");
    myLoader = new FXMLLoader(getClass().getResource("createCategory.fxml"));
    Pane myPane = (Pane) myLoader.load();            
    Scene scene = new Scene(myPane);
    stage.setScene(scene);
// prevStage.close(); I don't think you need this, closing it will set preStage to null   put a breakpoint after this to confirm it
    setPrevStage(stage);
    stage.show();       
}

//Method to change scene when menu item create product is on click
@FXML
public void gotoCreateProduct(ActionEvent event) throws IOException {
    Stage stage = new Stage();
    stage.setTitle("Shop Management");
    myLoader = new FXMLLoader(getClass().getResource("creatProduct.fxml"));
    Pane myPane = (Pane) myLoader.load();            
    Scene scene = new Scene(myPane);
    stage.setScene(scene);
// prevStage.close(); I don't think you need this, closing it will set preStage to null put a breakpoint after this to confirm it
    setPrevStage(stage);
    stage.show();      
}

試してみて、教えてください。

于 2013-06-21T08:14:34.980 に答える
1

Intellij ユーザーの場合、私の問題は、fxml ファイル (src/main/resources) があったディレクトリが「リソース」ディレクトリとしてマークされていないことでした。

モジュール/プロジェクト設定を開き、[ソース] タブに移動し、ディレクトリにプロジェクト リソース ファイルが含まれていることを Intellij が認識していることを確認します。

于 2016-08-08T18:21:41.410 に答える
1

CsPeitch などによる以下の回答は、正しい軌道に乗っています。fxml ファイルがクラスの出力ターゲットにコピーされていることを確認してください。そうしないと、ランタイムはそれを確認できません。生成されたクラス ファイルのディレクトリを確認し、fxml があるかどうかを確認します。

于 2015-08-14T20:34:52.267 に答える
0

それは私に起こり、解決策を見つけました。起動行 ( ) を持つクラスとは異なるパッケージの .fxml ファイルを使用してプロジェクトをビルドしParent root = FXMLLoader.load(getClass().getResource("filenamehere.fxml"));、相対パスを使用すると、jar を実行したときに最初のウィンドウ以外のウィンドウが起動しません。短くするために、.fxml ファイルを起動するクラスと同じパッケージに配置し、このようなパス ("filenamehere.fxml") を設定すると、正常に動作するはずです。

于 2015-08-08T13:39:52.403 に答える
0

私は同じ問題に遭遇しました。プログラムは「実行」ボタンを介してEclipseからうまく実行されていましたが、以前にエクスポートした実行可能なJARからではありませんでした。私の解決策は次のとおりです。

1)メインクラスをデフォルトパッケージに移動

2) Eclipse の他のパスを設定し、JAR ファイルからの実行中に他のパスを設定します (これをMain.javaに貼り付けます) 。

public static final String sourcePath = isProgramRunnedFromJar() ? "src/" : "";
public static boolean isProgramRunnedFromJar() {
    File x = getCurrentJarFileLocation();
    if(x.getAbsolutePath().contains("target"+File.separator+"classes")){
        return false;
    } else {
        return true;
    }
}
public static File getCurrentJarFileLocation() {
        try {
            return new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
        } catch(URISyntaxException e){
            e.printStackTrace();
            return null;
        }
}

その後、startメソッドで次のようにファイルをロードする必要があります。

FXMLLoader loader = new FXMLLoader(getClass().getResource(sourcePath +"MainScene.fxml"));

e(fx)clipseプラグインを使用して Eclipse Mars で動作します。

于 2016-02-16T18:24:27.777 に答える