Netbeans很好做到這一點。
要實現的關鍵是,雖然所有基本的Swing組件都是MVC,但大多數情況下,您不會以這種方式與它們進行交互。一個簡單的文本字段有它的內部模型,但該模型不是你的模型,文本字段更像是一個原語。
您的模型處理更高級別的事件(按鈕操作和不是),而不是按鈕按鈕和箭頭移動和鼠標單擊。
因此,對於高級MVC,通信的主要機制是通過PropertyChangeListeners。構建應用程序的基本任務是將各種數據元素的PCL以及它們的GUI組件連接在一起。
例如,一個簡單的例子是你有一個項目列表。並且該列表通過JTable呈現在屏幕上,並且該表位於JPanel上。
您的列表有它自己的模型,即它不僅僅是一個Java列表。它不是List,因爲標準Java列表不支持PCL通知。但是你的模型顯然會包裝這樣一個List。
現在,下一個問題是如何連接JTable以便與List模型關聯。
一,你可以繼承JTable並綁定到你的模型。或者,更簡單地說,您將JTable用作基元,並讓封閉的JPanel管理模型和JTable之間的交互。
這意味着要具備的JPanel實施的PropertyChangeListener,然後,接線的一切行動的時候,你做這樣的事情:
ListModel myModel = new ListModel();
ListPanel myPanel = new ListPanel();
myModel.addPropertyChangeListener(myPanel);
現在,只要您的ListModel的改變,是將通知ListPanel。
在您ListPanel你可以有這樣的:
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(ListModel.CHANGED)) {
ListModel model = (ListModel) evt.getSource();
DefaultTableModel tm = (DefaultTableModel) listTable.getModel();
tm.setRowCount(0);
for (String s : model.getList()) {
tm.addRow(new Object[]{s});
}
}
}
現在,你可以看到這只是重新加載整個表的模式,但你可以讓你的屬性更改細粒,只要你想。你也可以看到,如果這是其他模型(比如Person或者其他),你可以在面板上填充單獨的文本字段以及其他內容。
這是一個非常簡單的圖形用戶界面,但它顯示瞭如何將所有電線連接在一起的基本原理。我認爲在Swing的例子中有一點這是失敗的,這些例子對於一個面板屏幕來說非常棒,但當你開始添加其他視圖時,根本不會擴展。
你的JPanels基本上變成了VC的組合,因爲你的GUI越來越複雜,你可以把這些東西都分解出來,但是它的工作非常適合合理數量的屏幕等等。
我已經開始重新組織我的代碼,實際上我將模型和控制器結合起來,同時保持視圖分離。這是不是皺起了眉頭?該模型沒有什麼複雜的,我真的沒有看到這個代碼被重用。 – Franklin
在30,000英尺處,該模型是MVC系統的更通用和可重用的部分。 V和C有更緊密的約束傾向。只是世界的方式。但那就是說,做下流動的事。如果這是一種痛苦,它很快就會顯現出來。如果不是,那顯然它並不擔心。 –