我最近開始使用Java中的Swing應用程序,目前主要使用JTables。來自.NET WPF背景的世界,這是使用MVVM設計模式構建的巨大架構,我正在與Swing一點點掙扎。原因是,對於JTables,看起來有許多方法可以實現Model-View-Controller模式(至少在查看可用類後我感覺到了什麼)。因此,我想分享幾種可能的通用方法,這些方法可以通過我的想法以及我目前看到的方式,以及收集有關此問題的意見,這可能適用於其他控件/應用程序:Java Swing中正確的模型 - 視圖 - 控制器模式
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的情況下,結構化你的代碼出色
的JTable - >控制器< - >的TableModel:添加其他層執行邏輯 我們現在將有一箇中央控制器,它將實例化(或接收在構造函數中注入的)視圖和模型。此外,它將在視圖上註冊任何監聽器,並且每當發生這種情況時,我們會在模型上調用一些更新方法。也許是另一種方法是從視圖的註冊的處理程序控制器向前事件,但這需要以知道有關控制器... 我猜事件的發射返回查看將保持在模型上,當我們調用update方法時,除非我們簡單地在表上調用tableChanged方法。然而,這卻破壞了TableModel實現中免費提供的事件機制的整體性... 此處必須考慮的其他事情是,我們需要注意每次處理時從視圖索引轉換爲模型索引>的TableModel - - 從View(我不能在此刻想到的可能是其他因素)
JTable中<事件>商業模式:我們使用的TableModel作爲協調和保持我們的商業知識別處 到目前爲止我假定TableModel包含原始業務數據,例如以List的形式。現在,我們可以在TableModel上使用setValueAt方法+註冊處理程序,隨後修改底層BusinessModel,封裝List。 我唯一擔心的是TableModel 應該是真的是模型而不是控制器。
這些是我對這件事的看法。我非常期待你的回覆和評論。
另請參閱[* Swing Architecture Overview *](http://java.sun.com/products/jfc/tsc/articles/architecture/)。 – trashgod 2012-08-03 12:01:51
輝煌的資源,實際上說在大多數情況下符合版本1我猜 – Bober02 2012-08-03 13:17:51