2012-08-03 114 views
2

我最近開始使用Java中的Swing應用程序,目前主要使用JTables。來自.NET WPF背景的世界,這是使用MVVM設計模式構建的巨大架構,我正在與Swing一點點掙扎。原因是,對於JTables,看起來有許多方法可以實現Model-View-Controller模式(至少在查看可用類後我感覺到了什麼)。因此,我想分享幾種可能的通用方法,這些方法可以通過我的想法以及我目前看到的方式,以及收集有關此問題的意見,這可能適用於其他控件/應用程序:Java Swing中正確的模型 - 視圖 - 控制器模式

  1. JTable < - > TableModel:在這種方法中,我們只有某種意義上的視圖和模型。 TableModel具有更新的有用方法,例如setValueAt,您可以在其中放置任何UI更新的處理代碼,然後可以在Model更新上引發事件。我想這是DefaultTableModel的默認實現。所以模型處理直接在單元格(數據)上進行的更新。 視圖(JTable)將在可用作View的類的後面的代碼中註冊任何進一步的處理程序。代碼看起來是這樣的:

    類視圖擴展JPanel {

    public View(TableModel model) { 
        super(new BorderLayout(1, 0)); 
        JTable table = new JTable(model) { 
    
         //override anything you need here - renderers etc. 
    
        }; 
    
        //add any listeners here 
    } 
    //Listeners that would perform actions on events, and possibly call model to update 
    

    我喜歡這就是我們只有兩個地方把代碼放到,並有一個JTable之間的自然聯繫在實現中提供了TableModel,即setValueAt方法。 我討厭這個雖然是,在我看來,完全無視MVC模式,這在MVVM的情況下,結構化你的代碼出色

  2. 的JTable - >控制器< - >的TableModel:添加其他層執行邏輯 我們現在將有一箇中央控制器,它將實例化(或接收在構造函數中注入的)視圖和模型。此外,它將在視圖上註冊任何監聽器,並且每當發生這種情況時,我們會在模型上調用一些更新方法。也許是另一種方法是從視圖的註冊的處理程序控制器向前事件,但這需要以知道有關控制器... 我猜事件的發射返回查看將保持在模型上,當我們調用update方法時,除非我們簡單地在表上調用tableChanged方法。然而,這卻破壞了TableModel實現中免費提供的事件機制的整體性... 此處必須考慮的其他事情是,我們需要注意每次處理時從視圖索引轉換爲模型索引>的TableModel - - 從View(我不能在此刻想到的可能是其他因素)

  3. JTable中<事件>商業模式:我們使用的TableModel作爲協調和保持我們的商業知識別處 到目前爲止我假定TableModel包含原始業務數據,例如以List的形式。現在,我們可以在TableModel上使用setValueAt方法+註冊處理程序,隨後修改底層BusinessModel,封裝List。 我唯一擔心的是TableModel 應該是真的是模型而不是控制器。

這些是我對這件事的看法。我非常期待你的回覆和評論。

+0

另請參閱[* Swing Architecture Overview *](http://java.sun.com/products/jfc/tsc/articles/architecture/)。 – trashgod 2012-08-03 12:01:51

+0

輝煌的資源,實際上說在大多數情況下符合版本1我猜 – Bober02 2012-08-03 13:17:51

回答

2

Swing MVC模型,據我所知,它並不嚴格區分視圖和模型,也就是說兩者之間有一些溝通以避免不必要地通過控制器。當我使用它時,JTable是視圖,TableModel是模型,並且您的聽衆充當控制器,用於需要更多控制的事情,而不僅僅是'顯示模型中的內容'。

+0

我也看到了這種方法,我只是想看看是否有人符合我提出的任何其他建議 – Bober02 2012-08-03 11:38:25

+1

Swing使用的模式將視圖和控制器合併成一個對象因此,Swing避免「必然要經過控制器」或您的「聽衆充當控制器」並非如此。相反,控制器內置於視圖中。閱讀:http://www.oracle.com/technetwork/java/architecture-142923.html – Jason 2012-12-12 22:53:02

+0

我發現試圖將JTable變成嚴格的MVC範例,導致代碼非常混亂。最近是TableModelEvent處理程序的重疊,導致無限循環。我的「控制器」和我的CustomJTable類錯誤地處理TableModelEvents。我現在將我的應用程序更改爲CustomJTable擴展JTable類,它將處理TableModelEvents。然後,我的「控制器」將處理來自應用程序其他部分的影響TableModel,TableView或兩者的事件。感謝Bober02和Oracle引用Jason的最初問題。 – bitsdanceforme 2013-03-25 16:41:35

2

只是爲了澄清,Swing的separable model architecture夫婦模型和視圖鬆散使用observer pattern,如圖所示here。通常EventListenerList在內部使用,但其他實現方式被提及爲here。 UI委託控制用戶與視圖的交互。這允許組件在不同平臺上正確工作,正如用戶所感知的那樣。

因此,該模型通過特定的Listener接口與視圖組件註冊?

不,每個模型在內部維護一個EventListenerList;每個相應的視圖通過模型的addXxxListener()方法將自己添加爲偵聽器。大多數組件還使用PropertyChangeLister作爲綁定屬性。