首页 > 解决方案 > 向 Java BooleanProperty 类添加自定义方法

问题描述

我喜欢使用 Property 类,但我不喜欢做简单的事情需要多长的句子。

我想扩展 SimpleBooleanProperty 类,而不是需要做这样的事情:

myProperty.setValue(!myProperty.getValue());

我可以这样做:

myProperty.flip();

所以,我尝试扩展 SimpleBooleanClass,但它不起作用。

这是我在下面发布的相关结果的尝试:

import javafx.beans.InvalidationListener;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;

public class CBP extends SimpleBooleanProperty {
    @Override public void bind(ObservableValue<? extends Boolean> observable) {}
    @Override public void unbind() {}
    @Override public boolean isBound() {return false;}
    @Override public Object getBean() {return null;}
    @Override public String getName() {return null;}
    @Override public boolean get() {return false;}
    @Override public void set(boolean value) {}
    @Override public void addListener(ChangeListener<? super Boolean> listener) {}
    @Override public void removeListener(ChangeListener<? super Boolean> listener) {}
    @Override public void addListener(InvalidationListener listener) {}
    @Override public void removeListener(InvalidationListener listener) {}

    public void flip(){
        super.setValue(!super.getValue());
    }
}

使用它的这种尝试产生了如下所示的输出:

CBP cbp = new CBP();
cbp.setValue(true);
if (cbp.getValue().equals(true)) System.out.println("TRUE"); else System.out.println("FALSE");
cbp.flip();
if (cbp.getValue().equals(true)) System.out.println("TRUE"); else System.out.println("FALSE");

这是输出:

FALSE
FALSE

我究竟做错了什么?

标签: javajavafx

解决方案


setValue()方法需要一个包装的布尔对象。在引擎盖下,它用于get()展开值。因此,当您使用 时setValue(true),您的原语将被自动装箱为具有 value 的 Boolean 对象true。然后,SimpleBooleanProperty用于.get()将对象解包为基元。您已get()被覆盖以始终返回 false。

如果你单步执行你的程序,你会看到当setValue(true)被执行时,值实际上是false因为这个而设置的。


推荐阅读