JavaFX FXMLLoader “Location is required”

Baze405

Mitglied
Hallo Leute,

habe einmal eine kleine Frage an euch. Habe nun fast eine Stunde "verschwendet" mit Google und stackoverflow.

Ich habe ein kleines Projekt und wollte aus Gründen der Übersicht die views.fxml & *.css in einem eigenen Paket ablegen.. Wenn ich aber nun ein neues Paket erstelle und alles anpasse erhalte ich folgende Exception:

Java:
java.lang.NullPointerException: Location is required.
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.load(Unknown Source)
    at ch.next405.source.main.Main.start(Main.java:14)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(Unknown Source)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

HTML:
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.next405.source.main.MainController">

Java:
public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = (BorderPane) FXMLLoader.load(getClass().getResource("/view/MainView.fxml"));
            Scene scene = new Scene(root,400,400);
            scene.getStylesheets().add(getClass().getResource("/view/application.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.setMinHeight(500);
            primaryStage.setMinWidth(615);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
FXMl liegt in:
/ch/next405/source/view/MainView.fxml
Der Rest:
/ch/next405/source/main/Main.java
/ch/next405/source/main/MainController.java

Was mache ich falsch?
"view/MainView.fxml"
"\\view\\MainView.fxml"

Funktioniert auch nicht. Es funktioniert nur, wenn alle Dateien im gleichen Ordner sind.
 
K

kneitzel

Gast
Der volle Name deiner Main Klasse ist ch.next405.source.main.MainController? Dann wäre das fxml ja unter /ch/next405/source/view/MainView.fxml zu finden.

Oder ist /ch/next405/source sozusagen das root verzeichnis? Dann wäre der volle Name Deiner Klasse aber doch main.MainController und das fxml unter /view/MainView.fxml zu finden.

Aber das kannst Du ja auch sehen, wenn Du es kompiliert hast - was für eine Verzeichnisstruktur legt er an? Oder bei Erstellung eines jar files: Wie ist dies aufgebaut?

Ansonsten kleiner Hinweis: Arbeite immer mit / und nicht mit \\ - das mit den \\ gibt Probleme, wenn es um Inhalte aus einem jar-File geht.
 

Baze405

Mitglied
Folgende Struktur liegt vor und so funktioniert es:
Struktur.png

So sollte es aussehen:
Soll.png

Wenn ich dich richtig verstanden habe, ja ch.next405.source ist mein main verzeichnis.
die main.java liegt hier:
/ch/next405/source/main/Main.java
 

SeriousD0nkey

Bekanntes Mitglied
Wenn ich mich richtig erinnere, musst du die Location des FXMLLoaders vorher setzen. Ich meine ich hatte auch schon mal das Problem.
Java:
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("view/MainView.fxml");
BorderPane root = (BorderPane) loader.load();

Probier das mal so aus, ist aber ungetestet. :)
Die .fxml muss aber trotzdem im gleichen Package liegen.

Edit: Sorry, falsch gelesen.
 
K

kneitzel

Gast
Bin jetzt leider nur auf dem Handy unterwegs, aber der Aufruf getResource der Klasse ist relativ zu der Klasse. Da stimmt view/... aber nicht sondern erst noch ein Verzeichnis hoch, also ../view/.... Oder du nimmst den ganzen Pfad also /ch/.... .
 

Baze405

Mitglied
Ach, gefühlte 1000x ausprobiert.. "hat nie funktioniert." Aber jetzt gehts. mit dem ganzen Pfad.
Manchmal sieht man den Wald von lauter Bäume nicht. ;)

Vielen Dank!
 

Ähnliche Java Themen

Neue Themen


Oben