Questo è per gli esperti di swing là fuori. Ho dedicato molto tempo a questo problema, quindi mi porterò qualche riga per spiegare il problema.Barra di avanzamento swing Java dal problema EDT
Ho un'applicazione standalone java swing (java 6). Nella mia applicazione, ho una cornice con un gruppo di pulsanti di opzione. Ho una singola azione collegata a tutti i pulsanti del gruppo. L'azione controlla per vedere quale pulsante di opzione è selezionato ed esegue un po 'di lavoro. Il "lavoro" comporta alcuni calcoli in background e alcuni dipinti in altri due frame nella mia applicazione. Il calcolo dello sfondo è multi-thread.
Vorrei visualizzare una barra di avanzamento quando l'utente seleziona uno dei pulsanti di opzione. Tuttavia, quando viene selezionato un pulsante di opzione, mentre l'azione sul pulsante di opzione è in corso, la barra di avanzamento non viene mai visualizzata. Ho provato barre di avanzamento di tipo jdialog, pannelli di vetro, ecc. Nessuno di essi appare fino a quando il "lavoro" è tutto completato. Questo sembra essere dovuto al fatto che Swing non finisce di dipingere il pulsante radio finché non viene completato il "lavoro" nell'azione corrispondente. E poiché l'EDT esegue solo una cosa alla volta, la finestra di dialogo della barra di avanzamento (o riquadro di vetro) non viene mai visualizzata.
Ho quindi provato a utilizzare uno SwingWorker per fare tutto questo "lavoro". Avviare la barra di avanzamento (o attivare un riquadro di vetro), avviare SwingWorker e chiudere la barra di avanzamento (o disattivare il pannello di vetro) nel metodo done() per SwingWorker. Questo sembra far apparire bene la barra di progresso, ma il dipinto che fa parte del "lavoro" a volte non è completato, lasciandomi con alcuni artefatti di pittura (il metodo paintComponent è piuttosto complicato, quindi non voglio riprodurlo qui). Gli artefatti scompaiono se ridimensiono la finestra. In effetti, questo succede se uso una classe che estende Thread al posto di SwingWorker. Questo perché Swing non è protetto da thread e sto provando a fare il lavoro con la GUI da un thread diverso da EDT. Capisco quella parte.
Cosa devo fare? "lavoro" dura circa 30 secondi e sembra troppo lungo per andare senza mostrare all'utente una sorta di indicazione che il programma sta funzionando. Ho anche provato a cambiare il cursore in un cursore di attesa e ho incontrato gli stessi problemi di cui sopra. L'unica cosa che posso fare è disabilitare il frame e impostare il titolo del frame su un testo come "working ..."
Qualcuno ha già visto questo problema?
Come faccio a garantire che l'EDT non esegua nessun altro disegno fino a quando il lavoro sul thread SwingWorker non è completato? Il lavoro che può essere svolto in background deve essere completato prima che i miei fotogrammi vengano nuovamente dipinti. – Anu
Grazie! L'ho fatto funzionare. – Anu