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的情况下,有没有合适的方法?

【问题讨论】:

您可能需要JToggleButtonJCheckBox 而不是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

如何在 MVC 3 中正确进行长轮询

即使焦点在另一个控件上,如何更改列表视图选定的行背景颜色?

Redux:如何在另一个值更改时更新一个值?

MVC3 - UpdateModel ...如何更改传入数据?

键盘输入时,如何在Ajax调用URL更改后停止MVC页面刷新