Java MVC:如何在另一个类更改时正确设置更改的主模型类
Posted
技术标签:
【中文标题】Java MVC:如何在另一个类更改时正确设置更改的主模型类【英文标题】:Java MVC: How to set changed the main model class properly when another class changed 【发布时间】:2018-11-25 04:07:40 【问题描述】:我正在编写一个程序,其中一些元素需要通过单击来选择它们。我正在使用 MVC 原则执行此操作。我有以下模型类
public class Model extends Observable
public Model()
....
public void changeSomething()
setChanged();
notifyObservers();
所以基本上,每当我更改模型中的某些内容时,它都会相应地更新视图。
现在,我有一个类Selecter
,它是MouseAdapter
的简单扩展,添加了一些检查输入的功能。最好,我想在Selecter
类中跟踪当前选定的对象,而不是在Model
中,只是为了将它们分开。但是如果我想在选择对象时更改所选对象的颜色,我需要调用model.setChanged();
和model.notifyObservers();
(其中model
是通过的Model
对象),我真的很不喜欢。
在不违反MVC的情况下,有没有合适的方法?
【问题讨论】:
您可能需要JToggleButton
或JCheckBox
而不是Selecter
?
嗯,它不是一个按钮。它是一个显示为矩形的自定义对象。我已经点击并选择了工作。我只需要一种优雅的方式来更新视图类。
【参考方案1】:
首先,我在您的代码中错过的是有关更改的信息。 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
);
【讨论】:
谢谢!这既聪明又清晰。关于 setChanged(),这就是我们在课堂上一直坚持的方式,我没有费心去查找有关它的任何信息。所以也感谢你让我这样做!以上是关于Java MVC:如何在另一个类更改时正确设置更改的主模型类的主要内容,如果未能解决你的问题,请参考以下文章
如何更改 SQL Developer 的设置以正确识别当前版本的 SDK