@Verg1l

Как связать два запущенных контроллера в Java (JavaFX)?

408c5951503f4b6da611cf571d1fa4e8.bmp

В общем, у нас имеются два контроллера и два файла с расширением fxml.

Алгоритм:
— Обращаемся к первому файлу (1.fxml) с расширением fxml (заполняем два текстовых поля данными);
— При нажатии на кнопку — с действием вызова метода (onAction) в определённом контроллере, происходит вызов второго файла (1.fxml) fxml — который также привязан к контроллеру;
— При нажатии на кнопку с действием (см. выше) должно происходить считывание текстовых полей в первом файле .fxml...

Вопрос: — Как считать эту информацию (см. алгоритм выше) ?
  • Вопрос задан
  • 9972 просмотра
Решения вопроса 2
@EdmunD
Java Программист
Вы можете вручную создать оба контроллера, одному из них передать ссылку на второй, а потом указать их FXMLLoader'у через метод setControler() вызвав его до вызова метода load()
Ответ написан
Naoto
@Naoto
Набросок кода с возможностью "общения" между контроллерами:
public class Controller {

    private Controller children;  // Ссылка на контроллер поражаемой формы
    private Controller parent;     // Ссылка на родительский контроллер (если таковой есть для данной формы)

    @FXML
    private TextFild text;

    // get для children

    // get и set для parent
    
    // get для содержимого text

    /* Метод, вызываемый при нажатии кнопки, создающей новую форму */
    @FXML
    private void createChildrenButtonOnAction(ActionEvent event) {
        FXMLLoader loader = new FXMLLoader();
        Parent newView = loader.load(getClass().getResource("1.fxml"));  // получение главного контейнера создаваемой формы

       // Тут можно создать новый стейдж и, присвоив ему сцену с новой формой, отобразить

        children = loader.getController();  // Теперь текущий контроллер "знает" о существовании "потомка"
        children.setParent(this);                // А теперь и "потомок" знает своего "отца"
    }

    /* Данный метод позволяет получать содержимое TextFild'a text из "потомка", если он существует */
    private String getChildrenText() {
        if (children != null) {
            return children.getText();
        }
        return null;
    }
}

Чтобы получить доступ к данным в "дочернем" контроллере, надо иметь на него ссылку. То-есть, при нажатии на кнопку "родительского" контроллера нужно создавать FXMLLoader"ом новый экземпляр Node и сохранять ссылку на его контроллер (полученную методом getController() экземпляра FXMLLoader) в переменную, находящуюся в "родительском" контроллере. Соответственно, из "родительского" контроллера получится обратиться ко всем доступным методам "дочернего" контроллера. А чтобы иметь доступ из "дочернего", то в нем должен иметься метод установки ссылки на "родительский" контроллер.

Есть замечание к этому: "...считывание текстовых полей в первом файле .fxml"
Ничего не записывается в FXML файлы. В момент вызова load() у FXMLLoader происходит сериализация fxml-файла в экземпляр Parent и создание экземпляра класса-контроллера, который потом можно получить методом getController().

Чтобы лучше понять, как организовать взаимодействие между разными контроллерами в JavaFX Вам стоит почитать о паттерне MVP. Без него не стоит вообще пробовать писать UI больше чем с одной формой.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
websofter
@websofter
Programmer...
Все действия с формой происходят внутри его контроллера, чтобы получить данные из одного контроллера в другом используй поля для хранения данных и используй эти поля в другом контроллера, вызывая класс контроллера и все
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы