我需要一个用于BitSet的JavaFX Property,以便为BitSet中的每个位创建一个具有切换按钮的TableColumn。我已经实现了Property<BitSet>,但即使有了oracle文档,一些接口方法的含义和用法仍然让我摸不着头脑,因为对我来说,这一切看起来都是多余的样板。请告诉我,我是否在实现的正确轨道上,以及我可以改进的地方。我还没有实现绑定,因为我不希望在我的用例中需要它们。
import java.util.*;
import javafx.beans.InvalidationListener;
import javafx.beans.property.Property;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
public class BitSetProperty implements Property<BitSet>
{
private BitSet value;
private final Set<ChangeListener<? super BitSet>> changeListeners = new HashSet<>();
private final Set<InvalidationListener> invalidationListeners = new HashSet<>();
@Override public Object getBean() {return value;}
@Override public String getName() {return "what shall I return here?";}
@Override public void addListener(ChangeListener<? super BitSet> listener) {changeListeners.add(listener);}
@Override public void removeListener(ChangeListener<? super BitSet> listener) {changeListeners.remove(listener);}
@Override public BitSet getValue()
{
return (BitSet)value.clone();
}
@Override public void addListener(InvalidationListener listener) {invalidationListeners.add(listener);}
@Override public void removeListener(InvalidationListener listener) {invalidationListeners.remove(listener);}
@Override public void setValue(BitSet value)
{
if(!value.equals(this.value))
{
changeListeners.stream().forEach(cl->cl.changed(this, this.value, (BitSet)value.clone()));
invalidationListeners.stream().forEach(il->il.invalidated(this));
}
this.value=value;
}
@Override public void bind(ObservableValue<? extends BitSet> observable)
{
throw new UnsupportedOperationException();
}
@Override public void unbind()
{
throw new UnsupportedOperationException();
}
@Override public boolean isBound()
{
// TODO Auto-generated method stub
return false;
}
@Override public void bindBidirectional(Property<BitSet> other)
{
throw new UnsupportedOperationException();
}
@Override public void unbindBidirectional(Property<BitSet> other)
{
throw new UnsupportedOperationException();
}
}发布于 2015-09-07 20:10:59
回答我自己的问题时,我误解了属性是如何工作的。我认为它们会在内部状态改变时触发更改事件,但我现在知道它们将内容视为黑盒(我猜假设内容是不可变的),并在内容被替换时触发,这是一个容易得多的问题。然后,我的问题可以使用以下命令来解决:
ObjectProperty<BitSet> property = new SimpleObjectProperty<>();https://stackoverflow.com/questions/31598191
复制相似问题