【问题标题】:Implementing an ObservableValue实现一个 ObservableValue
【发布时间】:2014-12-06 11:16:03
【问题描述】:

我有这个对象:

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 listener observable changelistener


    【解决方案1】:

    使用标准 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 ;
        }
    }
    

    【讨论】:

    • 谢谢!你的实现是有道理的,顺便说一句,我不明白我什么时候应该实现 Observable 和 ObservableValue。
    • API 对我来说有点太细了。但是Observable 只是在无效时通知听众的东西。 ObservableValue 额外包装了一个值(它有一个getValue() 方法,并且可以在值实际更改时通知ChangeListeners。
    • 当我这样做时,我得到一个警告,ObjectBinding 应该有一个类型参数。所以应该是extends ObjectBinding&lt;Oggetto&gt;
    【解决方案2】:
    import javafx.beans.InvalidationListener;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    
        public class VerySimply implements ObservableValue<Integer> {
        private int newValue;
        public ChangeListener<Integer> listener = new ChangeListener<Integer>() {
            @Override
            public void changed(ObservableValue<? extends Integer> observable, Integer oldValue, Integer newValue) {
                System.out.println(" :) "+ newValue.intValue());
            }
        };
    
        @Override
        public void addListener(ChangeListener<? super Integer> listener) {
    
        }
    
        @Override
        public void removeListener(ChangeListener<? super Integer> listener) {
    
        }
    
        @Override
        public Integer getValue() {
            return newValue;
        }
    
        @Override
        public void addListener(InvalidationListener listener) {
    
        }
    
        @Override
        public void removeListener(InvalidationListener listener) {
    
        }
    
        public void setNewValue(int newValue) {
            int oldValue = this.newValue;
            this.newValue = newValue;
            listener.changed(this,oldValue,this.newValue);
    
        }
    }
    

    【讨论】:

    • 并在类中使用 main 方法:VerySimply x = new VerySimply(); x.addListener(x.listener); x.setNewValue(10000);
    • 完全错误,这不是 ObservableValue 的有效实现:它违反了它的通知合同(这是拥有 observable 的全部本质)。
    猜你喜欢
    • 2017-08-19
    • 1970-01-01
    • 2015-03-07
    • 2011-08-25
    • 2011-05-07
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多