Swing ProgressMonitor in Swing

AMiGA

Bekanntes Mitglied
Hallo zusammen,

ich habe folgendes Problem: Im AWT-Event-Thread wird durch einen Bediener etwas ausgelöst, z.B. durch einen Klick auf einen Button. Die Applikation löst eine serverseitige Buchung aus, d.h. aus dem AWT-Event-Thread wird eine Nachricht an einen Serverprozess gesendet und der (AWT-Event-)Thread danach (mittels wait) schlafen gelegt. Wenn die serverseitige Buchung abgeschlossen ist, sendet der Serverprozess eine Nachricht an den clientseitigen Worker-Thread. Dieser weckt dann den AWT-Event-Thread (mittels notifyAll) auf.

Soweit so gut. Leider passt in dieses Konzept ein ProgressMonitor nur sehr schwer hinein. Derzeit ist es so, dass vom Serverprozess der Fortschritt während einer langen Verbuchung mittels einer Nachricht an den clientseitigen Worker-Thread gesendet wird. Dieser weckt dann den AWT-Event-Thread auf welcher dann einen ProgressMonitor anzeigt.

Nun habe ich im GUI bei der auslösenden Funktion (Knopfdruck) beispielsweise folgenden Code:

Java:
public void doAnything()
{
    doSrvTransaction();
    refreshFrame();
    informUserViaMsgBox();
}

Bei der ersten Fortschrittsanzeige wird der AWT-Event-Thread aufgeweckt, doSrvTransaction kehrt zurück und die folgenden Aktionen werden viel zu früh ausgeführt.

Kann mir vielleicht jemand auf die Sprünge helfen, wie das sauber gelöst werden kann, dass doSrvTransaction tatsächlich erst nach Abschluss der serverseitigen Transaktion zurückkehrt und im GUI trotzdem ein ProgressMonitor aktualisiert wird?

Gruß,
AMiGA
 

AMiGA

Bekanntes Mitglied
Benutz einen SwingWorker...
Da bin ich auch drauf gestoßen, mir ist aber nicht ganz klar, was das am grundlegenden Vorgehen ändert.

Wenn der Bediener den Knopf drückt, führe ich SwingWorker#execute aus. In SwingWorker#doInBackground wird die Nachricht an den Serverprozess gesendet und der Thread schlafen gelegt. Der AWT-Event-Thread ist dann genauso blockiert und müsste durch den clientseitigen Worker-Thread aufgeweckt werden, wenn die serverseitige Transaktion fertig ist bzw. der Fortschritt angezeigt werden soll.

Gruß,
AMiGA
 
G

Gast2

Gast
Wenn du einen ProgressMonitor anzeigen lassen willst darfst du den AWT Thread (EDT) NICHT schlafen legen, da dieser für das Zeichnen zuständig ist. Durch den SwingWorker legst startet ein neuer Thread der in doBackground (läuft also nicht im EDT) seine Aufgaben erfüllt und wenn der fertig ist kannst in den ProgressMonitor wieder zumachen und weiter machen. Ich denke du benötigst keinen Mechanismus um einen Thread schlafen zu legen, da macht der SwingWorker für dich.
 

AMiGA

Bekanntes Mitglied
Ich denke du benötigst keinen Mechanismus um einen Thread schlafen zu legen, da macht der SwingWorker für dich.
Ich vermute, dass ich den Mechanismus benötige, um auf die Antwort von meinem Serverprozess zu warten, oder täusche ich mich?

Meine Beschreibung oben war vermutlich nicht ganz akkurat: Wenn der Bediener den Knopf drückt, führe ich SwingWorker#execute aus. In SwingWorker#doInBackground wird die Nachricht an den Serverprozess gesendet und der SwingWorker-Thread schlafen gelegt. Wenn der Fortschritt angezeigt werden soll, wird der clientseitige Worker-Thread informiert, dieser führt ein SwingWorker#setProgress auf, was aber nichts tut, da der SwingWorker-Thread schläft. Daher findet auch keine Aktualisierung durch den EDT statt.

Gruß,
AMiGA
 

Marco13

Top Contributor
So ganz ist noch nicht klar, was gemeint ist. Normalerweise legt man mit dem SwingWorker einen Thread nicht "explizit" schlafen. Wenn man auf das Ergebnis warten will (wo auch immer) ruft man worker.get() auf, das wartet dann. Schau mal, ob das, was du suchst, nicht mit einem modalen Dialog gelöst werden sollte. Näheres dazu steht unter SwingWorker (Java Platform SE 6)
 

AMiGA

Bekanntes Mitglied
Normalerweise legt man mit dem SwingWorker einen Thread nicht "explizit" schlafen. Wenn man auf das Ergebnis warten will (wo auch immer) ruft man worker.get() auf, das wartet dann.
Genau das sind meine Aufruf im GUI: Zunächst worker.execute() und dann worker.get(). Nur an irgendeiner Stelle muss ich ja das Warten auf die Antwort des Serverprozesses realisieren, d.h. ich muss einen der Threads (EDT oder SwingWorker) schlafen legen so lange bis der Serverprozess fertig ist und sich meldet.

Schau mal, ob das, was du suchst, nicht mit einem modalen Dialog gelöst werden sollte.
Werde ich mal anschauen, wobei ich da auf den ersten Blick erstmal keinen großen Unterschied sehe. Ob ich im GUI einen Dialog oder einen ProgressMonitor zur Fortschrittsanzeige nutze, sollte ja egal sein.

Gruß,
AMiGA
 
G

Gast2

Gast
Genau das sind meine Aufruf im GUI: Zunächst worker.execute() und dann worker.get(). Nur an irgendeiner Stelle muss ich ja das Warten auf die Antwort des Serverprozesses realisieren, d.h. ich muss einen der Threads (EDT oder SwingWorker) schlafen legen so lange bis der Serverprozess fertig ist und sich meldet.

Nein musst du normal nicht... wenn du get Aufrufst wartet der SwingWorker bis dein Prozess fertig ist.
 

AMiGA

Bekanntes Mitglied
Nein musst du normal nicht... wenn du get Aufrufst wartet der SwingWorker bis dein Prozess fertig ist.
Okay. Mein SwingWorker.execute() erledigt die Arbeit aber gar nicht selber, sondern schickt nur eine Nachricht an den Serverprozess (per TCP/IP) und ist dann fertig. Ich möchte aber, dass mein GUI wartet, bis vom Serverprozess (wiederum per TCP/IP) die Nachricht kommt, dass die Transaktion vollständig und fehlerfrei durchgeführt wurde.

Gruß,
AMiGA
 

Marco13

Top Contributor
Hmja, der ProgressMonitor zeigt ggf. einen Dialog an. Ein modaler Dialog ist ja die einzige Möglichkeit, den GUI-Thread "sinnvoll" anzuhalten: (Bei einem modalen(!) Dialog wird praktisch ein neuer EDT gestartet, der sich um das Neuzeichnen des Dialogs kümmert, und der "eigentliche" EDT im Hintergrund wird angehalten.
 

AMiGA

Bekanntes Mitglied
Der Weg mittels SwingMonitor UND modalem Dialog scheint zu funktionieren:

- Benutzer klickt auf Knopf in GUI:
- Nachricht wird per TCP/IP an Serverprozess gesendet
- SwingWorker wird gestartet
- SwingWorker#doInBackground legt den SwingWorker-Thread schlafen
- Modaler Dialog wird im GUI geöffnet

- Serverprozess meldet Fortschritt an Worker-Thread im GUI:
- Modaler Dialog wird aktualisiert

- Serverprozess meldet "abgeschlossen" an Worker-Thread im GUI:
- Modaler Dialog wird geschlossen
- SwingWorker-Thread wird aufgeweckt

Insgesamt ist es zwar etwas kompliziert, funktioniert aber.

Gruß,
AMiGA
 
G

Gast2

Gast
Ja klingt doch gut. Wenn du die Klasse auslagern kannst, kannst Sie ja immer wieder verwenden für jeden Prozess.
 

AMiGA

Bekanntes Mitglied
Funktioniert auch für den geschilderten Fall einwandfrei.

Leider habe ich etwas übersehen: Wenn der Benutzer auf den Knopf klickt, weiß ich nicht, ob dies eine lang laufende Transaktion ist. Dies entscheidet der Serverprozess. Es wird nun aber immer ein modaler ProgressMonitor geöffnet, auch bei sehr kurzen Transaktionen.

Das hat zur Folge, dass der ProgressMonitor für einen Sekundenbruchteil angezeigt wird und sofort wieder verschwindet. Außerdem verliert das GUI kurz den Fokus (wegen des modalen Dialogs) und erhält ihn danach sofort zurück. Sehr unschön.

Spontan fällt mir natürlich der Weg ein, erst einmal keinen ProgressMonitor anzuzeigen und erst bei der ersten Fortschrittsrückmeldung des Serverprozesses (die kommt nur bei langen Transaktionen ansonsten kommt sofort die "Transaktion abgeschlossen"-Meldung) den ProgressMonitor einzublenden. Dann bin ich aber wieder bei dem ursprünglichen Problem, welches ich ja gerade dadurch gelöst habe, dass der modale Dialog den EDT blockiert...

Gruß,
AMiGA
 
G

Gast2

Gast
Finde ich jetzt nicht schlimm, ist halt nunmal so sieht man bei anderen Programmen auch.
Eventuell kannst ein delay einbauen und danach erst den dialog öffnen, wenn es dir der aufwand wert ist.
 

Marco13

Top Contributor
Der ProgressMonitor hat eigentlich mechanismen genau dafür. Je nachdem wie die aktuelle Lösung aussieht, könnte man die verwenden oder nachbauen. In jedem Fall gibt es das "Problem", dass für jede beliebige Verzögerung x (bis zum aufpoppen des Dialogs) eine Zeit x+1ms existiert, die der Server vielleicht brauchen kann - man also ein potentielles kurzes "Aufflackern" ohne Fortschrittsmeldungen kaum verhindern kann (aber schon das "pauschale" Aufflackern für den Fall, den du beschrieben hast)
 

AMiGA

Bekanntes Mitglied
Ich habe nun ein Delay von einer Sekunde eingebaut.

Allerdings habe ich es nicht direkt in den eigenen ProgressMonitor eingebaut, da mir nicht wirklich klar ist, wo ich da ansetzen sollte. Zum einen soll der PM den EDT blockieren, zum anderen soll er aber für den Benutzer nicht sichtbar sein...

Ich warte nun 1 Sekunde im EDT. Entweder ist die Transaktion in unter 1 Sekunde fertig, dann wird der EDT sofort aufgeweckt oder aber die Transaktion dauert > 1 Sekunde, dann erscheint der PM (für den Bruchteil einer Sekunde im ungünstigsten Fall, das ist klar).

Gruß,
AMiGA
 
J

JohannisderKaeufer

Gast
Du könntest aber auch hingehen und den Prozessmonitor etwas länger geöffnet lassen als nötig:)

Dann flakert es nicht so. Immer beschäftigt aussehen!

Und wenn du das dann wieder ausbaust weil die Anwendung "lahm" aussieht, nennst du es einfach Performancetuning.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B ProgressMonitor funktioniert nur beim Initialisieren AWT, Swing, JavaFX & SWT 3
M Fenster mit ProgressMonitor immer leer AWT, Swing, JavaFX & SWT 23
Z Swing ProgressMonitor & Perl AWT, Swing, JavaFX & SWT 8
N ProgressMonitor AWT, Swing, JavaFX & SWT 7
MonsterBit ProgressMonitor AWT, Swing, JavaFX & SWT 10
G zeitgesteuertes Multithreading für ProgressMonitor AWT, Swing, JavaFX & SWT 6
L Erscheinungsdauer des ProgressMonitor AWT, Swing, JavaFX & SWT 3
P ProgressMonitor - isCanceled gibt immer false zurück AWT, Swing, JavaFX & SWT 2
A ProgressMonitor funktioniert nicht AWT, Swing, JavaFX & SWT 3
Juelin javax.swing in javafx AWT, Swing, JavaFX & SWT 1
A Eclipse 2023 und Swing AWT, Swing, JavaFX & SWT 4
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
H Swing Componente zur Läufzeit ändern AWT, Swing, JavaFX & SWT 3
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
ExceptionOfExpectation Anpassung von JKomponentengrößen (Swing) AWT, Swing, JavaFX & SWT 3
thor_norsk AWT SWING Aufgabe AWT, Swing, JavaFX & SWT 7
U Zwei Fragen zu eienr Swing Aufgabe AWT, Swing, JavaFX & SWT 2
M Swing Bilder in Swing anzeigen AWT, Swing, JavaFX & SWT 9
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
A Swing ProgressBar über 2 parallel laufende Threads AWT, Swing, JavaFX & SWT 2
M Swing GridLayout AWT, Swing, JavaFX & SWT 2
O return-Statement mit Swing AWT, Swing, JavaFX & SWT 6
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
Monokuma Swing zu JavaFX AWT, Swing, JavaFX & SWT 5
J Swing Slider AWT, Swing, JavaFX & SWT 11
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
G Swing JPasswordField AWT, Swing, JavaFX & SWT 12
L Swing Button Farbe ändern/wechseln AWT, Swing, JavaFX & SWT 2
C Swing AWT GUI Anfänger Aufgabe AWT, Swing, JavaFX & SWT 7
W Inject bei einem Swing Frontend AWT, Swing, JavaFX & SWT 8
L Kommunikation zwischen Klassen / Konstruktoren bei Swing AWT, Swing, JavaFX & SWT 9
M Feldvalidierung swing AWT, Swing, JavaFX & SWT 4
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
O Zukunft von Swing und JavaFX ? AWT, Swing, JavaFX & SWT 3
S Swing Fenster State Machine AWT, Swing, JavaFX & SWT 1
T Swing Swing an Bildschirm anpassen AWT, Swing, JavaFX & SWT 3
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
M Swing GUI mittels erben sowie variabler Dateninhalt AWT, Swing, JavaFX & SWT 1
W Swing Multitouch mit Swing AWT, Swing, JavaFX & SWT 6
S Swing-Applikation die ein Numpad nachbildet samt Keybindings..? AWT, Swing, JavaFX & SWT 5
S Swing Java Swing AWT, Swing, JavaFX & SWT 6
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
J Swing oder JavaFX AWT, Swing, JavaFX & SWT 21
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
D SQL Statements mit Java Swing benutzen AWT, Swing, JavaFX & SWT 4
Damtonix BufferStrategy flackert (Swing) AWT, Swing, JavaFX & SWT 9
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
B JavaFX oder swing AWT, Swing, JavaFX & SWT 3
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
L Swing Größe automatisch anpassen AWT, Swing, JavaFX & SWT 14
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
Blender3D Meine Swing Anwendung läuft unter Windows 10 und Ubuntu aber nicht auf Windows 7 AWT, Swing, JavaFX & SWT 16
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
D Swing in Kombination mit JGraphX und JGraphT AWT, Swing, JavaFX & SWT 0
F main-Funktion bei Swing AWT, Swing, JavaFX & SWT 4
S Java Swing Print() method AWT, Swing, JavaFX & SWT 4
S Java Swing auf Windows Phone AWT, Swing, JavaFX & SWT 6
I JAVAFX - Übergabe der Inhalte an eine Scene - Wo ist der Vorteil gegenüber Swing? AWT, Swing, JavaFX & SWT 2
S Manuelles Menu in Swing AWT, Swing, JavaFX & SWT 3
T Custom Window ohne Swing / AWT / FX..?! AWT, Swing, JavaFX & SWT 1
MaxG. Swing Swing Komponenten zur Laufzeit hinzufügen AWT, Swing, JavaFX & SWT 2
Java_RY Bin Ratlos bzgl Malen in Swing AWT, Swing, JavaFX & SWT 5
offi Swing Shuttle List AWT, Swing, JavaFX & SWT 9
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
D Swing Swing Objekte sehen im Entwurf anders aus als beim Ausführen AWT, Swing, JavaFX & SWT 3
S Swing & Clean und build Problem AWT, Swing, JavaFX & SWT 12
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
K Mit JavaFX angefangen. Lohnt sich Swing? AWT, Swing, JavaFX & SWT 28
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
B Swing WindowBuilde: Menu -> anderes Panel wechseln AWT, Swing, JavaFX & SWT 1
K eigener button in swing AWT, Swing, JavaFX & SWT 3
A JavaFX DatePicker in Swing beim Start nicht sichtbar AWT, Swing, JavaFX & SWT 2
windl Bufferstrategy in Swing nachstellen AWT, Swing, JavaFX & SWT 0
M Kamera in Java Swing einbinden AWT, Swing, JavaFX & SWT 4
Z Swing Swing und die Progressbar AWT, Swing, JavaFX & SWT 1
J Frage zur objektorentierten Swing Programmierung AWT, Swing, JavaFX & SWT 10
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
RalleYTN Swing JavaFX VideoPlayer in Swing einbetten. Ich komm nicht an die Dimension des Videos! AWT, Swing, JavaFX & SWT 0
T swing läuft nur beding flüssig AWT, Swing, JavaFX & SWT 1
A Sonderzeichen bei Swing AWT, Swing, JavaFX & SWT 3
L DoubleBuffering unter Swing AWT, Swing, JavaFX & SWT 0
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
J Swing/AWT | Dynamisch erzeugte Objekte ansprechen AWT, Swing, JavaFX & SWT 1
N JavaFX Umstieg von Swing auf Java FX AWT, Swing, JavaFX & SWT 6
J GUI Anfänger einfaches Program AWT, Swing, JavaFX & SWT AWT, Swing, JavaFX & SWT 3
M Swing Grundlegende Frage zu SWING mit WindowBuilder AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen

Neue Themen


Oben