@Michaellux

Когда подключать обработчики событий в JavaFX, если цели событий появляются динамически?

В программе есть панель с кнопками, которая изначально выглядит так:
5b0e4ff156f10261442980.png

При запуске программы я использую метод attachMonitoringEvents(), который по задумке должен регистрировать все обработчики событий в программе:

public ControllerMonitoringEnvironment(MonitoringEnvironment monitoringEnvironmentModel,MonitoringEnvironmentView monitoringEnvironmentView) {
        this.monitoringEnvironmentModel = monitoringEnvironmentModel;
        this.monitoringEnvironmentView = monitoringEnvironmentView;
        attachMonitoringEvents();
    }

Button addImageForActivityButton;
TextField nameOfActivityTextField;

    public void attachMonitoringEvents() {
            monitoringEnvironmentView.getAddActivityButton()
            .setOnMouseClicked(new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent event) {
                    System.out.println("Создать активность");


                    addImageForActivityButton =  new Button();

                    //...//

                    FileChooser fileChooser = new FileChooser();
                    fileChooser.setTitle("Выбор изображения для активности");

                    addImageForActivityButton.setOnAction(
                            new EventHandler<ActionEvent>() {
                                @Override
                                public void handle(ActionEvent event) {
                                    configureFileChooser(fileChooser);
                                    File file = fileChooser.showOpenDialog(stage);
                                    if (file != null) {
                                        openFile(file);
                                        attachActivityPanelsEvents();
                                        createAddActivityPanel(file);
                                    }
                                }
                            }
                    );
                }
            });


        }


В этом методе регистрируется обработчик события нажатия на кнопку с плюсом.

Нажали на кнопку с плюсом. Результат:

5b0e51434ad2b079903899.png

Появилась кнопка для добавления изображения.

Обработчик кнопки для добавления изображения объявляется в обработчике кнопки с плюсом.

Выбрали изображение:

5b0e5167654d8052422393.png

Появилась кнопка "ОК". Подключили обработчик кнопки "ОК":

private void createAddActivityPanel(File file) {

      
        Button okChooseImageButton = new Button("OK");

       // okChooseImageButton.addEventHandler(MouseEvent.MOUSE_CLICKED,addActivityHandler);


    }

    private  void attachActivityPanelsEvents() {
            EventHandler<MouseEvent> addActivityHandler =
                    new EventHandler<MouseEvent>() {

                        @Override
                        public void handle(MouseEvent event) {
                            System.out.println("Add activity");

                        }
                    };

            nameOfActivityTextField.setOnKeyPressed(
                new EventHandler<KeyEvent>() {
                    @Override
                    public void handle(KeyEvent keyEvent) {
                        if (keyEvent.getCode() == KeyCode.ENTER) {
                            System.out.println("Add activity");


                        }
                    }
                }
        );
    }


Хочу addActivityHandler подключить в методе createAddActivityPanel().

Можно и разумно ли создавать/подключать обработчик события в другом обработчике событий?

Как правильно подключать и отключать обработчики событий в JavaFX если элементы добавляются динамически?
  • Вопрос задан
  • 327 просмотров
Решения вопроса 1
jamakasi666
@jamakasi666 Куратор тега Java
Просто IT'шник.
А в чем сокральный смысл перетыкивать и создавать кучи обработчиков? Судя по коду у вас абсолютно одинаковый результат т.е.
1) Нажали плюсик, появилась кнопка-картинка
2) Нажали кнопку-картинку , выбрали картинку, появилась кнопка "ок"
3) Кнопка "ок" делает System.out.println("Add activity");

Отсюда следует что смысла так городить тоже нет потому как проще пойти другими путями =) Какими рекомендую пораскинуть мозгами самим. Только подскажу наводкой, классы можно переопределять и наследовать, можно хранить ссылку на выбранный объект и плясать от нее, можно объявить EventHandler и просто давать ссылку нужным компонентам а не создавать и плодить кучи EventHandler'ов.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы