¿Cómo agregar tiempo de retraso entre agregar componentes a JFrame?

Creé un JFrame, y contiene un JPanel. He creado una serie de JLabels. Puedo agregar los JLabels al JPanel y mostrarlos correctamente. Pero quiero implementarlos para que ellosse muestra secuencialmente; un retardo de tiempo entre cada JLabel que se mostrará.

Después de buscar en StackOverfLow, probé un código, ¡pero no tiene efecto!Entonces, ¿cómo usar un temporizador para hacer que los componentes (etiquetas) se muestren uno tras otro estableciendo un retraso de tiempo?

No quiero una solución para mi código, particularmente en la respuesta. Sólo muestra cómo mostrar cualquier tipo de componentes de manera diferida, cada componente se muestra después de un período de tiempo. Eso es todo. Proporcioné mi código para mostrar mi esfuerzo en tratar de resolver el problema.

Primero, esta es una subclase de JLabel para usar: (No hay problemas con ella)

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.BorderFactory;
import javax.swing.JLabel;

public class DLabel extends JLabel
{
    Dimension size = new Dimension(70, 75);
    Font font = new Font(Font.SANS_SERIF, 12, 35);

    public DLabel(String t)
    {
        this.setPreferredSize(size);
        this.setBorder(BorderFactory.createBevelBorder(1, Color.white, Color.black));
        this.setVerticalAlignment(JLabel.CENTER);
        this.setHorizontalAlignment(JLabel.CENTER);
        this.setText(t);
        this.setFont(font);
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        Color color1 = new Color(226, 218, 145);
        Color color2 = color1.brighter();
        int w = getWidth();
        int h = getHeight();
        GradientPaint gp = new GradientPaint(
                0, 0, color1, 0, h, color2);
        g2d.setPaint(gp);
        g2d.fillRect(0, 0, w, h);
        super.paintComponent(g);
    }
}

La otra clase que usa elDLabel clase:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.UIManager;

public class DelayedLabels extends JPanel
{

    static JFrame frame;
    Timer timer;   //timer to be used for dealy

    DLabel card_1;  //Defining the DLabels
    DLabel card_2;
    DLabel card_3;
    JLabel[] labelsArray;

    public DelayedLabels()
    {
        this.setLayout(null);

        card_1 = new DLabel("1");
        card_2 = new DLabel("2");
        card_3 = new DLabel("3");

        labelsArray = new DLabel[3]; //create the array

        createLabelsArray(); //add the Labels Objects to labelsArray
        setLabelsLocations(labelsArray); // set the locations of the Labels to be displayed on the JPanel
        addLabelsToPanel(labelsArray); //The adding of the Labels to the JPanel
    }

    private void createLabelsArray()
    {
        labelsArray[0] = card_1;
        labelsArray[1] = card_2;
        labelsArray[2] = card_3;
    }

    private void setLabelsLocations(JLabel[] labels)
    {
        int length = labels.length;
        int gap = 10;
        int counter = 10;
        for (int i = 0; i < length; i++)
        {
            labels[i].setBounds(170, counter, 60, 70);
            counter = counter + labels[i].getBounds().height + gap;

        }
    }

    private void addLabelsToPanel(JLabel[] labels)
    {
        for (int i = 0; i < labels.length; i++)
        {
            frame.revalidate();
            frame.repaint();
            this.add(labels[i]);
            timer = new Timer(1000, timerAction); //timer to use with 1000 milliseconds
            timer.start();
        }
    }
    private ActionListener timerAction = new ActionListener() //action to be invoked after each label added
    {
        @Override
        public void actionPerformed(ActionEvent ae)
        {
            frame.revalidate();
            frame.repaint();
        }
    };

    private static void createAndShowGUI()
    {
        frame = new JFrame();
        frame.setSize(600, 700);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        DelayedLabels demo = new DelayedLabels();
        demo.setOpaque(true);
        frame.add(demo);
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                UIManager.put("swing.boldMetal", Boolean.FALSE);
                createAndShowGUI();
            }
        });
    }
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta