webentwicklung-frage-antwort-db.com.de

JavaFX Location ist keine Fehlermeldung

Ich habe Probleme beim Versuch, die aktuelle Szene zu schließen und eine andere Szene zu öffnen, wenn menuItem ausgewählt ist. Meine Hauptphase ist wie folgt codiert:

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();
}

Wenn das Programm ausgeführt wird, geht es zur cartHomePage.fxml. Von dort aus kann ich auswählen, ob ein Produkt erstellt werden soll, oder eine Kategorie erstellen, wenn der Menüpunkt ausgewählt ist. Hier ist meine Action-Veranstaltung:

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();      
}

Ich kann die Bühne jedoch nur einmal wechseln. Meine Standardseite ist beispielsweise "cartHomePage.fxml". Wenn ich das Programm starte, erstelle ich die Produktphase. Danach kann ich nirgendwohin mehr gehen. Die Fehlermeldung lautet:

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

Ich habe die Bühne nach dem Schließen eingestellt und herumgereicht. Ich frage mich, welcher Teil schief gelaufen ist.

Danke im Voraus.

48
user2424370

Ich hatte dieses Problem und habe diesen Beitrag gefunden. Mein Problem war nur ein Problem mit dem Dateinamen.

FXMLLoader(getClass().getResource("/com/companyname/reports/" +
report.getClass().getCanonicalName().substring(18).replaceAll("Controller", "") +
".fxml"));

Parent root = (Parent) loader.load();

Ich habe eine XML-Datei, aus der das alles stammt, und ich habe sichergestellt, dass meine Klasse der fxml-Datei entspricht, mit Ausnahme des Word-Controllers.

Ich habe die Unterzeichenkette durcheinander gebracht, also war der Pfad falsch ... sicher genug, nachdem ich den Dateinamen korrigiert hatte.

Um es kurz zu machen: Ich denke, das Problem ist entweder, dass der Dateiname nicht richtig benannt wurde oder der Pfad falsch ist.

ADDITION: Ich bin seitdem zu einem Maven-Projekt umgezogen. Der Weg ohne Maven besteht darin, alles in Ihrem Projektpfad zu haben. Der Maven-Weg, der in der Antwort unten aufgeführt wurde, war zu Beginn etwas frustrierend, aber ich habe meinen Code folgendermaßen geändert:

FXMLLoader loader = new FXMLLoader(ReportMenu.this.getClass().getResource("/fxml/" + report.getClass().getCanonicalName().substring(18).replaceAll("Controller", "") + ".fxml"));
42
ryan.s

Ich bekam diese Ausnahme und die "Lösung", die ich fand, war über die Netbeans IDE, einfach: 

  1. Rechtsklick -> "Bereinigen und Bauen"
  2. Projekt erneut ausführen

Ich weiß nichtWARUMdas funktionierte, aber es hat funktioniert!

23
Dimitris

Ich habe eine einfache NetBeans 8-Java-FXML-Anwendung in die Maven-gesteuerte Anwendung umgewandelt. Dann bekam ich Probleme, weil die getResource()-Methoden die .fxml-Dateien nicht finden konnten. In meiner ursprünglichen Anwendung waren die fxmls durch die Paketstruktur verstreut - jede neben ihrer Controller-Klassendatei. Nachdem ich Clean und Build in NetBeans erstellt hatte, überprüfte ich das Ergebnis .jar im Zielordner - die .jar enthielt überhaupt keine fxml. Alle fxmls waren seltsam verschwunden.

Dann lege ich alle fxmls in den Ordner resources/fxml und stelle die Parameter der getResource-Methode entsprechend ein, zum Beispiel: FXMLLoader(App.class.getClassLoader().getResource("fxml/ObjOverview.fxml")); In diesem Fall lief alles OK. Der Ordner fxml erschien im Stammverzeichnis der .jar-Datei und enthielt alle meine fxmls. Das Programm funktionierte wie erwartet.

15
Evaldas Ilginis

Ich weiß, dass dies eine späte Antwort ist, aber ich hoffe, allen anderen zu helfen, die dieses Problem haben. Ich erhielt die gleiche Fehlermeldung und stellte fest, dass ich einen / vor meinem Dateipfad einfügen musste. Der korrigierte Funktionsaufruf wäre dann:

FXMLLoader myLoader = new FXMLLoader(getClass().getResource("/createCategory.fxml"));
//                                                           ^
11
Rane1011

Ich habe eine schnelle und einfache Sache ausprobiert:

Ich habe zwei Pakete -> app.gui und app.login

In meiner Login-Klasse verwende ich den mainview.fxml von app.gui, also habe ich dies im login.fxml gemacht.

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

Und es funktioniert :)

4
kaya

Ich denke, das Problem ist entweder ein falscher Layoutname oder ein ungültiger Layoutdateipfad. 

für IntelliJ können Sie ein Ressourcenverzeichnis erstellen und Layoutdateien dort ablegen.

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/sample.fxml"));
rootLayout = loader.load();
3
WMG

Dadurch wird der Standortpfad häufig nicht korrekt angezeigt. Es ist wichtig zu wissen, dass der Pfad vom aktuellen Paket ausgeht, in dem sich der Code befindet, und nicht vom Stamm des Projekts. Solange dieser relative Pfad korrekt ist, sollten Sie in diesem Fall von diesem Fehler ausweichen können.

3
demongolem

Ich hatte das gleiche Problem in meiner JavaFX-Anwendung. Noch seltsamer: In meiner Windows-Entwicklungsumgebung hat alles mit dem fxml-Loader gut funktioniert. Als ich auf meiner Debian-Maschine exakt denselben Code ausführte, bekam ich ähnliche Fehler mit "location not set".

Ich habe alle Antworten hier gelesen, aber keine schien das Problem wirklich zu "lösen". Meine Lösung war einfach und ich hoffe, es hilft einigen von Ihnen:

Möglicherweise wird Java durch die getClass () - Methode verwirrt. Wenn etwas in anderen Threads läuft oder Ihre Klasse Schnittstellen implementiert, kann es zu dem Punkt kommen, dass eine andere Klasse als Ihre von der getClass () - Methode zurückgegeben wird. In diesem Fall ist Ihr relativer Pfad zu creatProduct.fxml falsch, da sich Ihre "sind" nicht in dem Pfad befinden, von dem Sie glauben, dass Sie ...

Um auf der sicheren Seite zu sein: Seien Sie genauer und versuchen Sie verwenden Sie das statische Klassenfeld in Ihrer Klasse (Beachten Sie die 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();      
}

Nachdem ich das erkannt habe, werde ich es IMMER so machen. Hoffentlich hilft das!

2
Sauer
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../view/Main.fxml")); 

in meinem Fall entferne ich einfach .. 

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/view/Main.fxml")); 
2
ZURA Tikaradze

Für Intellij-Benutzer bestand mein Problem darin, dass das Verzeichnis, in dem ich meine fxml-Dateien (src/main/resources) hatte, nicht als "Ressourcen" -Verzeichnis markiert wurde. 

Öffnen Sie die Modul-/Projekteinstellungen. Wechseln Sie zur Registerkarte "Quellen" und stellen Sie sicher, dass Intellij weiß, dass das Verzeichnis Projektressourcendateien enthält.

1
kingdonnaz

Die Antwort von CsPeitch und anderen ist auf dem richtigen Weg. Stellen Sie nur sicher, dass die fxml-Datei in Ihr Klassenausgabeziel kopiert wird. Andernfalls wird sie von der Laufzeitumgebung nicht angezeigt. Überprüfen Sie das generierte Klassendateiverzeichnis und prüfen Sie, ob die Datei fxml vorhanden ist

1
Victor Grazi

Ich meine so etwas:

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();
}

Nachdem

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();      
}

Probieren Sie es aus und lassen Sie es mich wissen. 

1

meins war seltsam ... IntelliJ spezifische Eigenart.

Ich habe mir meine Ausgabeklassen angesehen und es gab einen Ordner:

x.y.z

anstatt 

x/y/z

wenn Sie jedoch bestimmte Optionen in IntelliJ festgelegt haben, sehen beide im Navigator wie x.y.z aus

Überprüfen Sie also Ihren Ausgabeordner, wenn Sie sich am Kopf kratzen

0
ycomp

Ich hatte das gleiche Problem. Es ist ein einfaches Problem, den richtigen Pfad nicht anzugeben.

Klicken Sie mit der rechten Maustaste auf die .fxml-Datei, und wählen Sie die Eigenschaften aus (für Eclipse-Benutzer ist dies bei einer anderen IDE nicht sehr unterschiedlich), und kopieren Sie dann die Position ab /packagename bis zum Ende. Dadurch sollte das Problem gelöst werden 

0
Hayxe

Ich bin auf das gleiche Problem gestoßen. Das Programm lief großartig von Eclipse über die Schaltfläche "Ausführen", aber NICHT von lauffähigem JAR, das ich zuvor exportiert hatte. Meine Lösung war:

1) Verschieben Sie die Klasse Main in das Standardpaket

2) Legen Sie einen anderen Pfad für Eclipse und andere fest, während Sie die JAR-Datei ausführen. (einfügen in 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;
        }
}

Danach müssen Sie in der start -Methode Dateien wie folgt laden:

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

Es funktioniert für mich in Eclipse Mars mit e (fx) clipse plugin.

0
DominikStyp

Ich hatte das gleiche Problem.

nach ein paar Minuten stellte ich fest, dass ich versuche, die Datei.fxml von einem falschen Ort aus zu laden.

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/[wrong-path]/abc.fxml"));
fxmlLoader.setClassLoader(getClass().getClassLoader());
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
fxmlLoader.load();
0

Das ist mir passiert und ich habe die Lösung gefunden. Wenn Sie Ihr Projekt mit Ihren .fxml-Dateien in verschiedenen Paketen der Klasse erstellen, die über die Startzeile (Parent root = FXMLLoader.load(getClass().getResource("filenamehere.fxml"));) .__ verfügt, verwenden Sie einen relativen Pfad, den Ihre Fenster außer dem ersten nicht starten, wenn Sie das jar ausführen. Um es kurz zu halten, platzieren Sie die .fxml-Datei im selben Paket mit der Klasse, die sie startet, und legen Sie den Pfad wie folgt fest ("filenamehere.fxml"), und es sollte gut funktionieren.

0
CsPeitch