Avevo bisogno di un modo per ottenere alcuni dati da un database e impedire all'utente di modificare i dati esistenti per quel momento.JDialog modale in modo sicuro di apertura e chiusura (utilizzando SwingWorker)
Ho creato uno SwingWorker per effettuare l'aggiornamento del database e un JDialog modale per mostrare all'utente cosa sta succedendo (con un JProgressBar). La finestra di dialogo modale ha defaultCloseOperation impostato su DO_NOTHING, quindi può essere chiuso solo con una chiamata corretta - Io uso setVisible(false)
.
MySwingWorkerTask myTask = new MySwingWorkerTask();
myTask.execute();
myModalDialog.setVisible(true);
Lo SwingWorker fa alcune cose all'interno doInBackground() e, infine, si chiama:
myModalDialog.setVisible(false);
La mia unica preoccupazione e la mia domanda: È possibile che lo SwingWorker esegue il setVisible(false)
prima che sia setVisible(true)
in la linea dopo la generazione del lavoratore?
Se così il setVisible(true)
potrebbe bloccare per sempre (l'utente non può chiudere la finestra modale).
Devo implementare qualcosa come:
while (!myModalDialog.isVisible()) {
Thread.sleep(150);
}
myModalDialog.setVisible(false);
per assicurarsi che sarà effettivamente ottenere chiuso?
si dovrebbe chiamare 'myModalDialog.setVisible (false);' in 'fatto()' invece di 'doInBackground()'. Perché non chiamate 'setVisible (true)' prima di 'execute'? – assylias
setVisible (true) è una chiamata bloccante – user1713059
Haha - davvero un buon punto :-) – assylias