【发布时间】:2015-11-25 09:06:27
【问题描述】:
我是 JavaFX 的新手,并且已经开始转换用 Swing 编写的自定义组件。作为最佳实践,我总是检查目标对象的侦听器中是否已包含事件侦听器(PropertyChangeListener、MouseListener、ActionListener 等),以确保不会将同一个侦听器添加两次。我正在尝试对 JavaFX 执行相同的操作,但找不到任何访问侦听器列表的方法(例如,运行 list.contains(listener) 检查)。
我在寻找不存在的东西吗?如果是这样,JavaFX 不包含此功能是否有充分的理由(恕我直言,它应该)?
感谢您的反馈!
【问题讨论】:
-
AFAIK 无法访问 JavaFX 中的内容。你能举例说明你为什么需要它们(或认为你需要)吗?我从来没有遇到过这样做的需要。
-
正如我的问题中提到的,我试图避免多次将同一对象注册为侦听器。可能发生这种情况的用例在附加评论中,但相信我这是可能的,当它发生时,事件被触发到侦听器的次数与侦听器出现在事件侦听器列表中的次数一样多。低效且不必要,因为监听器几乎总是(99.9999999% 的时间)需要处理事件
-
是的,我明白:我从来没有遇到过您不知道听众是否已经注册的情况。这就是我想知道的用例。
-
.. 只处理一次事件。另外——这引起了我的注意——JavaFX 文档特别指出,如果一个监听器被注册了不止一次,那么调用 [list].removeListener() 只会删除列表中的第一个条目。换句话说,如果您认为您已经删除了一个侦听器,并且它以某种方式被添加到列表中两次,您可能想知道为什么侦听器仍然处理该事件。
-
您可能总是在添加侦听器之前删除它。来自
removeListenerjavadoc:如果给定的侦听器之前没有注册过(即从未添加过),那么这个方法调用是无操作的。他们在框架中这样做,例如在com.sun.javafx.binding.ContentBinding.bind()方法中。
标签: javafx changelistener