Nicht blockierender modaler Swing-Fortschrittsdialog

Eine blöde Frage, aber ich kann das wirklich nicht zum Laufen bringen: Ich habe einen langwierigen Prozess in einer Swing-Anwendung, der einige Minuten dauern kann. Ich möchte dem Benutzer einen Fortschrittsdialog anzeigen, während dieser Vorgang ausgeführt wird. Ich möchte auch verhindern, dass der Benutzer weitere Aktionen ausführt, z. B. das Drücken einer Taste, während der Vorgang läuft.

Wenn ich den Prozess auf dem EDT durchführe, verhindert dies offensichtlich, dass der Endbenutzer während des Prozesses etwas unternimmt. Da der EDT jedoch gerade mit der Verarbeitung beschäftigt ist, kann er den Inhalt des Dialogfelds nicht rendern, sodass ich nur den Umriss des Dialogfelds verstehe.

Aber wenn ich den Prozess in einem Worker-Thread durchführe, kann der Endbenutzer auf Schaltflächen klicken und den EDT veranlassen, den Status zu ändern, den der Worker gleichzeitig bearbeitet, mitschlechte Ding als Konsequenz. Wenn ich den Dialog modal mache, passiert das nicht, abermoda in Swing impliziert auchBlockierun, also in dem Moment rufe ichsetVisible(true), der Thread wird für immer blockiert.

So besteht meine aktuelle "Lösung" darin, einen Arbeitsthread zu verwenden und dann einen separaten Thread auszulösen, dessen einziger Zweck darin besteht, die blockierende Natur von @ zu absorbieresetVisible. Sicherlich muss es eine bessere Lösung geben!

Wie erhalte ich einen Dialog, der verhindert, dass der Benutzer mit dem Rest des Systems (modal) interagiert, aber den Thread, der die Sichtbarkeit bewirkt, nicht blockiert?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage