Potrzebowałem sposobu na pobranie danych z bazy danych i uniemożliwienie użytkownikowi modyfikowania istniejących danych w tym momencie.Bezpiecznie otwórz i zamknij modalny JDialog (przy użyciu SwingWorker)
Stworzyłem SwingWorker, aby zaktualizować bazę danych i modalny JDialog, aby pokazać użytkownikowi, co się dzieje (za pomocą JProgressBar). Modalne okno dialogowe ma domyślną wartośćCloseOperation ustawioną na DO_NOTHING, więc można ją zamknąć tylko za pomocą właściwego połączenia - używam setVisible(false)
.
MySwingWorkerTask myTask = new MySwingWorkerTask();
myTask.execute();
myModalDialog.setVisible(true);
SwingWorker robi pewne rzeczy w ciągu doInBackground() i wreszcie wzywa go:
myModalDialog.setVisible(false);
Moim jedynym zmartwieniem i moje pytanie: Czy jest możliwe, że SwingWorker wykonuje setVisible(false)
zanim będzie setVisible(true)
w linia po spawn pracownika?
Jeśli tak, to setVisible(true)
może blokować na zawsze (użytkownik nie może zamknąć okna modalnego).
Czy muszę zaimplementować coś jak:
while (!myModalDialog.isVisible()) {
Thread.sleep(150);
}
myModalDialog.setVisible(false);
, aby upewnić się, że rzeczywiście dostać zamknięte?
należy zadzwonić 'myModalDialog.setVisible (false)' 'zrobić w()' zamiast 'doInBackground()'. Dlaczego nie nazwiesz 'setVisible (true)' przed 'execute'? – assylias
setVisible (true) to połączenie blokujące – user1713059
Haha - bardzo dobry punkt :-) – assylias