Проблемы загрузки JavaFX Root - PullRequest
0 голосов
/ 15 ноября 2018

Я относительно новичок в 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();
    }
}

Это не работает, я получаю пустое окно при запуске приложения:

enter image description here

Если внести некоторые изменения в контроллер и приложение:

контроллер

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 посоветовать мне по этому поводу? Что я делаю неправильно? Есть ли лучший способ добиться этого?

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

В вашем первом примере вы вызываете 'loader.load ()', но вы не используете возвращаемое значение метода. Вы можете попробовать this.getChildren().add(loader.load())

Что касается исключения при вызове setRoot, можете ли вы показать все соответствующие коды?

0 голосов
/ 15 ноября 2018

Поскольку вы собираетесь использовать пользовательский компонент , вам необходимо убедиться, что:

  • установите controller и root для FXMLLoader перед загрузкой fxml в конструктор вашего компонента
  • использовать <fx:root> в качестве корневого элемента fxml
  • не указывать fx:controller в тексте
<fx:root type="javafx.scene.layout.VBox" xmlns:fx="http://javafx.com/fxml">
    <children>
        <Label text="Hello world FXML"/>
    </children>
</fx:root>
public class MainController extends VBox {

    public MainController() {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/test.fxml"));
        loader.setController(this);
        loader.setRoot(this);
        try {
            loader.load();
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...