Проблема заключается в следующем:
У меня запущено приложение swing, в какой-то момент диалог требует вставить имя пользователя и пароль и нажать "ok".
Я хотел бы, чтобы пользователь, нажав "ok", применил приложение swing в следующем порядке:
- Откройте "Подождите" JDialog
- Сделайте некоторую операцию (в конечном итоге отобразите некоторые другие JDialog или JOptionPane)
- Когда он закончит с закрытием операции, "пожалуйста, подождите" JDialog
Это код, который я написал в okButtonActionPerformed():
private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {
//This class simply extends a JDialog and contains an image and a jlabel (Please wait)
final WaitDialog waitDialog = new WaitDialog(new javax.swing.JFrame(), false);
waitDialog.setVisible(true);
... //Do some operation (eventually show other JDialogs or JOptionPanes)
waitDialog.dispose()
}
Этот код явно не работает, потому что, когда я вызываю waitDialog в том же потоке, он блокирует все, пока я его не закрываю.
Поэтому я попытался запустить его в другом потоке:
private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {
//This class simply extends a JDialog and contains an image and a jlabel (Please wait)
final WaitDialog waitDialog = new WaitDialog(new javax.swing.JFrame(), false);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
waitDialog.setVisible(true);
}
});
... //Do some operation (eventually show other JDialogs or JOptionPanes)
waitDialog.dispose()
}
Но также это не работает, потому что waitDialog не отображается сразу, но только после этого операция завершила свою работу (когда они показывают панель joption "Вы вошли в систему как..." )
Я также попытался использовать invokeAndWait вместо invokeLater, но в этом случае он выдает исключение:
Exception in thread "AWT-EventQueue-0" java.lang.Error: Cannot call invokeAndWait from the event dispatcher thread
Как я могу это сделать?