javafx - 实现 ObservableValue

标签 javafx listener observable changelistener

我有这个对象:

public class Oggetto{
    private int value;
    private boolean valid;

    public Oggetto(int value, boolean valid) {
        this.value = value;
        this.valid = valid;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public boolean isValid() {
        return valid;
    }

    public void setValid(boolean valid) {
        this.valid = valid;
    }    
}

我想实现一个 Observable 对象,当内部发生变化时触发事件 这是可观察的对象:

public class OggettoOsservabile implements ObservableValue<Oggetto>{

    private Oggetto value;

    OggettoOsservabile(int i, boolean b) {
        this.value=new Oggetto(i, b);
    }
    @Override
    public void addListener(ChangeListener<? super Oggetto> listener) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    @Override
    public void removeListener(ChangeListener<? super Oggetto> listener) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    @Override
    public Oggetto getValue() {
        return value;
    }
    @Override
    public void addListener(InvalidationListener listener) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    @Override
    public void removeListener(InvalidationListener listener) {
        throw new UnsupportedOperationException("Not supported yet."); 
    }  
}

我不知道如何继续检测“Oggetto”类中的更改并向寄存器监听器发送通知。

OggettoOsservabile oggetto = new OggettoOsservabile(1, false);              
oggetto.addListener(new ChangeListener<Oggetto>() {
     public void changed(ObservableValue<? extends Oggetto> observable, Oggetto oldValue, Oggetto newValue) {
           System.out.println("changed " + oldValue + "->" + newValue);   
     }
});

最佳答案

使用标准 JavaFX 属性实现您的 Oggetto 类:

import javafx.beans.property.BooleanProperty ;
import javafx.beans.property.IntegerProperty ;
import javafx.beans.property.SimpleBooleanProperty ;
import javafx.beans.property.SimpleIntegerProperty ;

public class Oggetto {

    private final IntegerProperty value = new SimpleIntegerProperty() ;

    public final IntegerProperty valueProperty() {
        return value ;
    }

    public final int getValue() {
        return value.get();
    }

    public final void setValue(int value) {
        this.value.set(value);
    }

    private final BooleanProperty valid = new SimpleBooleanProperty();

    public final BooleanProperty validProperty() {
        return valid ;
    }

    public final boolean isValid() {
        return valid.get();
    }

    public final void setValid(boolean valid) {
        this.valid.set(valid);
    }

    public Oggetto(int value, boolean valid) {
        setValue(value);
        setValid(valid);
    }
}

这可能就是您所需要的,因为您只需观察各个属性即可。但是,如果您想要一个在任一属性发生更改时通知失效监听器的类,您可以扩展 ObjectBinding:

import javafx.beans.binding.ObjectBinding ;

public class OggettoObservable extends ObjectBinding {

    private final Oggetto value ;

    public OggettoObservable(int value, boolean valid) {
        this.value = new Oggetto(value, valid);
        bind(this.value.valueProperty(), this.value.validProperty());
    }

    @Override
    public Oggetto computeValue() {
        return value ;
    }
}

关于javafx - 实现 ObservableValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26313756/

相关文章:

java - "Exception in thread "main"java.lang.NoClassDefFoundError : javafx/embed/swing/JFXPanel"mean and how do I fix it? 是什么意思

java - Webview JavaFX 与进程一起运行

java - 我不明白使用新参数单击 CheckBox 的模式

Java:如何判断何时移动 JFrame 或 JDialog?

javascript - RxJS:重试链的一部分

angular - 如何正确取消请求?

具有多个打开 Pane 的 JavaFX Accordion

java - 为什么我不能从事件监听器调用方法,但可以在类的其他地方调用方法?

python - Python 中的事件监听和处理

angular - 如何在 Angular 9 中将分页与 Observables 和 AsyncPipe 结合起来?