it-swarm.com.de

Wie verweise ich auf javafx fxml-Dateien im Ressourcenordner?

Ich erstelle eine Javafx-GUI-Anwendung und mein Projekt ist ein von Maven konfiguriertes Projekt. Ich möchte meine fxml-Dateien in meinen Controllern wie folgt referenzieren können:

FXMLLoader.load(getClass().getResource("main.fxml"); 

Wo sich meine main.fxml-Datei im Ordner src/main/resources befindet und sich mein Controller im Ordner src/main/Java befindet. Wie mache ich das? Mein src/main/resources-Ordner befindet sich im Build-Pfad und ich kann eine .properties-Datei aufrufen, die sich im src/main/resources-Ordner von einer Klasse im src/main/Java-Ordner befindet.

Bearbeiten

Ich habe versucht, die fxml-Datei im entsprechenden Verzeichnis des Hauptressourcenordners abzulegen:

enter image description here

aber ich habe immer noch einen fehler.

24
j will

Verwendungsbeispiel

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/main.fxml"));
Parent content = loader.load(); 

Ortsauflösungsoptionen

  1. Legen Sie alle Ihre fxml in das Verzeichnis src/main/resources.

    loader.setLocation(getClass().getResource("/main.fxml"));
    
  2. Legen Sie alle Ihre fxml in ein Verzeichnis src/main/resources/fxml. 

    loader.setLocation(getClass().getResource("/fxml/main.fxml"));
    
  3. Platzieren Sie fxml in einem entsprechenden Ressourcenverzeichnis. z.B. src/main/resources/com/mycompany/myapp. 

    loader.setLocation(getClass().getResource("main.fxml")); 
    

Bei der letzten Option wird davon ausgegangen, dass sich die Klasse, aus der Sie das fxml laden, an der relativen Position in der entsprechenden Java-Quellhierarchie befindet. Sie können beispielsweise den letzten Ladebefehl von der Quelle com.mycompany.myapp.Main.Java aus aufrufen.

FXMLLoader-Nutzungsempfehlungen

  1. Instanziieren Sie einen FXMLLoader mit new FXMLLoader(), anstatt die statischen -Methoden des FXMLLoader zu verwenden. 

    • Die statischen Methoden Werden verwirrend, wenn Werte (wie instanziierte Controller) aus einem Loader abgerufen werden sollen.
  2. Legen Sie den Speicherort im instanziierten FXMLLoader fest und rufen Sie load() auf, anstatt mit load(stream) vom Stream zu laden.

    • Das Festlegen eines URL-basierten Speicherorts im Loader ermöglicht die Auflösung von relativen Ressourcen, die in den fxml- und css-Dateien geladen sind. Relative Ressourcen werden für einen Stream-basierten Konstruktor nicht aufgelöst.
  3. Um einen Standort basierend auf einer Klasse abzuleiten, verwenden Sie getClass().getResource() , da es URL-basiert ist, anstelle von getClass().getResourceAsStream() , der Stream-basiert ist.

IDE und Build-Einstellungen

Stellen Sie sicher, dass Ihr IDE - oder Build-Tool die fxml-Dateien aus dem Ressourcenverzeichnis in das Build-Ausgabeverzeichnis kopiert. Zum Verständnis der Einstellungen von Intellij siehe: So konvertieren Sie ein normales Java-Projekt in Intellij in ein JavaFx-Projekt .

78
jewelsea

Sie verwenden FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("main.fxml") );, um Ihre main.fxml zu laden. Dazu müssen main.fxml und die Java-Klasse in dasselbe Verzeichnis/Pfad geladen werden. Wenn Sie eine fxml-Datei aus einem anderen Pfad/Ort als der Java-Klasse laden möchten, die sie lädt, müssen Sie den relativen Pfad verwenden. Wie oben erwähnt, können Sie den relativen Pfad mit dem Zeichen/vor Ihrer main.fxml .. verwenden. Der Code, der es in Ihrem Fall für Sie funktionieren lässt, ist also

FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("/main.fxml") );
4
Dil

Öffnen Sie Ihren Ressourcenordner im Datei-Explorer Ihres Betriebssystems. Hier sehen Sie, dass Sie einen "dominion.application" -Ordner anstelle eines "application" -Ordners innerhalb eines "dominion" -Ordners erstellt haben. Aus diesem Grund wird die "MainController" -Klasse in einem anderen Paket als die fxml-Datei abgelegt.

0
Hendrik Ebbers