JavaFx:侦听器和/或绑定处理

时间:2017-11-23 11:45:00

标签: java javafx binding javafx-8 listener

我只是想知道JavaFx如何处理ObservableValue的侦听器。 关于听众,我有一些不清楚的事情:

  • javaFx如何处理相同值的多个侦听器?据我所知,我可以为同一个obsValue添加多个侦听器,那么触发器顺序是什么?就像在fifo?
  • 如果我将同一个侦听器(同一个实例)两次添加到同一个对象会发生什么,是否会添加两次?如果是,那么它会触发两次?或者我不确定它是如何工作的。
  • 我知道有些情况下我可以用绑定替换侦听器,反之亦然,但哪个更有效?最好绑定,或者更好地添加一个监听器?

我正在使用听众和绑定一段时间,所以我知道如何使用它们(至少我想我知道:)),然后我对如何使用它们不感兴趣,因为我必须做一些更复杂的侦听或绑定我想澄清像我写的一些点,以确保我有效地使用它们,并且我不做任何不必要的内存泄漏。

我会接受这个领域的任何解释,或任何好的文档,我可以在这些点找到答案。

1 个答案:

答案 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}}