JavaFX: в чем разница между EventHandler и EventFilter?

Я искал время для поиска в Интернете, и я обнаружил, что в основном некоторые веб-страницы говорят, что нет больших различий. За исключением некоторых пунктов:

  • EventFilter выполняется до EventHandler
  • EventFilter не имеет отношения к event.Consume(); Позвольте мне видеть, если бы я это понял: Допустим, у меня есть:

    Button b= new Button("Test"); b.addEventHandler(.....){...}; b.addEventFilter(......){...};

Скажем, они оба "связаны" с MouseEvent.MOUSE_CLICKED; то код EventFilter будет первым, который будет выполнен!?

Скажем, теперь у меня есть:

Button b= new Button("Test");
b.addEventHandler(.....);
b.addEventFilter(......){
  //some code
  event.consume();
}; // First filter
b.addEventFilter(......){
  //some other code
  event.consume();
}; // Second filter

В этом случае выполняется канва EventFilter, но EventHandler не будет. Правильно?

Есть ли еще какие-нибудь вещи? Есть ситуации, когда я должен предпочесть тот или иной? должен ли я иногда использовать их вместе для решения некоторых проблем?

Спасибо!

Ответ 1

Я не совсем понимаю ваш вопрос, но я нашел это в документах oracle:

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

https://docs.oracle.com/javafx/2/events/processing.htm

Ответ 2

Как я знаю, JavaFX EventFilter может быть одним или несколькими для одного node и может быть единственным для многих узлов. EventFilter позволяет обрабатывать событие во время фазы захвата события, но обработчик события обрабатывает события во время фазы барботажа событий.

Итак EventFilter выполняется перед EventHandler.

обработчик событий javafx (http://javafxtuts.com/javafx-event-handler/)

JavaFX EventFilter (http://javafxtuts.com/javafx-event-filter/)

java docs

Ответ 3

Когда вы регистрируете какое-либо событие, подобное (button.setOnAction(new Clicker()), здесь start/first. Источник события будет stage и Target будет кнопкой. Теперь этап передаст это событие на сцену, и сцена передаст в root Node и так далее. Наконец, кнопка получит событие. Здесь Clicker - это обработчик, который будет использовать это событие. Если мы хотим отслеживать это событие перед обработкой, на картинке появляется "Фильтр событий". здесь мы можем отслеживать это событие. После отслеживания, когда мы будем использовать это событие, это не будет делегировать дальше. Если мы не потребляем, это будет делегировать прямой/немедленный дочерний node. После отслеживания Если вы хотите запустить другое событие, тогда мы можем вызвать метод fireEvent (...). для получения дополнительной информации о документации оракула ссылка!

Ответ 4

Должна быть "логическая" разница.
Фильтр следует использовать, когда по какой-то причине мы хотим предотвратить управление запланированным событием в коде обработчика и прекратить его распространение.
Фактически, как вы правильно указали, маркировка как "потребляемая" событие означает, что обработчик события не должен запускаться. Это документы Oracle (http://docs.oracle.com/javafx/2/events/filters.htm), которые мы можем прочитать:

Фильтры событий обычно используются на ветке node события отправьте цепочку и вызывается во время фазы захвата события обработка событий. Используйте фильтр для выполнения действий, таких как переопределение ответ события или блокирование события от его назначения.

Ответ 5

Фильтр событий - это обработчик событий - он настроен для обработки события до его перехода в node. Вы не можете создать EventFilter.

node.addEventFilter(EventType, eventFilter) - Где evenFilter - объект EventHandler!

Вы можете взглянуть на это, где вы можете использовать его для блокировки/ "переопределения" определенных встроенных элементов управления вводами, уже определенных в таких узлах, как TextArea: Как использовать TAB/Enter KeyPressed на TextArea и заменить с помощью fosustraversal или ввести ключ без использования внутреннего API?