2010-04-13 36 views
7

我有一個Swing應用程序,我想從意大利麪轉換爲使用依賴注入與Guice。使用Guice來提供像配置和任務隊列這樣的服務很順利,但我現在開始使用應用程序的GUI,並且不確定如何繼續。如何在Swing應用程序中使用Guice

該應用程序基本上是一個JFrameJTabbedPane中的一堆選項卡。每個選項卡都是一個獨立的JPanel子類,用於在按下某些按鈕時,佈局各種組件並需要服務來執行操作。

在目前的應用中,這看起來有點像這樣:

@Inject 
public MainFrame(SomeService service, Executor ex, Configuration config) { 
    tabsPane = new JTabbedPane(); 

    // Create the panels for each tab and add them to the tabbedpane 
    somePanel = new SomeTabPanel(service, ex, config); 
    tabsPane.addTab("Panel 1", somePanel); 

    someOtherPanel = new SomeOtherTabPanel(service, ex, config); 
    tabsPane.addTab("Panel 2", someOtherPanel); 

    ... do more stuff 
} 

顯然,這並不完全遵循DI最佳實踐。我不想要@Inject這些選項卡,因爲那會給我一個帶有幾十個參數的構造函數。我希望使用Guice將所需的依賴項注入到我需要的任何選項卡對象中,而不必將所有這些依賴項都傳遞給選項卡構造函數。

所有依賴於標籤的對象是我Module知道的服務,所以基本上所有我認爲我想要做的就是要求吉斯爲所需對象,並讓他們構建了我。

+0

你可能想看看Guts-GUI項目(我自己);這是一個用於編寫Swing應用程序的基於Guice的框架。雖然尚未正式發佈,但目前還是可行的。 URL是:http://kenai.com/projects/guts/pages/Guts-gui – jfpoilpret 2010-04-14 02:46:31

+0

我已經看了一下,但看起來像這將需要完全重寫應用程序。例如,我已經有了一個非常強大的任務執行系統和事件總線。該應用程序並不大(大約20kloc),但仍然足夠大,不會考慮重新開始。 – 2010-04-14 09:02:09

回答

3

您可以使用Multibinding將所有選項卡綁定爲Set?如果他們實現了某個界面,允許您獲取用於該選項卡的名稱,則可以通過添加該組中的選項卡來循環。儘管訂購標籤,但你可能需要弄清楚一些事情。

+0

我會考慮一種可能性。我相信多重綁定只適用於你不知道要獲取的對象數量或其實際類型的情況。在這種情況下,我確切地知道有多少種類型,我只是不想手動構建它們,所以我不認爲多重綁定對於我想要做的事情來說足夠匹配。 – 2010-04-13 18:47:39

+0

我同意@ColinD。 +1用於多重綁定 – gpampara 2010-04-13 19:04:10

0

你不能只是注入的JFrame的服務,讓標籤索要服務/配置,像這樣

this.getTopLevelAncestor().getService() 

當然,這只是工作,如果他們已被添加到一個容器後調用。

+2

我認爲這會使意大利麪條變得更糟糕。它會爲'MainFrame'添加大量的強制類型,並且實際上減少了重用這些類的可能性,因爲它們將緊密地耦合到'MainFrame',而不是像現在這樣依賴它們。 – 2010-04-13 18:45:51