gpt4 book ai didi

JavaFX 属性删除监听器不起作用

转载 作者:行者123 更新时间:2023-12-03 19:34:43 25 4
gpt4 key购买 nike

我尝试向 JavaFX 添加、删除和再次添加监听器 BooleanProperty但它不起作用。
这是我的代码

public class PropListenerTest {

BooleanProperty test = new SimpleBooleanProperty(false);

public PropListenerTest() {
System.out.println("\nTest 1\tadd the listener"); //NON-NLS
test.addListener(this::onChangeTest);
test.set(true);
test.set(false);

System.out.println("\nTest 2\tremove the listener, but not possible! Why?"); //NON-NLS
test.removeListener(this::onChangeTest);
test.set(true);
test.set(false);

System.out.println("\nTest 3\tAdd the listener again, but now i have two listener but I want only one!"); //NON-NLS
test.addListener(this::onChangeTest);
test.set(true);
test.set(false);
}

private void onChangeTest(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
System.out.println("observable = [" + observable + "], oldValue = [" + oldValue + "], newValue = [" + newValue + "]"); //NON-NLS
}

public static void main(String[] args) {
new PropListenerTest();
}
}
结果如下
Test 1  add the listener
observable = [BooleanProperty [value: true]], oldValue = [false], newValue = [true]
observable = [BooleanProperty [value: false]], oldValue = [true], newValue = [false]

Test 2 remove the listener, but not possible! Why?
observable = [BooleanProperty [value: true]], oldValue = [false], newValue = [true]
observable = [BooleanProperty [value: false]], oldValue = [true], newValue = [false]

Test 3 Add the listener again, but now i have two listener but want only one
observable = [BooleanProperty [value: true]], oldValue = [false], newValue = [true]
observable = [BooleanProperty [value: true]], oldValue = [false], newValue = [true]
observable = [BooleanProperty [value: false]], oldValue = [true], newValue = [false]
observable = [BooleanProperty [value: false]], oldValue = [true], newValue = [false]
我认为在测试 2 中应该没有结果,在测试 3 中它应该显示与测试 1 中相同的结果。
我不知道我做错了什么。有人能帮我吗?
谢谢

最佳答案

方法引用的行为就像它每次都创建一个不同的对象一样。

想象一下

ChangeListener<Boolean> changeListener1 = new ChangeListener() {
@Override
public void changed(Observable<? extends Boolean> obs, Boolean oldValue, Boolean newValue) { }
};

ChangeListener<Boolean> changeListener2 = new ChangeListener() {
@Override
public void changed(Observable<? extends Boolean> obs, Boolean oldValue, Boolean newValue) { }
};

然后 changeListener1 == changeListener2changeListener1.equals(changeListener2)会是假的。

相似地,
ChangeListener<Boolean> changeListener1 = this::onChangeTest ;
ChangeListener<Boolean> changeListener2 = this::onChangeTest ;

也会导致 changeListener1 == changeListener2是假的。

如果你这样做
ChangeListener<Boolean> changeListener = this::onChangeTest ;

System.out.println("\nTest 1\tadd the listener"); //NON-NLS
test.addListener(changeListener);
test.set(true);
test.set(false);

System.out.println("\nTest 2\tremove the listener, but not possible! Why?"); //NON-NLS
test.removeListener(changeListener);
test.set(true);
test.set(false);

System.out.println("\nTest 3\tAdd the listener again, but now i have two listener but I want only one!"); //NON-NLS
test.addListener(changeListener);
test.set(true);
test.set(false);

它会按照您的预期运行。

关于JavaFX 属性删除监听器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37739593/

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