Dies ist für die Swing-Experten da draußen. Ich habe viel Zeit mit diesem Problem verbracht, daher brauche ich ein paar Zeilen, um das Problem zu erklären.Java Swing Fortschrittsbalken von EDT Problem
Ich habe eine eigenständige Java Swing-Anwendung (Java 6). In meiner Anwendung habe ich einen Rahmen mit einer Optionsfeldgruppe. Ich habe eine einzige Aktion mit allen Knöpfen in der Gruppe verbunden. Die Aktion prüft, um zu sehen, welcher Radiobutton ausgewählt ist und einige Arbeiten ausführt. Die "Arbeit" beinhaltet etwas Hintergrundberechnung sowie etwas Malen in zwei anderen Rahmen in meiner Anwendung. Die Hintergrundberechnung ist Multi-Threading.
Ich möchte eine Fortschrittsanzeige anzeigen, wenn der Benutzer einen der Optionsfelder auswählt. Wenn jedoch eine Optionsschaltfläche ausgewählt ist, wird während der Aktion für die Optionsschaltfläche die Fortschrittsanzeige nicht angezeigt. Ich habe versucht, jdialog Typ Fortschrittsbalken, Glasscheiben, etc. Keine von ihnen erscheinen, bis die "Arbeit" abgeschlossen ist. Dies scheint zu sein, weil Swing das Radio-Button nicht fertig bearbeitet, bis die "Arbeit" in der entsprechenden Aktion abgeschlossen ist. Und da der EDT nur eine Sache nach der anderen ausführt, wird der Fortschrittsbalken-Dialog (oder die Glasscheibe) niemals angezeigt.
Ich habe dann versucht, einen SwingWorker zu verwenden, all diese "Arbeit" zu tun. Starten Sie den Fortschrittsbalken (oder aktivieren Sie eine Glasscheibe), starten Sie den SwingWorker und schließen Sie den Fortschrittsbalken (oder deaktivieren Sie die Glasscheibe) in der Methode done() für den SwingWorker. Dies scheint den Fortschrittsbalken in Ordnung zu bringen, aber das Gemälde, das Teil der "Arbeit" ist, wird manchmal nicht vollständig ausgeführt, was mich mit einigen Bildartefakten belässt (die paintComponent-Methode ist ziemlich kompliziert, möchte also hier nicht reproduzieren). Die Artefakte verschwinden, wenn ich die Größe des Fensters ändere. In der Tat passiert das, wenn ich eine Klasse verwende, die Thread statt SwingWorker auch erweitert. Das ist alles, weil Swing nicht threadsicher ist und ich versuche GUI-Arbeit von einem anderen Thread als dem EDT zu machen. Ich verstehe diesen Teil.
Was mache ich? "Arbeit" dauert ungefähr 30 Sekunden und das scheint zu lang zu sein, ohne dem Benutzer irgendeine Art von Hinweis zu geben, dass das Programm funktioniert. Ich habe auch versucht, den Cursor zu einem Wartecursor zu ändern und habe auf die gleichen Probleme wie oben gerannt. Die einzige Sache, die ich tun kann, ist den Rahmen zu deaktivieren und den Titel des Rahmens auf etwas Text wie "arbeiten ..."
Dieses Problem hat jemand zuvor gesehen?
Wie stelle ich sicher, dass der EDT kein anderes Bild malt, bis die Arbeit am SwingWorker-Thread abgeschlossen ist? Die Arbeit, die im Hintergrund ausgeführt werden kann, muss abgeschlossen sein, bevor meine Bilder erneut gemalt werden. – Anu
Vielen Dank! Ich habe das zur Arbeit bekommen. – Anu