gpt4 book ai didi

java - 如何让 SimpleProperty 通知第一组听众?

转载 作者:行者123 更新时间:2023-12-01 17:48:19 25 4
gpt4 key购买 nike

当我写这个时:

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

我发现这相当不一致。如何确保监听器始终在第一次集合时收到通知?

...或者监听器应该显式调用 foo.get() 来获取初始值,然后仅在更改时收到通知,这是常识吗?在这种情况下,我仍然不知道如何区分默认的 false 和在监听器注册之前设置的 false

最佳答案

完全一致。

问题是 SimpleBooleanProperty 已初始化为 false。当您调用foo.set(false)时首先,值实际上没有改变,所以监听器没有被调用。

当您调用foo.set(true)时首先,值更改两次(false -> true -> false),这会调用监听器两次。

如果您希望初始值为 true,请使用 the constructor which takes a boolean .

<小时/>

如果您想在附加监听器时触发事件,您可以扩展 SimpleBooleanProperty很容易,尽管我不清楚你将使用什么旧值(null,我猜?):

class FireWhenAttachBooleanProperty extends SimpleBooleanProperty
{
@Override
public void addListener(ChangeListener<? super Boolean> listener)
{
super.addListener(listener);
listener.changed(this, null, getValue());
}
}

关于java - 如何让 SimpleProperty 通知第一组听众?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52894298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com