我只是想知道JavaFx如何处理ObservableValue
的侦听器。
关于听众,我有一些不清楚的事情:
我正在使用听众和绑定一段时间,所以我知道如何使用它们(至少我想我知道:)),然后我对如何使用它们不感兴趣,因为我必须做一些更复杂的侦听或绑定我想澄清像我写的一些点,以确保我有效地使用它们,并且我不做任何不必要的内存泄漏。
我会接受这个领域的任何解释,或任何好的文档,我可以在这些点找到答案。
答案 0 :(得分:4)
javaFx如何处理相同值的多个侦听器?我所知 我可以将多个侦听器添加到同一个obsValue,然后是什么 触发订单?就像在fifo?
如果我将相同的侦听器(同一个实例)添加两次,会发生什么 相同的对象,确实是两次添加?如果是,则触发 两次?或者我不确定它是如何工作的。
让我们看一下答案的一部分的文档:
ObservableValue<T>.addListener(ChangeListener<? super T> listener);
添加一个ChangeListener,无论何时值都会通知
ObservableValue
更改。如果多次添加同一个侦听器,那么它将是 不止一次通知。也就是说,没有进行检查以确保 唯一性。强>
请注意,相同的实际ChangeListener实例可能是安全的 注册了不同的ObservableValues。
上述声明的粗体部分告诉我们所有我们需要知道的事情,添加相同的ChangeListener
n
次会导致它被n
次触发。
ObservableValue
接口未指定用于检查ChangeListener
是否已存在的任何操作。您可能很幸运,并且发现实现确实为您提供了这种机制,但实际上并没有多大用处。为确保您不添加重复的ChangeListener
,您可以执行以下操作:
ChangeListener<...> myListener = ...;
someProperty.removeListener(myListener);
someProperty.addListener(myListener);
就执行的顺序而言,ObservableValue
接口本身并未指定顺序。
查看JavaFX库中包含的标准Property
类,例如SimpleDoubleProperty
,他们会按照添加的顺序被解雇。很难快速解释如何通过SimpleDoubleProperty
等类使用的稍微复杂的机制来实现这一点。请查看ExpressionHelper
课程,了解有关如何完成此操作的详细信息。
如果您要自己实现ObservableValue
接口(尽管Javadoc不建议这样做),您可以指定自己的执行顺序。
我知道有些情况下我可以用绑定替换侦听器 反之亦然,但哪个更有效?更好地绑定,或更好地绑定 添加一个监听器?
当您想要将Property<T>
个对象绑定在一起时,通常会使用绑定,例如,如果您将propertyB
绑定到propertyA
(即propertyA.bind(propertyB)
),那么{{1 }}已更改,propertyB
也会更改。绑定也可以是双向的。
因此,如果您希望更改以使用绑定生效另一个propertyA
有意义。但请注意,该属性仅通过绑定引用单个其他属性。要绑定多个属性,您可以像链接列表(通过它们的绑定)或通过使用促进多个绑定的类(例如DoubleBinding
)来链接它们(例如Using JavaFX Properties and Binding)
如果不是上述情况,请添加Property
。
另请参阅此资源:{{3}}