【发布时间】:2019-03-24 11:02:08
【问题描述】:
当我写这个时:
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ChangeListener;
SimpleBooleanProperty foo = new SimpleBooleanProperty();
foo.addListener(
new ChangeListener<Boolean>() {
@Override
public void changed(
ObservableValue<? extends Boolean> observable,
Boolean oldValue, Boolean newValue
) {
System.out.println(oldValue + " " + newValue);
}
}
);
foo.set(false);
foo.set(true);
输出是
false true
但是,如果我将最后两行更改为
foo.set(true);
foo.set(false);
输出是
false true
true false
我觉得这很矛盾。如何确保始终在第一个 set 上通知侦听器?
... 或者,侦听器应该显式调用foo.get() 以获取初始值,然后仅获知更改是常识吗?在那种情况下,我仍然不知道如何区分默认的false 和在监听器注册之前设置的false。
【问题讨论】:
-
迈克尔的回答是正确的。它被称为 更改监听器,因为它仅在值实际更改时触发。
-
你为什么要那个?听起来像次优设置...
-
@kleopatra 为什么你认为它不是最理想的?
-
probability ;) 您在注册时就知道该值,那么您为什么希望该属性变为非法并使用 old== new 开除某些东西?想不出一个重要的背景
-
@kleopatra 我认为我真正想要的是
ActionListener,每次设置值时都会收到通知。我很困惑,因为同时我确实需要ChangeListener来获得更改通知。我想我会写一个答案,也许可以澄清我所追求的
标签: java javafx properties listener