Java MVC:如何设置在另一个类更改时正确更改主模型类

时间:2018-06-15 10:09:18

标签: java swing model-view-controller awt mouseevent

我正在编写一个程序,需要通过点击它们来选择一些元素。我这样做是使用MVC原理。我有以下Model类

public class Model extends Observable {
    public Model() {
        ....
    }

    public void changeSomething() {
        setChanged();
        notifyObservers();
    }
}

所以基本上,每当我在模型中更改某些内容时,它都会相应地更新视图。 现在,我有一个类Selecter,它是MouseAdapter的简单和扩展,带有一些额外的函数来检查输入。我希望跟踪Selecter类中当前选定的对象,而不是Model中的对象,只是为了保持它全部分开。但是,如果我想在选择该对象时更改所选对象的颜色,我需要调用model.setChanged();model.notifyObservers();(其中modelModel对象已通过通过),我真的不喜欢。 在没有违反MVC的情况下,有没有正确的方法?

1 个答案:

答案 0 :(得分:0)

首先,我在代码中遗漏的是有关更改的信息。没有参数的setChanged()看起来很难看。我建议您为模型类进行以下更改:

public class SelecterModel {
    public static final String SELECTED_PROPERTY = "selected";
    private final PropertyChangeSupport support = new PropertyChangeSupport(this);
    private boolean selected;

    public boolean isSelected() {
        return selected;
    }

    public boolean setSelected(boolena selected) {
        boolean old = this.selected;
        this.selected = selected;
        support.firePropertyChange(SELECTED_PROPERTY, old, selected);
    }

    public void addSelectionChangeListener(PropertyChangeListener pcl) {
        support.addPropertyChangeListener(SELECTED_PROPERTY, pcl);
    }

    public void removeSelectionChangeListener(PropertyChangeListener pcl) {
        support.removePropertyChangeListener(SELECTED_PROPERTY, pcl);
    }
}

现在鼠标单击鼠标控制器会调用模型方法:

model.setSelected(!model.isSelected());

当控制器被更改时,视图代码应该注册要通知的侦听器:

model.addSelectionChangeListener(new PropertyChangeListener() {
    public void propertyChange(PropertyChangeEvent evt) {
        setBackground(Boolean.TRUE == evt.getNewValue()? Color.GREEN : Color.YELLOW);
        // probably some another changes
    }
});