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

标签 java swing model-view-controller awt mouseevent

我正在编写一个程序,其中需要通过单击某些元素来选择它们。我使用 MVC 原则来做到这一点。我有以下模型类

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

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

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

最佳答案

首先,我在您的代码中缺少的是有关更改的信息。没有参数的 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);
    }
}

现在,您的鼠标 Controller 在单击鼠标时调用模型的方法:

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

View 代码应该注册一个监听器,以便在 Controller 更改时收到通知:

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

关于Java MVC : How to set changed the main model class properly when another class changed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50873422/

相关文章:

java - 如何为我的 android 应用程序制作推送通知服务器?

java - 获取意外的 JDWP 错误 : 103 while trying to upload an image using retrofit to an api server android?

java - 获取字符串在字符串数组中的索引

java - 关闭 JFrame 后在 main() 中执行操作

php - 这是 MVC 吗?

c# - 如何在 MVC 中使用 Javascript/AJAX 将整个对象传递给 Controller ​​?

java - 在java中使用其他类的变量

Java Swing 可视化编辑器

Java Swing 制作开/关按钮

c# - 如何让 MVC 接受参数中的点?