2

A 有一个 bean(类似 POJO)并希望为它的 GUI 组件制作模型。所以我需要通知每个属性更改,以便 GUI 组件可以反映。

这个怎么做?我应该将通知和侦听器存储代码放在我的 bean 中吗?但这会使它变得“脏”。可以写一些包装吗?但这会重复 getter 和 setter。

在 Commons 或其他地方是否有任何库和/或辅助对象?

更新

还假设我有AbstractList<E>实现。如何快速“属性化”它,即让它通知听众有关更改?例如,通过射击ListDataEvent. 我知道我可以实施AbstractListModel<E>AbstractList<E>但它看起来更糟。我希望主要保持“pojo-like”......

4

2 回答 2

2

看一下FXCollections(JDK 7):

List<String> list = new ArrayList<String>();

list.add("s1");
list.add("s2");

ObservableList<String> observableList = FXCollections.observableList(list);

observableList.addListener(new ListChangeListener<String>() {
    @Override
    public void onChanged(Change<? extends String> change) {
        while (change.next()) {
            if(change.wasAdded()){
                System.out.printf("added: %s, from: %d, to: %d%n", change.getAddedSubList(), change.getFrom(), change.getTo());
            }else
            if(change.wasReplaced()){
                System.out.printf("replaced: %s, from: %d, to: %d%n", change.getAddedSubList(), change.getFrom(), change.getTo());
            }
        }
    }
});

observableList.add("s3");
observableList.set(1, "s1-new-value");

这将导致输出:

added: [s3], from: 2, to: 3
added: [s1-new-value], from: 1, to: 2
于 2013-11-08T08:07:52.173 回答
2

例如,您可以使用类似的东西PropertyChangeSuppport或滚动自己的东西......

public class Person {

    private String name;
    private final PropertyChangeSupport support;

    public Person() {
        this.support = new PropertyChangeSupport(this);
    }

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        support.addPropertyChangeListener(listener);
    }

    public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
        support.addPropertyChangeListener(propertyName, listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        support.removePropertyChangeListener(listener);
    }

    public void setName(String value) {
        if (name == null ? value != null : !name.equals(value)) {

            String old = name;
            name = value;
            support.firePropertyChange(name, old, name);

        }
    }

    public String getName() {
        return name;
    }                       
}
于 2013-11-08T08:28:25.110 回答