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();
}
ただし、ステージを切り替えることができるのは1回だけです。たとえば、デフォルトのページはcartHomePage.fxmlです。プログラムを実行するとき、最初に製品ステージの作成に進みます。その後、私はもうどこにも行けません。エラーメッセージは次のとおりです。
Java.lang.IllegalStateException: Location is not set.
and Null Pointer Exception
ステージを閉じてから渡しました。どの部分が間違っていたのだろうか。
前もって感謝します。
この問題があり、この投稿を見つけました。私の問題は単なるファイル名の問題でした。
FXMLLoader(getClass().getResource("/com/companyname/reports/" +
report.getClass().getCanonicalName().substring(18).replaceAll("Controller", "") +
".fxml"));
Parent root = (Parent) loader.load();
これがすべてのXMLであり、クラスがWordコントローラーを除いたfxmlファイルと同じであることを確認しました。
部分文字列を台無しにしたので、パスが間違っていました...動作するファイル名を修正した後は十分確認してください。
長い話を短くするために、問題はファイル名が不適切に命名されているか、パスが間違っていることだと思います。
追加:私はその後Mavenプロジェクトに移動しました。 Maven以外の方法は、プロジェクトパス内にすべてを含めることです。以下の回答にリストされているMavenの方法は、最初は少しイライラしましたが、次のようにコードを変更しました:
FXMLLoader loader = new FXMLLoader(ReportMenu.this.getClass().getResource("/fxml/" + report.getClass().getCanonicalName().substring(18).replaceAll("Controller", "") + ".fxml"));
私はこの例外を受け取っていましたが、見つけた「解決策」はNetbeans IDEを通じてでした。
わからない[〜#〜] why [〜#〜]これはうまくいきましたが、うまくいきました!
単純なNetBeans 8 Java FXMLアプリケーションをMaven駆動のアプリケーションに変換しました。その後、getResource()
メソッドが.fxmlファイルを見つけられなかったため、問題が発生しました私の元のアプリケーションでは、fxmlがパッケージツリー全体に散らばっていました-それぞれがコントローラークラスファイルの横にあります。すべてのfxmlが不思議なことに消えました。
次に、すべてのfxmlをresources/fxmlフォルダーに入れ、それに応じてgetResourceメソッドのパラメーターを設定します。例:FXMLLoader(App.class.getClassLoader().getResource("fxml/ObjOverview.fxml"));
この場合、すべて正常に実行されました。 fxmlフォルダーは.jarのルートに表示され、すべてのfxmlが含まれていました。プログラムは期待どおりに機能していました。
私はこれが遅い回答であることを知っていますが、この問題を抱えている他の人を助けたいと思っています。同じエラーが発生し、ファイルパスの前に/
を挿入する必要があることがわかりました。修正された関数呼び出しは次のようになります。
FXMLLoader myLoader = new FXMLLoader(getClass().getResource("/createCategory.fxml"));
// ^
私は速くて簡単なことを試しました:
2つのパッケージがあります-> app.gui
およびapp.login
ログインクラスでは、mainview.fxml
from app.gui
だから私はlogin.fxml
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../gui/MainView.fxml"));
そしてそれは動作します:)
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../view/Main.fxml"));
私の場合、私はちょうど削除します..
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/view/Main.fxml"));
問題は、レイアウト名が正しくないか、レイアウトファイルのパスが無効であると考えています。
intelliJの場合、リソースディレクトリを作成し、そこにレイアウトファイルを配置できます。
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/sample.fxml"));
rootLayout = loader.load();
これは多くの場合、ロケーションパスを正しく取得していません。パスは、プロジェクトのルートではなく、コードが存在する現在のパッケージから始まることを認識することが重要です。この相対パスが正しい限り、この場合、このエラーを回避できるはずです。
JavaFXアプリケーションでも同じ問題が発生しました。さらに奇妙なことに、私のWindows開発環境では、fxmlローダーですべてがうまく機能しました。しかし、Debianマシンでまったく同じコードを実行すると、「location not set」という同様のエラーが発生しました。
ここですべての答えを読みましたが、実際に問題を「解決」するものはありませんでした。私の解決策は簡単だったし、それがあなたの一部に役立つことを願っています:
多分Java getClass()メソッドによって混乱します。何かが異なるスレッドで実行されていたり、クラスがインターフェースを実装している場合、あなたのクラスとは異なるクラスがgetClass()メソッドによって返されます。この場合、creatProduct.fxmlへの相対パスは間違っています。
保存するために:より具体的にして、静的クラスフィールドを使用を試してください(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();
}
これを実現した後、私は常にこのようにします。お役に立てば幸いです!
Intellijユーザーの場合、私の問題は、fxmlファイル(src/main/resources)があるディレクトリが「リソース」ディレクトリとしてマークされていないことでした。
モジュール/プロジェクトの設定を開き、[ソース]タブに移動して、ディレクトリにプロジェクトリソースファイルが含まれていることをIntellijが認識していることを確認します。
CsPeitchと他の人による以下の答えは正しい軌道に乗っています。 fxmlファイルがクラス出力ターゲットにコピーされていることを確認してください。コピーされていない場合、ランタイムには表示されません。生成されたクラスファイルディレクトリを確認し、fxmlがあるかどうかを確認します
私はこのようなことを意味します:
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();
}
試してみてください。
私のものは奇妙だった... IntelliJ特有の癖。
出力クラスを見て、フォルダーがありました:
x.y.z
の代わりに
x/y/z
ただし、IntelliJで特定のオプションを設定している場合、ナビゲーターでは両方がx.y.zのようになります
頭に傷がある場合は、出力フォルダーを確認してください
同じ問題がありました。正しいパスを指定しないという単純な問題です。
.fxml
ファイルを右クリックしてプロパティを選択し(Eclipseを使用する場合は別のIDEでもそれほど変わりません)、/packagename
から始まる場所までコピーをコピーします。問題を解く
私は同じ問題につまずいた。プログラムは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で動作します。
同じ問題がありました。
数分後、間違った場所からfile.fxmlをロードしようとしていることがわかりました。
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/[wrong-path]/abc.fxml"));
fxmlLoader.setClassLoader(getClass().getClassLoader());
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
fxmlLoader.load();
それは私に起こったと私は解決策を見つけました。起動行(Parent root = FXMLLoader.load(getClass().getResource("filenamehere.fxml"));
)を含むクラスとは異なるパッケージの.fxmlファイルを使用してプロジェクトをビルドし、jarの実行時に最初のウィンドウ以外のウィンドウが起動しない相対パスを使用する場合。 短くするために、.fxmlファイルを起動するクラスと同じパッケージに配置し、このようなパスを設定します( "filenamehere.fxml")。正常に機能するはずです。