Работа с обработчиками событий в JavaFX

👁 268 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Данная статья расскажет вам как работать с обработчиками событий в JavaFX программах. Вы узнаете как можно обработать событие, которое было сгенерировано клавиатурой, мышью, скролами и другими элементами управления на экране вашего JavaFX приложения 🙂 .

Обработчики событий позволяют вам обрабатывать события на этапе восходящей фазы. Каждый узел может иметь один или более обработчиков для обрабатываемого события.  Простой обработчик может использовать один или более узлов и более одного типов событий. Если обработчик события для дочернего узла не использует событие, обработчик события для родительского узла позволяет родительскому узлу действовать на события после процесса дочернего узла, обрабатывать их и обеспечить общую обработку событий для нескольких дочерних узлов.

Регистрация и удаление обработчика события для узла

Для обработки события на этапе восходящей фазы узел должен зарегистрировать обработчик. Обработчик события наследует интерфейс EventHandler. Метод handle() данного интерфейса предоставляет код, который будет выполнен, когда событие, которое ассоциировано с обработчиком получит узел,для которого зарегистрирован обработчик.

Для регистрации обработчика используется метод addEventHandler(). Данный метод получает тип события и обработчик в виде аргумента. Ниже представлен пример , где первый обработчик добавляется к простому узлу и обрабатывается определенный тип события. Второй обработчик — для обработки события ввода, определен и зарегистрирован для 2-х различных узлов. Обработчик также зарегистрирован для двух различных типов событий.

//Пример регистрации обработчика для одного узла определенного типа события
node.addEventHandler(DragEvent.DRAG_ENTERED, 
                    new EventHandler() {
                        public void handle(DragEvent) { ... };
                    });

//Определение обработчика для предыдущего события
EventHandler handler = new EventHandler(() {
    public void handle(InputEvent event) {
        System.out.println("Handling event " + event.getEventType()); 
        event.consume();
    }

//Регистрация одного обработчика для двух различных узлов
myNode1.addEventHandler(DragEvent.DRAG_EXITED, handler);
myNode2.addEventHandler(DragEvent.DRAG_EXITED, handler);

//Регистрация еще одного типа события для первого из двух различных узлов
myNode1.addEventHandler(MouseEvent.MOUSE_DRAGGED, handler);

Обратите внимание, что обработчик события, который определен для одного типа события также может быть использован в любых подтипах этого события. Для глубокого анализа можете прочесть официальную статью Oracle, где описывается иерархия типов событий.

Когда вам больше не нужен обработчик события для узла, то его можно удалить, используя метод  removeEventHandler(). Данный метод в виде параметров получает тип удаляемого события и его обработчик. В ниже следующем примере представлен код, который демонстрирует данную возможность, где удаляется событие DragEvent.DRAG_EXITED узла myNode1 из предыдущего примера, но обработчик еще выполняет данный тип события для узла myNode2, и событие MouseEvent.MOUSE_DRAGGED для узла myNode1.

//Удаляем событие обработчика
myNode1.removeEventHandler(DragEvent.DRAG_EXITED, handler);

 Совет: Для удобства удаления обработчика события достаточно передать значение null в виде параметра через специальный метод, к примеру node1.setOnMouseDragged(null).