La mia comprensione è che se avvio un altro thread per eseguire alcune azioni, avrei bisogno di SwingUtilities.invokeAndWait
o SwingUtilities.invokeLater
per aggiornare la GUI mentre sono in detto thread. Per favore correggimi se sbaglio.Java's Swing Threading
Quello che sto cercando di realizzare è relativamente semplice: quando l'utente fa clic su Invia, voglio (prima di eseguire qualsiasi azione) disabilitare il pulsante di invio, eseguire l'azione, e al termine dell'azione riabilitare il pulsante. Il mio metodo per eseguire l'azione aggiorna direttamente la GUI (mostra i risultati) quando restituisce i risultati.
Questa azione interroga fondamentalmente un server e ottiene alcuni risultati.
Quello che ho finora è:
boolean isRunning = false;
synchronized handleButtonClick() {
if (isRunning == false) {
button.setEnabled(false);
isRunning = true;
doAction();
}
}
doAction() {
new Thread() {
try {
performAction(); // Concern A
} catch (...) {
displayStackTrace(...); // Concern B
} finally {
SwingUtilities.invokeLater (/* simple Runnable to enable button */);
isRunning = false;
}
}
}
Per entrambe le mie preoccupazioni di cui sopra, non avrei dovuto usare SwingUtilities.invokeAndWait
poiché entrambi aggiornerà la GUI? Tutti gli aggiornamenti della GUI ruotano attorno all'aggiornamento JTextPane
. Devo controllare nel mio thread se sono su EDT e in tal caso posso chiamare il mio codice (indipendentemente dal fatto che aggiorni la GUI o meno) e NON usare SwingUtilities.invokeAndWait
?
EDIT: Ecco quello che sto facendo ora:
handleButtonClick() {
if (isRunning == true)
return;
disable button;
SwingWorker task = new MyTask();
task.execute();
}
...inside MyTask
doInBackground() {
return performAction();
}
done() {
result = get();
enable button;
isRunning = false;
interpret result (do most of the GUI updates here);
}
Mentre performAction()
fa alcuni aggiornamenti GUI, ho avvolto quelli di:
if (SwingUtil.isEDT())
doGUIupdate()
else
SwingUtil.invokeLater(new Runnable() {
run() {
doGUIupdate();
}
});
Speriamo che questo sia un passo nella giusta direzione , per favore commenta se credi che ci siano modi migliori per gestire la mia situazione.
Usa SwingWorker. http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html –
Ho avuto l'impressione che SwingWorker debba essere usato per qualcosa di "lungo" mentre SwingUtilities è stato usato per qualcosa di "veloce" ? – nevets1219
Poiché SwingUtilities viene eseguito sul thread "UI", dovrebbe essere utilizzato per rendere la pratica veloce; altrimenti potrebbe bloccare l'interfaccia utente. Né verrà eseguito in "un altro thread". –