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