Спасибо! К сожалению, моя фоновая работа связана с 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();
            }
        });
    }
}

Ответы на вопрос(0)

Ваш ответ на вопрос