JavaFX : what is the difference between EventHandler and EventFilter?

标签 java events

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

  1. EventFilterEventHandler
  2. 之前执行
  3. EventFilterevent.Consume(); 不敏感 让我看看我是否理解它: 假设我有:

    按钮 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 不会。对吧?

还有什么要知道的吗?在某些情况下我应该选择其中一种吗?为了解决一些问题,我有时应该一起使用它们吗?

谢谢!

最佳答案

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

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

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

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

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

事件冒泡 接下来,事件再次通过链推送,但这次是从事件目标到舞台。因此,如果 Pane 事件过滤器调用 consume(),将命中以下事件处理程序:pane -> scene -> stage

因此不同之处不仅在于这些处理程序何时被激活,而且事件过滤器可以阻止子节点接收事件。

关于JavaFX : what is the difference between EventHandler and EventFilter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25740103/

相关文章:

java - Android:单击按钮时切换相机

java - 浏览器上的后退按钮不会将控制流发送到 API

javascript - Keydown 事件未从文档中删除且未在 div 元素上注册

java - Swing:区分用户引起的组件大小调整和自动组件大小调整的问题(编写自定义布局管理器)

events - 在 safari 中获取扩展卸载事件

Javascript 抛出事件?

包含空 Enum 的 Java 接口(interface)

java - 线程 "main"java.net.BindException : Address already in use - Error in Netbeans only 中的异常

java - 测试 JUnit 和 EclEmma 时遗漏的分支

jquery - 如何在没有JQuery的情况下模仿跨浏览器$(document).ready()行为