我正在编写一个程序,其中需要通过单击某些元素来选择它们。我使用 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/