2010-04-13 12 views
7

Ho un'applicazione Swing che vorrei convertire da spaghetti a usando l'iniezione delle dipendenze con Guice. Usare Guice per fornire servizi come la configurazione e le code delle attività sta andando alla grande, ma ora sto iniziando dalla GUI dell'app e non sono sicuro di come procedere.Come utilizzare Guice nell'applicazione Swing

L'applicazione è fondamentalmente un JFrame con un gruppo di schede in un JTabbedPane. Ciascuna scheda è una sottoclasse separata JPanel che espone i vari componenti e richiede servizi per eseguire azioni quando vengono premuti determinati pulsanti.

Nell'applicazione attuale, questo sembra un po 'come questo:

@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 
} 

Ovviamente, questo non esattamente seguire DI migliori pratiche. Non voglio avere le schede @Inject perché questo mi porterebbe un costruttore con dozzine di parametri. Voglio usare Guice per iniettare le dipendenze richieste in qualunque oggetto tab di cui ho bisogno senza che io debba passare tutte queste dipendenze ai costruttori di tabulazioni.

tutte le dipendenze per gli oggetti scheda sono servizi che la mia Module conosce, in modo sostanzialmente tutto quello che penso che voglio fare è chiedere Guice per gli oggetti necessari e li hanno costruiti per me.

+0

Si consiglia di dare un'occhiata al progetto Guts-GUI (che possiedo); questo è un framework basato su Guice per scrivere applicazioni Swing. Sebbene non sia ancora stato rilasciato ufficialmente, al momento è abbastanza praticabile. L'URL è: http://kenai.com/projects/guts/pages/Guts-gui – jfpoilpret

+0

L'ho esaminato brevemente ma sembra che ciò comporterebbe una completa riscrittura dell'applicazione. Ad esempio, ho già un potente sistema di esecuzione delle attività e un bus degli eventi. L'applicazione non è grande (circa 20kloc), ma comunque abbastanza grande da non considerare l'avvio. –

risposta

3

È possibile utilizzare Multibinding per associare tutte le schede come Set? Se hanno implementato alcune interfacce che ti consentivano di ottenere il nome da utilizzare per la scheda, puoi semplicemente eseguire il ciclo aggiungendo le schede dal set. Probabilmente dovresti riuscire a capire qualcosa per quanto riguarda l'ordine delle schede.

+0

Una possibilità che prenderò in considerazione. Credevo che Multibinding fosse solo per i casi in cui non si conosce la quantità di oggetti che si otterranno o i loro tipi reali. In questo caso so esattamente quanti e quali tipi, semplicemente non voglio costruirli manualmente, quindi non pensavo che Multibinding fosse abbastanza adatto per quello che volevo fare. –

+0

Sono d'accordo con @ColinD. +1 per le associazioni multibinding – gpampara

0

Impossibile basta iniettare il servizio nel JFrame e lasciare che le schede chiedono il servizio/configurazione, in questo modo

this.getTopLevelAncestor().getService() 

Naturalmente questo funziona solo se chiamato dopo che sono stati aggiunti a un contenitore .

+2

Penso che renderebbe gli spaghetti ancora peggiori. Aggiungerebbe molti cast a 'MainFrame' e ridurrebbe il potenziale per riutilizzare una di queste classi perché sarebbero strettamente accoppiate a' MainFrame' invece che solo alle loro dipendenze come sono adesso. –