javaFx 如何处理同一个值的多个监听器?我所知
我可以将多个侦听器添加到同一个obsValue,那么什么是
触发命令?喜欢在fifo中?
如果我将相同的侦听器(相同的实例)两次添加到
同一个对象,是否会被添加两次?如果是,那么它会触发
两次?或者我不确定它是如何工作的。
让我们看看文档中的一部分答案:
ObservableValue<T>.addListener(ChangeListener<? super T> listener);
添加一个 ChangeListener,只要值
ObservableValue 发生变化。
如果多次添加同一个监听器,则
通知不止一次。也就是说,不进行检查以确保
独特性。
请注意,相同的实际 ChangeListener 实例可能是安全的
注册不同的 ObservableValues。
上面语句的粗体部分告诉我们所有我们需要知道的,添加相同的ChangeListenerntimes 将导致它被解雇ntimes。
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)),那么当propertyB 更改时,propertyA 也会改变。绑定也可以是双向的。
因此,如果您希望更改以影响另一个Property,则使用绑定是有意义的。但请注意,属性仅通过绑定引用单个其他属性。要绑定多个属性,您可以像链接列表(通过它们的绑定)或使用促进多个绑定的类(例如DoubleBinding)以菊花链形式链接它们
如果不是上述情况,请添加Listener。
另请参阅此资源:Using JavaFX Properties and Binding