Swing: ¿Cómo ejecuto un trabajo desde el hilo de AWT, pero después de que se trazó una ventana?

Mi GUI completa se ejecuta dentro del hilo AWT, porque inicio la ventana principal usandoSwingUtilities.invokeAndWait(...).

Ahora tengo un JDialog que solo tiene que mostrar unJLabel, que indica que cierto trabajo está en progreso, y cierra ese diálogo una vez que el trabajo haya finalizado.

El problema es: la etiqueta no se muestra. Ese trabajo parece haber comenzado antesJDialog fue completamente distribuido.

Cuando dejo que el cuadro de diálogo se abra sin esperar un trabajo y cierre, la etiquetaes desplegado.

Lo último que hace el diálogo en su ctor essetVisible(true).
Cosas comorevalidate(), repaint(), ... tampoco ayudes.

Incluso cuando comienzo un hilo para el trabajo monitoreado y lo espero usandosomeThread.join() no ayuda, porque el subproceso actual (que es el subproceso AWT) está bloqueado porjoin, Supongo.

SustituciónJDialog conJFrame tampoco ayuda.

Entonces, ¿el concepto es incorrecto en general? ¿O puedo manejarlo para hacer cierto trabajo?después se asegura que unJDialog (oJFrame) está completamente distribuido?

Algoritmo simplificado de lo que estoy tratando de lograr:

Crear una subclase deJDialogAsegúrese de que él y su contenido estén completamente distribuidosInicie un proceso y espere a que termine (roscado o no, no importa)Cerrar el dialogo

Logré escribir unreproducible caso de prueba:

EDITAR El problema de una respuesta ahora se aborda: este caso de usohace muestra la etiqueta, pero no se cierra después del "proceso simulado", debido a la modalidad de diálogo.

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();
            }
        });
    }
}

Respuestas a la pregunta(5)

Su respuesta a la pregunta