【问题标题】:JavaFX property remove listener not workingJavaFX 属性删除侦听器不起作用
【发布时间】:2016-10-10 21:52:12
【问题描述】:

我尝试向 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 相同的结果。 我不知道我做错了什么。有人可以帮我吗?

谢谢

【问题讨论】:

    标签: javafx properties listener


    【解决方案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);
    

    它将按照您的预期运行。

    【讨论】:

    • 谢谢!效果很好,我不知道这个对不起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多