加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 04:34:32 所属栏目:Java 来源:网络整理
导读:我尝试添加,删除并再次添加一个 JavaFx BooleanProperty的监听器,但它不起作用. 这是我的代码 公共类PropListenerTest { BooleanProperty test = new SimpleBooleanProperty(false);public PropListenerTest() { System.out.println("nTest 1tadd the list
我尝试添加,删除并再次添加一个 JavaFx BooleanProperty的监听器,但它不起作用.

这是我的代码

公共类PropListenerTest {

BooleanProperty test = new SimpleBooleanProperty(false);

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

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

    System.out.println("nTest 3tAdd 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]],newValue = [false]

Test 3  Add the listener again,but now i have two listener but want only one
observable = [BooleanProperty [value: true]],newValue = [true]
observable = [BooleanProperty [value: true]],newValue = [false]
observable = [BooleanProperty [value: false]],newValue = [false]

我认为在测试2中应该没有结果,在测试3中它应该显示与测试1中相同的结果.
我不知道我做错了能有人帮助我吗?

谢谢

解决方法

方法引用将表现为每次都创建一个不同的对象.

想象一下

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

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

然后changeListener1 == changeListener2和changeListener1.equals(changeListener2)将为false.

同样的,

ChangeListener<Boolean> changeListener1 = this::onChangeTest ;
ChangeListener<Boolean> changeListener2 = this::onChangeTest ;

也会导致changeListener1 == changeListener2为false.

如果你这样做

ChangeListener<Boolean> changeListener = this::onChangeTest ;

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

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

System.out.println("nTest 3tAdd 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);

它会表现得像你期望的那样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读