2011-01-21 7 views
6

Non riesco a forzare un layout in Swing. Ho aggiunto un JComponent a JLayeredPane e ho impostato un bordo su JComponent. Poi, voglio immediatamente ridisegnare tutto - non nel senso di "per favore fai questo al più presto" come invalidate(), ma in modo sincrono e immediato. Qualsiasi aiuto? Non riesco a trovare il metodo giusto per farlo, e tutte le mie letture su invalidate(), validate(), repaint(), doLayout(), etc mi stanno solo confondendo di più!Forza layout immediato e pittura in Swing

risposta

0

Il modo più affidabile per ottenere Swing per aggiornare un display è utilizzare SwingUtilities.invokeLater. Nel tuo caso, sarebbe simile a

SwingUtilities.invokeLater(new Runnable { 
          public void run() { 
           somecomponent.repaint(); 
          } 
          }); 

mi rendo conto del 'invokeLater' non è esattamente il suono come lo fa nulla immediato, ma in pratica, eventi postati in questo modo tendono eseguire abbastanza rapidamente rispetto ad appena chiamando per esempio somecomponent.repaint() direttamente. Se si deve assolutamente fare in modo che il codice di controllo attenda che la GUI si aggiorni, allora c'è anche invokeAndWait, ma la mia esperienza è che raramente è necessario.

Vedere anche: document on event dispatch in Swing.

+0

Purtroppo nessuno di questi funzionerà per il mio impl:/Ho bisogno che l'aggiornamento della GUI avvenga immediatamente, non dopo che gli eventi in sospeso sono stati elaborati. È dovuto a un difetto nel mio design che mi serve in questo modo, ma sfortunatamente cambiarlo mi farebbe tornare indietro di quasi due settimane e ho un deliverable domani:/ – Hamy

+0

Ok prova questo: usa invokeAndWait, quindi all'interno della chiamata eseguibile paintImmediately sul contenitore esterno. Penso che questo sia il più vicino possibile con Swing: annullerà le chiamate precedenti a "ridisegnare", se non sbaglio. – phooji

+0

Purtroppo anche questo non ha funzionato. Per chiamare invokeAndWait devi generare una nuova discussione. Ho un evento * molto * lento che accade immediatamente dopo questo disegno e inizia l'esecuzione prima che il runnable sia avviato, causando il blocco della GUI senza che questa chiamata vernice sia stata ancora eseguita – Hamy

2

Secondo this (vedere la sezione "Pittura sincrona"), il metodo paintImmediately() dovrebbe funzionare.

+1

Ho provato questo - myComponent.paintImmediately (myComponent.getBounds). Nessuna fortuna :(Penso che questo possa essere dovuto al fatto che cambiare il bordo richiede un nuovo passaggio di layout a causa del bordo usando alcuni pixel in più su ciascun lato dell'oggetto – Hamy

+0

paintImmediatamente può essere la strada da percorrere, ma è comunque necessario postarlo come evento utilizzando invokeLater o invokeAndWait, penso. – phooji

+0

@Hamy Hai provato a chiamarlo sul componente principale, che potrebbe consentire la modifica del layout. – Jonathan