Um komplexere Darstellungen mit JavaFX zu erzeugen, ist es sinnvoll, die grafischen Elemente miteinander zu verschachteln. Hierzu kann in FXML die Anweisung fx:include
verwendet werden.
Ein Problem, auf das ich gestoßen bin, war, dass immer wieder NullPointerExceptions oder LoadExceptions aufgetreten sind, die ich mir nicht erklären konnte. Z. B.:
Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:403)
at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:47)
at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:115)
at java.lang.Thread.run(Thread.java:744)
Caused by: javafx.fxml.LoadException: Base location is undefined.
Die Ursache lag daran, dass der Ort der fxml-Dateien dem Loader nicht bekannt war. Zwar gibt man in der Regel beim Laden (FXMLLoader.load()
) den Ort der fxml-Datei an, jedoch findet der Loader die mit fx:include
eingefügten Dateien nicht. Hierzu muss die Location dem Loader bekannt gemacht werden:
String fxmlFile = "/fxml/personTitled.fxml";
URL location = getClass( ).getResource( fxmlFile );
FXMLLoader loader = new FXMLLoader( );
loader.setLocation( location );
Parent rootNode = (Parent) loader.load( getClass( ).getResourceAsStream( fxmlFile ) );
Scene scene = new Scene( rootNode, 600, 300 );
stage.setScene( scene );
stage.show( );