我正在编写一个程序,需要通过点击它们来选择一些元素。我这样做是使用MVC原理。我有以下Model类
public class Model extends Observable {
public Model() {
....
}
public void changeSomething() {
setChanged();
notifyObservers();
}
}
所以基本上,每当我在模型中更改某些内容时,它都会相应地更新视图。
现在,我有一个类Selecter
,它是MouseAdapter
的简单和扩展,带有一些额外的函数来检查输入。我希望跟踪Selecter
类中当前选定的对象,而不是Model
中的对象,只是为了保持它全部分开。但是,如果我想在选择该对象时更改所选对象的颜色,我需要调用model.setChanged();
和model.notifyObservers();
(其中model
是Model
对象已通过通过),我真的不喜欢。
在没有违反MVC的情况下,有没有正确的方法?
答案 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
}
});