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

    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 больше чем с одной формой.
    Ответ написан
    Комментировать
  • Удаление контейнера и всех его элементов с формы в JavaFX 2.x?

    Naoto
    @Naoto Автор вопроса
    Ответом стало использование паттерна Model-View-Presenter. Удалить элемент из самого себя невозможно в JavaFX, необходимо вывести эту операцию во внешний класс, так как удаление происходит из списка дочерних элементов родительского контейнера/элемента.
    Ответ написан
    Комментировать