到目前爲止,我已經實現了基於Swing的GUI,並且根據像(here)這樣的MVC模式,從兩個視圖(通過使用JComponents功能)觸發事件,模型(通過使用PropertyChangeSupport bean)。該控制器是在中間,聽他們和轉發活動,具體如下:如何在實現基於MVC的GUI時通知更改
VIEW
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() {...}
}
控制器
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);
}
}
}
模型
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()方法的主要原因視圖和模型?
爲了更好地幫助發佈一個[SSCCE](http://sscce.org/),簡短,可運行,可編譯,否則可能是關於猜測,請[請參閱示例](http:// stackoverflow。 com/q/8169964/714968) – mKorbel
另請參閱示例[此處](http://stackoverflow.com/a/2687871/230513)和[這裏](http://stackoverflow.com/a/3072979/230513)。 – trashgod
好的,我想沒有必要在模型上實現propertyChange()。只需從控制器調用模型方法即可。而在相反的方向上(從模型到視圖),它可以直接完成,只需將視圖聲明爲模型的偵聽器並在視圖中實現propertyChange()。 – capovawi