JavaFX:EventHandler和EventFilter有什么区别?

bog*_*bog 20 java events

我已经谷歌搜索了一段时间,我发现基本上,一些网页说没有大的差异.除了一些要点:

  1. EventFilter 之前执行 EventHandler
  2. EventFilterevent.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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,EventFilter将执行boath s但EventHandler不会执行.对?

还有其他事要知道吗?在哪些情况下我应该优先考虑其中一个?我有时应该一起使用它们来解决一些问题吗?

谢谢!

sir*_*009 14

每当事件发生时,它遵循一个过程来确定场景图中的哪个节点应该处理该事件.该过程采取以下步骤:

  • 目标选择
  • 路线建设
  • 事件捕获< - 过滤器在此处触发
  • 事件冒泡< - 处理程序在此处触发

目标选择假设您的场景包含带圆圈的窗​​格.如果单击圆圈,圆圈将成为事件目标.

路径构建接下来,JavaFX创建路由(或事件分派链).在我们的例子中,链条看起来像stage -> scene -> pane -> circle

事件捕获事件通过链上的每个事件过滤器传递.只要其中一个过滤器调用consume(),链就会停止并且该节点成为目标.如果没有过滤器调用consume()链的末端(圆圈)仍然是目标.

事件冒泡接下来,事件再次被推送到链中,但这次是从事件目标到阶段.因此,如果调用窗格事件过滤器consume(),将触发以下事件处理程序:pane -> scene -> stage

因此,区别不仅在于这些处理程序被激活,而且事件过滤器还可以阻止子节点接收事件.


i3a*_*aan 2

我不完全理解你的问题,但我在 oracle 文档中找到了这个:

过滤器和处理程序之间的主要区别在于每个过滤器的执行时间。

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