JavaFX 8 есть ли способ получить ссылку FXML с узла?

Я пытаюсь выяснить, есть ли способ получить ссылку на FXML для данного узла.

Например, я динамически загружаю представления - предположим, что у меня есть панель, на которую ссылается текущий контроллер:

private void openView() {
    FXMLLoader loader = new FXMLLoader();
    Parent node = loader.load(this.getClass().getResource("MyView.fxml").openStream());
    pane.getChildren().add(node);
    node.requestFocus();
}

Я хотел бы сохранить, какие представления были открыты, чтобы я мог перезапустить их в следующий раз, когда окно будет открыто. Что-то вроде этого:

private void saveOpenViews() {
    pane.getChildren().forEach(child -> {
        String fxmlLocation = child.getFXML();
        etc....
    }
}

Кажется, я не могу найти способ вернуть это, чтобы сохранить то, что было открыто ... Надеялся, что есть способ, кроме ручного отслеживания в другом месте.

Спасибо.


person purring pigeon    schedule 08.01.2015    source источник


Ответы (1)


Сохраните соответствующую информацию fxml в узле userData, когда вы загружаете узел из fxml, затем ищите пользовательские данные, когда вам нужно знать, к какому fxml относится узел.

private void openView() {
    FXMLLoader loader = new FXMLLoader();
    URL fxmlLocation = this.getClass().getResource("MyView.fxml");
    Parent node = loader.load(fxmlLocation.openStream());
    node.setUserData(fxmlLocation);
    pane.getChildren().add(node);
    node.requestFocus();
}

private void saveOpenViews() {
    pane.getChildren().forEach(child -> {
        URL fxmlLocation = (URL) child.getUserData();
        etc....
    }
}
person jewelsea    schedule 09.01.2015
comment
При использовании FXML у вас обычно будет класс контроллера. Создайте абстрактный класс контроллера, который содержит необходимые методы получения и установки. Весь ваш контроллер будет расширять этот класс. Затем вы можете получить доступ к контроллеру с помощью fxmlLoader.getController() и вызвать установщик для местоположения FXML. Вы можете сохранить контроллеры ваших открытых представлений в списке. После вызова метода сохранения вам нужно только перебрать ваши контроллеры и получить xml. Если вам нужна большая гибкость для определения контроллера представления, вы можете использовать DataFX (guigarage.com/2014/05/datafx-8-0-tutorials) - person Hendrik Ebbers; 23.01.2015
comment
Спасибо за информацию Хендрик. Вероятно, лучше всего давать ответы как ответы, а не комментарии. - person jewelsea; 23.01.2015