我已经用谷歌搜索了一段时间,我发现基本上,一些网页说没有大的差异。除了一些点:
EventFilter
在EventHandler
之前执行
EventFilter
对event.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/