2013-01-08 39 views
1

我的任務是製作一個基本上需要用戶輸入一點點的GUI,並對正在運行程序的計算機可訪問的各種驅動器執行一些文件夾/文件操作。在設計這個GUI時,我開始意識到MVC會讓我的生活變得更加輕鬆,任何決定修改代碼的人都會變得更加輕鬆,但我無法真正瞭解如何通過NetBeans完成此任務。使用NetBeans GUI構建器使用Java MVC方法進行編程

我已經完成了一些關於此主題的閱讀,但我無法真正看到關於這是否可以在NetBeans上完成的明確答案。當然,如果我以編程方式構建GUI,它可以完成,但這有點挫敗了我選擇使用NetBeans的目的。

回答

4

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越來越複雜,你可以把這些東西都分解出來,但是它的工作非常適合合理數量的屏幕等等。

+0

我已經開始重新組織我的代碼,實際上我將模型和控制器結合起來,同時保持視圖分離。這是不是皺起了眉頭?該模型沒有什麼複雜的,我真的沒有看到這個代碼被重用。 – Franklin

+1

在30,000英尺處,該模型是MVC系統的更通用和可重用的部分。 V和C有更緊密的約束傾向。只是世界的方式。但那就是說,做下流動的事。如果這是一種痛苦,它很快就會顯現出來。如果不是,那顯然它並不擔心。 –

2

Netbeans可以幫助您利用其代碼庫:GUI Builder(1)和NB Platform(2)有兩種方式。 (1)在Java世界中,Netbeans曾經是一個更好的拖放式GUI構建器,代號爲Matisse。這就是說,我使用它已經很長時間了 - 而且我從不喜歡生成的代碼,它不是很理解(這當然不是自動生成的代碼的目的)。對於更復雜的用戶界面,我們手工編寫了佈局,工作也是可以承受的,即使不是最愉快的。對於簡單的用戶界面,我會再次嘗試GUI生成器,對於有很多連線邏輯的複雜用戶界面,我可能仍然會手動編寫它。要查看GUI生成器的工作方式,請查看許多教程視頻之一,例如,這一個:

(2)NetBeans平臺是NetBeans中,什麼RCP是在Eclipse。爲IDE開發的一組豐富的組件,可以重複使用。我簡要地看了一下,如果項目沒有改變過程,我們會使用它。也許這個問題可以在這方面更多地瞭解:Which Rich Client Platform to use?


關於MVC。有一個通用的Swing應用程序框架JSR 296,看起來有點有前途,但是是withdrawn in 2011。這並沒有阻止人們去分析和處理它,因爲這個項目顯示:Better Swing Application Framework,在2012年年中發佈。即使你不使用這樣的框架,請不要把所有的代碼放在一個類(作爲你在你的評論中提到),但創建一個簡單的模型/控制器,並保持UI組件分離。它不需要爲一個簡單的應用程序花哨,一個最小的MVC-ish separation of concerns可能就足夠了。

+0

感謝您的信息。我對NetBeans相當流利,所以實際構建GUI不是問題。我主要想知道是否可以將代碼抽象爲模型,視圖和控制器,而不僅僅是一個類,它將所有業務邏輯和視圖信息存儲在一起。我可能將不得不手動編碼,這不應該是一個巨大的破壞。 – Franklin

+0

@Franklin,更新了我的帖子以解決您的評論。 – miku

0

我也遇到了這個問題,我發現了一個鏈接,它提供了一個很好的例子,即如何使用NetBeans GUI Builder從視圖中分離控制器。

這是link