我正试图了解Java FX中事件处理的不同方面。我已经阅读了Oracle材料,但我仍然有点困惑,并想知道是否有人能够以简洁的方式解释一些不同选项的差异和关键用途。
首先,从我可以看到有事件处理程序和事件过滤器,然后有方便的方法。那么处理程序和过滤器之间的关键区别是什么,以及为什么我会使用另一个。此外,使用addEventHandler(...)而不是使用便捷方法添加事件处理程序有什么好处?从我自己的测试中我相信使用addEventHandler(...)你可以将多个事件处理程序附加到给定的控件,而使用setOnEvent-type(...)只允许附加一个事件处理程序,因为它每次都会覆盖属性它已经设定好了。还有其他差异吗?
然后是ChangeListener和InvalidationListener的主题 - 我认为ChangeListener是一种事件处理程序,它是专门为侦听变更事件(属性)而设计的吗?我似乎找不到使用ChangeListener的许多示例,除了JavaFX Properties和Binding上的Oracle页面之外 - 有没有人知道一个好的指南?此外,简单来说,我何时会在ChangeListener和InvalidationListener之间做出选择?
最后,是否有可能通过传统的EventHandler或ChangeListener来模拟相同的事件处理过程 - 例如可以使用ActionEvent处理按钮单击 - 有没有办法通过ChangeListener执行此操作?我可以看到你理论上可以在onActionProperty中添加一个更改侦听器,但我认为单击该按钮时不会调用它,而是setOnAction实际上是否更改了附加的事件处理程序?
答案 0 :(得分:3)
那么处理程序和过滤器之间的关键区别是什么呢? 会使用一个而不是另一个。
关键区别在于每一个发生时。在事件捕获阶段调用事件过滤器,这发生在事件冒泡阶段(调用事件处理程序)之前。因此,您可以在通知处理程序之前过滤(使用)您不希望处理的事件。大多数情况下,您只想使用处理程序而不必担心过滤器。但是,有些情况下您需要过滤事件。例如,想象一下鼠标处理程序移动游戏角色的游戏。如果用户打开游戏菜单,您不希望他能够单击“通过”菜单进入游戏并在菜单打开时移动角色。一种可能的方法是过滤这些鼠标事件,并在它们到达注册处理程序的节点之前使用它们。你当然可以将鼠标处理程序附加到不同的东西而不是整个场景,但它超出了示例中强调的点。
顾名思义,便利处理程序是为了方便起见。它减少了样板代码并允许简单的API。根据JavaFX doc,它们在事件链中被称为最后一个。因此,如果您只有一种感兴趣的事件类型,则应首选这些方法。
总而言之,按顺序使用便利和事件处理程序,如果需要更多地控制事件调度,您还可以添加过滤器。
此外,简单来说,我何时会在a之间做出选择 ChangeListener和InvalidationListener?
当值实际上已更改时,将通知更改侦听器。为了识别更改,必须重新计算该值。因此,当您将这样的侦听器添加到可观察值时,它不再被懒惰地评估,而是急切地。
当值不再有效时,会通知失效侦听器。但是,这并不意味着价值已经改变。这允许我们在不实际知道值的情况下触发失效事件。该值将在访问之前进行评估。
因此,简单来说,如果您需要知道可观察对象的新值,请使用ChangeListener,否则请使用InvalidationListener。
我可以看到你理论上可以添加一个更改监听器 onActionProperty,但我认为这不会被调用 单击按钮,但是如果setOnAction实际更改了 附加的事件处理程序?
是的,你是对的。要处理按钮单击,您需要使用setOnAction()
。 ChangeListener
与事件处理无关。