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

Java MVC: How to set changed the main model class properly when another class changed

我正在编写一个程序,其中需要通过单击来选择某些元素。我正在使用 MVC 原则执行此操作。我有以下模型 class

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

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

基本上,每当我更改模型中的某些内容时,它都会相应地更新视图。 现在,我有一个 class Selecter,它是 MouseAdapter 的简单扩展,并添加了一些检查输入的功能。我最好在 Selecter class 中跟踪当前选定的对象,而不是在 Model 中,只是为了将它们全部分开。但是如果我想在选中对象时改变选中对象的颜色,我需要调用 model.setChanged();model.notifyObservers(); (其中 model 是传递给 Model 的对象通过),我真的不喜欢。 有没有不违反 MVC 的正确方法?

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

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
    }
});