JavaFX:EventHandler和EventFilter之间的区别是什么?

JavaFX:EventHandler和EventFilter之间的区别是什么?,java,events,Java,Events,我在谷歌上搜索了一段时间,我发现基本上,一些网页上说没有大的区别。除以下几点外: EventFilter在EventHandler EventFilter对event.Consume()不敏感 让我看看我是否理解了: 假设我有: 按钮b=新按钮(“测试”); b、 加法器(…){…}; b、 加法滤波器(…){…} 假设它们都“链接”到一个MouseEvent;然后,EventFilter的代码将首先执行 比方说,现在,我有: Button b= new Button("Test"); b.ad

我在谷歌上搜索了一段时间,我发现基本上,一些网页上说没有大的区别。除以下几点外:

  • EventFilter
    EventHandler
  • EventFilter
    event.Consume()不敏感
    让我看看我是否理解了:
    假设我有:

    按钮b=新按钮(“测试”);
    b、 加法器(…){…};
    b、 加法滤波器(…){…}

  • 假设它们都“链接”到一个
    MouseEvent;然后,
    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
    
    在这种情况下,将执行boath
    EventFilter
    s,但不会执行
    EventHandler
    。对吧?

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


    谢谢大家!

    我不完全理解您的问题,但我在oracle文档中发现了这一点:

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


    当您在此处注册任何事件(button.setOnAction(new Clicker()))时,事件的开始/第一个来源将是阶段,目标将是按钮。现在阶段将把事件委托给场景,场景将委托给根节点,依此类推。最后按钮将获取事件。这里Clicker是一个处理程序,它将使用该事件。如果我们想在处理之前跟踪该事件,那么“事件过滤器”就会出现。在这里,我们可以跟踪该事件。跟踪之后,一旦我们使用了该事件,则不会进一步委托。如果我们不使用,这将委托给直接/直接子节点。跟踪之后,如果您想触发其他事件,那么我们可以调用fireEvent(…)方法。 有关更多信息,请访问oracle文档
    !

    据我所知,JavaFXEventFilter可以是单个节点的一个或多个,也可以是多个节点的一个。 EventFilter允许您在事件捕获阶段处理事件,但事件处理程序在事件冒泡阶段处理事件

    因此,EventFilter在EventHandler之前执行

    应该有“逻辑”上的差异。
    当出于某种原因,我们希望阻止管理处理程序代码中计划的事件并停止其传播时,应使用筛选器。
    事实上,正如您正确指出的,将事件标记为“已消费”意味着不能启动事件处理程序。 它是Oracle文档(),我们可以阅读:

    事件筛选器通常用于事件的分支节点 在的事件捕获阶段调用调度链和 事件处理。使用筛选器执行操作,例如重写 事件响应或阻止事件到达其目标


    事件筛选器是一个事件处理程序-设置为在事件到达节点之前处理事件。无法创建EventFilter

    节点。addEventFilter(EventType,eventFilter)
    -其中evenFilter是一个EventHandler对象


    您可以看看这个,您可以使用它来阻止/覆盖节点中已经定义的某些固有输入控件,例如TextArea:

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

    • 目标选择
    • 线路建设
    • 事件捕获窗格->圆圈

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

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

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