2010-04-28 9 views
5

Sto lavorando all'applicazione Java Swing con Google Guice come contenitore IOC. Le cose stanno andando bene. Ci sono alcuni problemi di interfaccia utente. Quando uno standard L & F viene sostituito con Pushing pixels Sostanza L & L'applicazione F non è in esecuzione a causa della creazione di componenti di Guing Swing al di fuori del thread dell'interfaccia utente.Guice crea componenti Swing al di fuori del problema del thread dell'interfaccia utente?

C'è un modo per dire a Guice di creare componenti Swing nel thread dell'interfaccia utente?

Forse dovrei creare provider personalizzati che restituiranno i componenti di Swing dopo che SwingUtilities.invokeAndWait(Runnable) li ha creati.

Non mi piace l'idea di eseguire l'intera applicazione nel thread dell'interfaccia utente, ma forse è solo una soluzione perfetta.

risposta

5

IMO non si dovrebbero creare componenti usando Guice ma servizi che a loro volta creeranno i componenti. Dopo aver eseguito l'iniezione del servizio, è necessario assicurarsi che la creazione del componente avvenga su EDT (utilizzando invokeAndWait)

+1

Questa è stata la soluzione più semplice e più semplice al mio problema. Avevo commesso un errore precoce estendendo i componenti di Swing e lasciando che Guice li istanzasse. Dopo il passaggio alla composizione, ad esempio i servizi di costruzione che fanno riferimento ai componenti di Swing e li hanno creati esplicitamente in EDT, tutto è andato bene. L'applicazione si comporta in modo più reattivo e non ci sono più problemi di interfaccia utente. SUGGERIMENTO: l'aspetto e l'aspetto della sostanza è un ottimo strumento per testare se il codice Swing viene utilizzato al di fuori di EDT. –

0

Infatti, Swing is not multi-threaded e richiede di essere eseguito in EDT. Di conseguenza, sì, i componenti devono essere preparati in EDT chiamando il numero invokeAndWait.

+0

Grazie per la risposta. Come lo risolveresti usando Guice come unico creatore di componenti Swing? –

+0

Bene, lo chiami tu: crei i tuoi componenti Swing usando invokeAndWait .... ooooh Guice è mono o multi-thread? Perché se non genera thread, puoi anche semplicemente rendere il tuo codice chiamando il tuo getInstance() in EDT. – Riduidel

1

Si potrebbe voler controllare il mio progetto Guts-GUI (framework di app Swing costruito su Guice). Guts-GUI assicura che i componenti, anche se creati da Guice, vengano creati nell'EDT.

Guice non fornisce in alcun modo, immediatamente, per dichiarare un componente da creare nell'EDT. Non sono sicuro che Guice Scopes potrebbe essere usato per quello (penso di sì), tuttavia, non sono sicuro che qualsiasi soluzione basata su Scope sarebbe utile, in particolare per quanto riguarda le prestazioni.

Il primo passo per risolvere questo problema è assicurarsi che Guice Injector venga creato dall'interno dell'EDT (utilizzando SwingUtilities.invokeAndWait o invokeLater). Questo è ciò che fa Guts-GUI in primo luogo. Quindi, se alcuni componenti vengono creati in anticipo da Guice, verranno creati nell'EDT.

Quindi è necessario assicurarsi che tutte le istanze iniettate da Guice e che richiedono la creazione di componenti Swing iniettati, siano ottenute (ad esempio tramite Injector.getInstance(...)) dall'EDT.