如何在实现基于MVC的GUI时通知更改

时间:2013-07-10 09:44:36

标签: java swing events spring-mvc user-interface

到目前为止,我已经实现了一个基于Swing的GUI,并根据MVC模式,如(here),从两个视图(通过使用JComponents功能)和模型(通过使用PropertyChangeSupport bean)触发事件)。控制器位于中间,监听它们并转发事件,如下所示:

查看

public class GUIview extends JFrame {
    public void propertyChange(final PropertyChangeEvent event) {
        if (event.getPropertyName().equals(GUIcontroller.A1_PROPERTY)) {
            method_a1(event.getNewValue());
        } else if (event.getPropertyName().equals(GUIcontroller.A2_PROPERTY)) {
            method_a2(event.getNewValue());
        }
    }
    public void method_a1() {...}
    public void method_a2() {...}
}

CONTROLLER

public class GUIcontroller implements PropertyChangeListener {

    public static final String A1_PROPERTY = "a1";
    public static final String A2_PROPERTY = "a2";
    public static final String B1_PROPERTY = "b1";
    public static final String B2_PROPERTY = "b2";

    public void propertyChange(PropertyChangeEvent event) {
        if (event.getPropertyName().charAt(0) == 'a') {
            GUIview.propertyChange(event);
        } else if (event.getPropertyName().charAt(0) == 'b') {
            GUImodel.propertyChange(event);
        }
    }
}

MODEL

public class GUImodel {

    public PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
    }
    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
    }
    protected void firePropertyChange(String propertyName, Object oldValue,
            Object newValue) {
        propertyChangeSupport.firePropertyChange(propertyName, oldValue,
                newValue);
    }   
    public void propertyChange(final PropertyChangeEvent event) {

        if (event.getPropertyName().equals(GUIcontroller.B1_PROPERTY)) {
            method_b1(event.getNewValue());
        } else if (event.getPropertyName().equals(GUIcontroller.B2_PROPERTY)) {
            method_b2(event.getNewValue());
        }
    }
    public void method_b1() {...}
    public void method_b2() {...}
}

现在它可以工作,但就我所知(或据我所知),视图应该只包含布局功能,所有工作必须由控制器和模型完成。另一方面,控制器应尽可能薄。

我找不到在视图和模型上实现propertyChange()方法的理由,并从那里进行方法调用,而不是直接从控制器调用这些方法,如下所示:

public class GUIcontroller implements PropertyChangeListener {

    public static final String A1_PROPERTY = "a1";
    public static final String A2_PROPERTY = "a2";
    public static final String B1_PROPERTY = "b1";
    public static final String B2_PROPERTY = "b2";

    public void propertyChange(PropertyChangeEvent event) {
        if (event.getPropertyName().equals(GUIcontroller.A1_PROPERTY)) {
            GUIview.method_a1(event.getNewValue());
        } else if (event.getPropertyName().equals(GUIcontroller.A2_PROPERTY)) {
            GUIview.method_a2(event.getNewValue());
        } else if (event.getPropertyName().equals(GUIcontroller.B1_PROPERTY)) {
            GUImodel.method_b1(event.getNewValue());
        } else if (event.getPropertyName().equals(GUIcontroller.B2_PROPERTY)) {
            GUImodel.method_b2(event.getNewValue());
        }
    }
}

考虑到这两种方法,哪种方法更接近真正的MVC模式?

这可能是在视图和模型上实现 propertyChange()方法的主要原因?

1 个答案:

答案 0 :(得分:4)

在MVC中,Views会听取模型并相应地更新自己。控制器负责处理用户输入以修改模型。模型负责在适当的事件发生变化时触发它。

  

这可能是在视图和模型上实现propertyChange()方法的主要原因吗?

  • 在视图上:很好,在属性更改事件时,视图应相应地自行更新
  • 在模型上:没有理由实现该方法,因为模型永远不会监听属性更改。