JavaFX:EventHandler 和 EventFilter 有什么区别?

2022-09-01 17:23:26

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

  1. EventFilter在之前执行EventHandler
  2. EventFilter不明智的让我看看我是否理解了它:假设我有:event.Consume();

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

假设它们都“链接”到一个 ;那么,的代码将是第一个被执行的!?MouseEvent.MOUSE_CLICKEDEventFilter

比方说,现在,我有:

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

在这种情况下,船将被执行,但不会。对吧?EventFilterEventHandler

还有其他事情要知道吗?有没有我应该选择一个或另一个的情况?我有时应该一起使用它们来解决一些问题吗?

谢谢!


答案 1

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

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

目标选择假设您的场景包含一个带有圆圈的窗格。如果单击该圆圈,该圆圈将成为事件目标。

路线建设接下来,JavaFX 创建一个路由(或事件调度链)。在我们的示例中,链看起来像stage -> scene -> pane -> circle

事件捕获该事件通过链上的每个事件过滤器进行。一旦其中一个过滤器调用,链就会停止,该节点成为目标。如果没有过滤器调用,则链的末端(圆圈)仍然是目标。consume()consume()

事件冒泡接下来,事件再次通过链推送,但这次是从事件目标推送到阶段。因此,如果窗格事件筛选器名为 ,则将命中以下事件处理程序:consume()pane -> scene -> stage

因此,不同之处不仅在于激活这些处理程序的时间,还在于事件筛选器可以阻止子节点接收事件。


答案 2

据我所知,JavaFX EventFilter对于单个节点可以是一个或多个节点,对于许多节点可以是单个节点。使用事件筛选器,可以在事件捕获阶段处理事件,但事件处理程序在事件冒泡阶段处理事件。

因此,EventFilter 在 EventHandler 之前执行。

java docs