Frage

Dies ist für die Swing-Experten da draußen. Ich habe viel Zeit auf dieses Problem verbracht, so ist es mir ein paar Zeilen nehmen wird, das Problem zu erklären.

ich eine eigenständige Java-Swing-Anwendung haben (Java 6). In meiner Anwendung habe ich einen Rahmen mit einer Gruppe Optionsfeld. Ich habe eine einzige Aktion auf alle Schaltflächen in der Gruppe verbunden. Die Aktion prüft, welches Optionsfeld ausgewählt ist, und führt einige Arbeit. Die „Arbeit“ beinhaltet einige Hintergrundberechnung sowie einige Gemälde in zwei anderen Frames in meiner Anwendung. Der Hintergrund Berechnung ist multi-threaded.

Ich möchte einen Fortschrittsbalken angezeigt werden, wenn der eine wählt Benutzer der Radio-Buttons. Wenn jedoch ein Optionsfeld ausgewählt wird, während die Wirkung auf den Radioknopf geschieht, der Fortschrittsbalken nie angezeigt. Ich habe JDialog Art Fortschrittsbalken versucht, Glasscheiben, usw. Keiner von ihnen erscheinen, bis die „Arbeit“ alles abgeschlossen ist. Dies scheint zu sein, weil Schaukel nicht beendet das Optionsfeld Malerei, bis die „Arbeit“ in der entsprechenden Aktion abgeschlossen ist. Und da nur die EDT eine Sache zu einer Zeit der Fall ist, wird der Fortschrittsbalken-Dialog (oder Glasscheibe) nie angezeigt.

Ich habe dann versucht, einen Swingworker zu verwenden, um alle diese „Arbeit“ zu tun. Starten Sie den Fortschrittsbalken (oder aktivieren eine Glasscheibe), starten Sie die Swingworker und schließen Sie die Statusleiste (oder die Glasscheibe deaktivieren) in der getan () -Methode für den Swingworker. Dies scheint den Fortschrittsbalken in Ordnung zu bringen, aber die Malerei, den Teil der „Arbeit“ ist manchmal nicht abgeschlossen ist, und ließ mich mit einiger Malerei Artefakte (die Methode paintcomponent ziemlich kompliziert ist, so will hier nicht reproduzieren). Die Artefakte verschwinden, wenn ich die Größe des Fensters. In der Tat geschieht dies, wenn ich eine Klasse verwenden, das auch Thema statt Swingworker erstreckt. Das ist alles, weil Schwingen nicht THREAD ist und ich versuche, GUI Arbeit von einem anderen Thread als der EDT zu tun. Ich verstehe, dass ein Teil.

Was kann ich tun? „Arbeit“ dauert etwa 30 Sekunden und das scheint zu lange zu gehen, ohne dass der Benutzer eine Art von Anzeige zeigt, dass das Programm funktioniert. Ich habe auch versucht, den Cursor auf eine Wartecursor verändert und haben sich zu den gleichen Problemen führen, wie oben. Das einzige, was ich tun kann, deaktivieren Sie ist der Rahmen und stellen Sie den Titel des Rahmens zu einem Text wie „arbeiten ...“

Wer dieses Problem gesehen vor?

War es hilfreich?

Lösung

Ich glaube, Sie haben Recht, die Arbeit in dem Swingworker Thread zu tun, aber Sie sollen Sie nicht dort zu malen versuchen zu tun.

Ich würde geneigt sein, zu:

  • Haben Sie die Action show () den Fortschrittsbalken, den Weg der Swingworker dann beenden

  • Haben Sie den Worker-Thread die Arbeit machen, und in regelmäßigen Abständen Aufruf repaint () auf dem Fortschrittsbalken Komponente (dies ist garantiert Thread-sicher sein)

  • Fortschrittsbalken seine eigene paintcomponent hat (die automatisch auf dem EDT aufgerufen wird). Falls erforderlich, kann dies einige Variable lesen, die von dem Arbeitsthread aktualisiert wird zur Messung der Fortschritte

  • Wenn der Worker-Thread beendet ist, hat es nennen invokeLater () eine endgültige Schliessung Funktion auf dem EDT laufen, die die Fortschrittsbalken verbergen und tut andere GUI-ähnliche Bereinigung / zeigt eine Abschlussmeldung an den Benutzer etc.

Andere Tipps

Wenn Sie die Arbeit aus dem EDT auf den Swing-Arbeiter bewegt (was das Richtige zu tun war), es klingt sowohl wie die Arbeit und die Malerei auf den Swing-Arbeiter bewegt. Das Bild sollte noch auf dem EDT passieren. Sie können dies erreichen, indem SwingUtilities.invokeLater mit einem Repaint aus dem Hintergrund-Thread aufrufen, oder indem Sie die SwingWorker.publish (V ...) , welche Benachrichtigungen von Ihrem Arbeitsthread nehmen und sie über die am EDT zur Verfügung stellen SwingWorker.process (V. ..) Template-Methode (die Sie außer Kraft setzen). Ihre process Überschreibung kann die Zwischen Benachrichtigungen handhaben, indem einem Teil des Bildschirms neu zu streichen, Fortschritt der Aktualisierung oder unter einer anderen geeigneten Aktion, wie gewünscht. Alle Änderungen an der Benutzeroberfläche hier getan wird, ohne zu warten, für den Rest der Arbeit vollständig sichtbar sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top