Я относительно новичок в JavaFX. Я пытаюсь проверить шаблон проектирования, где каждый fxml имеет свой собственный контроллер с загрузчиком.
Пример:.
text.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Label?>
<VBox>
<children>
<Label text="Hello world FXML"/>
</children>
</VBox>
MainController
public class MainController extends VBox {
public MainController() {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/test.fxml"));
loader.setController(this);
try {
loader.load();
} catch (IOException e) {
e.printStackTrace();
}
}
}
App
public class App extends javafx.application.Application {
@Override
public void start(Stage primaryStage) {
MainController mainController = new MainController();
Stage stage = new Stage();
stage.setScene(new Scene(mainController));
stage.show();
}
public static void main(String[] args) {
launch();
}
}
Это не работает, я получаю пустое окно при запуске приложения:
Если внести некоторые изменения в контроллер и приложение:
контроллер
private Parent root;
public MainController() {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/test.fxml"));
loader.setController(this);
try {
root = loader.load();
} catch (IOException e) {
e.printStackTrace();
}
}
public Parent getRoot() {
return root;
}
App
stage.setScene(new Scene(mainController.getRoot()));
После этого все работает как положено, в окне можно увидеть ярлык с текстом.
Если я пытаюсь установить root в контроллере:
loader.setRoot(this);
Я получаю ошибку:
javafx.fxml.LoadException: Root value already specified.
/C:/.../target/classes/fxml/test.fxml
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2621)
...
Вопрос: Может кто-нибудь с большим опытом в JavaFX посоветовать мне по этому поводу? Что я делаю неправильно? Есть ли лучший способ добиться этого?