Спасибо! К сожалению, моя фоновая работа связана с GUI, поэтому она не может быть вне AWT-потока.
олный графический интерфейс работает внутри потока AWT, потому что я запускаю главное окно, используяSwingUtilities.invokeAndWait(...)
.
Теперь у меня есть JDialog, который должен просто отобразитьJLabel
, который указывает, что определенное задание выполняется, и закройте это диалоговое окно после завершения задания.
Проблема в том, что ярлык не отображается. Эта работа, кажется, началась раньшеJDialog
был полностью выложен.
Когда я просто позволяю диалогу открыться, не дожидаясь задания и не закрывая,является отображается.
Последнее, что диалог делает в своем ctor, этоsetVisible(true)
.
Такие вещи, какrevalidate()
, repaint()
... тоже не поможет.
Даже когда я запускаю поток для отслеживаемой работы и жду его, используяsomeThread.join()
это не помогает, потому что текущий поток (который является потоком AWT) заблокированjoin
, Я полагаю.
ЗаменаJDialog
с участиемJFrame
тоже не помогает
Итак, концепция в целом неверна? Или я могу сделать это, чтобы сделать определенную работупосле гарантируется, чтоJDialog
(или жеJFrame
) полностью выложен?
Упрощенный алгоритм того, чего я пытаюсь добиться:
Создать подклассJDialog
Убедитесь, что он и его содержимое полностью выложеныЗапустите процесс и дождитесь его завершения (с резьбой или нет, не имеет значения)Закрыть диалогМне удалось написатьвоспроизводимый прецедент:
РЕДАКТИРОВАТЬ Проблема из ответа теперь решается: этот вариант использованияделает отображать метку, но она не закрывается после «смоделированного процесса» из-за модальности диалога.
import java.awt.*;
import javax.swing.*;
public class _DialogTest2 {
public static void main(String[] args) throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
final JLabel jLabel = new JLabel("Please wait...");
@Override
public void run() {
JFrame myFrame = new JFrame("Main frame");
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.setSize(750, 500);
myFrame.setLocationRelativeTo(null);
myFrame.setVisible(true);
JDialog d = new JDialog(myFrame, "I'm waiting");
d.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
d.add(jLabel);
d.setSize(300, 200);
d.setLocationRelativeTo(null);
d.setVisible(true);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000); // simulate process
jLabel.setText("Done");
} catch (InterruptedException ex) {
}
}
});
d.setVisible(false);
d.dispose();
myFrame.setVisible(false);
myFrame.dispose();
}
});
}
}