2013-07-10 23 views
0

到目前爲止,我已經實現了基於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()方法的主要原因視圖和模型?

+1

爲了更好地幫助發佈一個[SSCCE](http://sscce.org/),簡短,可運行,可編譯,否則可能是關於猜測,請[請參閱示例](http:// stackoverflow。 com/q/8169964/714968) – mKorbel

+2

另請參閱示例[此處](http://stackoverflow.com/a/2687871/230513)和[這裏](http://stackoverflow.com/a/3072979/230513)。 – trashgod

+0

好的,我想沒有必要在模型上實現propertyChange()。只需從控制器調用模型方法即可。而在相反的方向上(從模型到視圖),它可以直接完成,只需將視圖聲明爲模型的偵聽器並在視圖中實現propertyChange()。 – capovawi

回答

4

在MVC中,視圖監聽模型並相應地更新自己。控制器負責處理用戶輸入以修改模型。模型負責在適當事件發生變化時觸發。

這可能是在視圖和模型上實現propertyChange()方法的主要原因?

  • 上查看:精細,在屬性更改事件,認爲應該進行自我更新相應
  • 型號:沒有理由實施該方法,因爲該模型將永遠不會偵聽屬性更改。
+0

有多種方式來實現MVC。我的意思是,不是MVC,而是與MVC非常相似的不同方法。就我而言,視圖和模型之間的通信是通過控制器以兩種方式處理的。視圖沒有直接訪問模型,因此模型需要實現監聽器。 – capovawi

+0

@capovawi Views應該可以訪問模型。不要修改模型本身,而是要讀取其當前狀態並相應地更新視圖。查看[此圖片](http://img.my.csdn.net/uploads/201112/31/0_1325315861u0Zu.gif)以獲得更好的理解。 –

+0

關於視圖和模型之間的通信,我有一個疑問:我正在處理包含多個表的一個視圖。每個表都有自己的tableModel,因此我有幾個模型!有時我需要過濾表中顯示的信息,因此我使用TableRowSorter 。但到目前爲止,我已經在視圖中實現了過濾方法,並且我想在模型中執行過濾方法會更加正確。我對嗎? – capovawi