Eine dämliche Frage, aber ich kann das nicht zum Laufen bringen: Ich habe einen langwierigen Prozess in einer Swing-Anwendung, der einige Minuten dauern kann. Ich möchte dem Benutzer während dieses Vorgangs einen Fortschrittsdialog anzeigen. Ich möchte auch verhindern, dass der Benutzer weitere Aktionen ausführt, z. B. einen Knopf drücken, während der Prozess läuft.Non-blocking modal Swing-Fortschrittsdialog
Wenn ich den Prozess auf dem EDT mache, verhindert dies offensichtlich den Endanwender, irgendetwas zu tun, während der Prozess weitergeht. Da der EDT jedoch gerade mit der Verarbeitung beschäftigt ist, kommt er nie dazu, den Inhalt des Dialogs zu rendern, daher erhalte ich nur den Umriss des Dialogs.
Aber wenn ich den Prozess in einem Worker-Thread ausführen, kann der Endbenutzer auf Schaltflächen klicken und den EDT dazu veranlassen, den Status zu manipulieren, dass der Worker ebenfalls zur gleichen Zeit manipuliert, mit Bad Zeug als Konsequenz. Wenn ich den Dialog modal mache, passiert das nicht, aber modal in Swing bedeutet auch blockiert, so dass der Moment setVisible(true)
aufrufen, blockiert der Thread für immer.
Meine aktuelle "Lösung" besteht darin, einen Worker-Thread zu verwenden und dann einen separaten Thread zu spawnen, dessen einziger Zweck darin besteht, die blockierende Natur von setVisible
zu absorbieren. Sicherlich muss es eine bessere Lösung geben!
Wie bekomme ich einen Dialog, der den Benutzer daran hindert, mit dem Rest des Systems zu interagieren (modal), aber den Thread, der ihn sichtbar macht, nicht blockiert?
Siehe auch: http://stackoverflow.com/questions/3954120/swing-modal-dialog-refuses-to-close-sometimes – Zarkonnen