Mein Verständnis ist, dass, wenn ich einen anderen Thread starten, um einige Aktionen durchzuführen, ich SwingUtilities.invokeAndWait
oder SwingUtilities.invokeLater
benötigen würde, um die GUI zu aktualisieren, während ich in besagtem Thread bin. Bitte korrigieren Sie mich, falls ich falsch liege.Java Swing Threading
Was ich versuche zu erreichen, ist relativ einfach: Wenn der Benutzer auf Senden klickt, möchte ich (vor dem Ausführen von Aktionen) die Übermittlungsschaltfläche deaktivieren, die Aktion ausführen und am Ende der Aktion die Option erneut aktivieren Taste. Meine Methode zum Ausführen der Aktion aktualisiert die GUI direkt (zeigt Ergebnisse an), wenn sie die Ergebnisse zurückerhält.
Diese Aktion fragt grundsätzlich einen Server ab und erhält einige Ergebnisse zurück.
Was ich habe, so weit ist:
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;
}
}
}
Für beide meine Bedenken über, tun hätte ich SwingUtilities.invokeAndWait
verwenden, da sie beide die GUI aktualisieren? Alle GUI-Updates drehen sich um die Aktualisierung JTextPane
. Muss ich in meinem Thread überprüfen, ob ich auf EDT bin und wenn ja, kann ich meinen Code aufrufen (unabhängig davon, ob er die GUI aktualisiert oder nicht) und NICHT SwingUtilities.invokeAndWait
verwenden?
EDIT: Hier ist, was ich jetzt tue:
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);
}
Während performAction()
einige GUI-Updates der Fall ist, habe ich eingewickelt diejenigen in:
if (SwingUtil.isEDT())
doGUIupdate()
else
SwingUtil.invokeLater(new Runnable() {
run() {
doGUIupdate();
}
});
Hoffentlich dies ein Schritt in die richtige Richtung Bitte kommentieren Sie, wenn Sie glauben, dass es bessere Möglichkeiten gibt, mit meiner Situation umzugehen.
Verwenden Swingworker. http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html –
Ich hatte den Eindruck, dass SwingWorker für etwas "langes" verwendet werden sollte, während SwingUtilities für etwas "schnelles" verwendet wurde. ? – nevets1219
Da SwingUtilities auf dem Thread "UI" ausgeführt wird, müsste es für etwas verwendet werden, das schnell praktisch ist. Sonst könnte es die Benutzeroberfläche blockieren. Keines wird in "einem anderen Thread" ausgeführt. –