Ich versuche, die Java-Best Practices zu folgen, indem ich keine langen Aufgaben auf dem Hauptthread (EDT). Also plane ich einen SwingWorker mit Modal Dialog. Auf diese Weise blockiert der modale Dialog den Benutzer für alles, bis diese Aufgabe erledigt ist, und ich kann den Status des Dialogs während des Prozesses aktualisieren.Dialog mit Swingworker ist ein Huhn/Ei
Das Problem ist jetzt, dass mit dem modalen Dialog, es blockiert nicht nur die Benutzer, sondern auch nichts nach setVisible
Soaufgerufen wird, wenn ich
dialog.setVisible(true);
new SwingWorkerTask().execute(); //This does not get called
tun, und wenn ich
new SwingWorkerTask().execute();
dialog.setVisible(true); // Well what the point of setting visible after the fact.
So, wie blockiere ich Benutzeraktionen und zeige einen Dialog, während die Aufgabe stattfindet?
Danke
Haben Sie eine Anwendung gesehen, die das tut? Öffnet Ihr E-Mail-Client einen Dialog, der Sie daran hindert, etwas zu tun, während er nach E-Mails sucht? Blockiert Ihre Datenbank-GUI Sie bei der Ausführung einer Abfrage mit einem Dialog? Überprüfen Sie, welche gängigen Anwendungen ausgeführt werden, wenn sie lange Aufgaben ausführen, und folgen Sie deren Anweisungen. – RealSkeptic
Tipp: etwas mehr Zeit für die Formatierung Ihres Quelltextes ausgegeben ;-) – GhostCat
Das [JavaDoc von 'SwingWorker # get'] (https://docs.oracle.com/javase/8/docs/api/javax/swing/ SwingWorker.html # get--) beschreibt zum Glück genau Ihren Anwendungsfall. Dein zweites Snippet ist das richtige: Du * starte ** zuerst den SwingWorker und ** dann ** mache den Dialog sichtbar. Beachten Sie, dass dies üblicherweise z. in einigen "actionPerformed" -Methode aufgrund einiger Tasten klicken. Dies wird bereits * auf dem EDT ausgeführt. Der 'execute'-Aufruf erzeugt den Hintergrund-Thread und macht den Dialog sichtbar, um eine weitere Interaktion zu verhindern. – Marco13