2010-03-21 39 views
2

我試圖通過拆分那些可能隨時間而改變的元素來「面向未來」的應用程序。在我的應用程序中,我需要能夠適應輸出格式的變化(例如,今天我輸出到CSV文件,將來可能需要直接輸出到SQL Server數據庫或Web服務等) 。如何在運行時集成來自不同類的GUI元素?

我正在通過定義一個抽象類(「OutputProvider」)來處理這個問題,我將爲每個個案分類。這讓我難以理解的一個方面是如何提供特定於每個具體類的配置GUI。我有一個設置對話框,帶有用於輸出配置的選項卡。在該選項卡上,我打算提供一個下拉式選擇提供程序和其下的JPanel以保存特定於提供程序的GUI的內容。我如何在運行時在該面板中獲得正確的GUI,並使其在事件方面正確運行?

此外,如果有一種方法可以做到這一點,那麼爲了添加對新提供者的支持,我可以簡單地提供一個新的jar或class文件以便放入特定的文件夾,應用程序可以選擇那在啓動時。

我正在使用NetBeans和Swing。

+1

我建議你先獲得應用程序 - 例如 - 具體的CSV作家。然後,您可以看到CSV編寫器掛接到應用程序的位置,以瞭解不同實例需要插入的位置。 – msw

回答

1

阿德里安的解決方案是好的。只是延長您OutputProvider責成以下兩種方法:

/** 
* returns a JPanel that shows configuration options for this outputprovider, 
* after initializing the JPanel with current output options 
*/ 
public JPanel getConfigurationPanel(); 
/** 
* configures output options using values in configPanel, previously 
* requested through getConfigurationPanel 
*/ 
public void configureFromPanel(JPanel configPanel) throws BadConfigException; 

,包括返回的JPanel在輸出配置對話框中的相應字段。當用戶按下「接受」按鈕時,configureFromPanel()被調用。

1

也許你可以在OutputProvider類上有一個抽象方法,它返回一個包含該提供者的配置選項的JPanel。如果你想分離更多,而不是返回一個JPanel,該方法可以返回一個類/類的名稱。然後可以在運行時創建一個實例。

This question可能會回答您問題的第二部分。

1

對我來說很完美Factory Design Pattern候選人 例如你似乎想打電話給這樣(僞代碼:')

//get the writer responsible for storing to any media ... 
Writer objWriter = new Writer (configForCsvOrDb) ; 
//perform the actual write according to the type of storage 
objWriter.Write(objToWrite) ; 
1

這看起來像strategy pattern的好例子。您可以使用類似getOutputPanel()的方法來定義OutputProviderStrategy

相關問題