我喜欢使用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


我究竟做错了什么?

最佳答案

setValue()方法需要一个包装的布尔对象。在后台,它使用get()取消包装值。因此,当您使用setValue(true)时,原始元素会自动装箱到值为true的布尔对象中。然后,SimpleBooleanProperty使用.get()将对象解包为基元。您已覆盖get()以始终返回false。

如果逐步执行程序,则会看到在执行setValue(true)时,由于该原因,该值实际上被设置为false

07-24 19:25