Uso questo codice per lanciare uno splash screen mentre attendo l'apertura della finestra principale, tutto funziona a parte che quando scompare lo splash screen mi si aprono 2 finestre principali e non solo 1, non riesco a capire il perchè quindi chiedo un parere anche a voi. Ecco il codice:
codice:
/*
 * Classe principale con il main
 */
public class Main {

    private static Splash sp;
    
    public static void main(String[] args) {
        sp = new Splash();
        javax.swing.SwingUtilities.invokeLater(new Runnable(){public void run(){Esegui();}}); 
    }
    
    /**
     * Questo metodo statico lancia i componenti del programma
     */
     private static void Esegui() {
         Principale princ = new Principale(); // questo il componente pesante da caricare... 
         sp.splashHide();
     }
}


/*
 * Classe dello spash screen
 */
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Toolkit;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JWindow;
import javax.swing.SwingUtilities;

public class Splash extends JWindow {

    /**
     * Numero Identificativo
     */
    private static final long serialVersionUID = 5391353830034369377L;
    private JLabel text;
    private JLabel image;
    private JPanel panel;
    private Dimension dimScreen;
    private ClassLoader cl = this.getClass().getClassLoader();
    
    /** Creates a new instance of Splash */
    public Splash() {
        super((Frame)null);
        
        Toolkit tool = Toolkit.getDefaultToolkit();
        dimScreen = tool.getScreenSize();
        // qui creo lo splash screen attaccando le varie immagini, label ecc.
        text = new JLabel();
        text.setText("Caricamento in corso...");
        text.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        image = new JLabel(new ImageIcon(cl.getResource("splashImage.jpg")));
        image.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        panel = new JPanel();
        panel.setOpaque(true);
        panel.setBorder(BorderFactory.createLineBorder(Color.RED));
        panel.setLayout(new BorderLayout());
        panel.add(image, BorderLayout.CENTER);
        panel.add(text, BorderLayout.SOUTH);
        
        setContentPane(panel);
        
        pack();
        setLocation((dimScreen.width-this.getWidth())/2, (dimScreen.height-this.getHeight())/2); 

        //Gestione dei thread
        final Runnable closerRunner = new Runnable() {
            public void run() {
                setVisible(false);
                dispose();
            }
        };
        Runnable waitRunner = new Runnable() {
            public void run() {
                try {
                    Thread.sleep(50000); // <---------- una pausa
                    SwingUtilities.invokeAndWait(closerRunner);
                }
                catch(Exception e) {
                    e.printStackTrace();
                    // can catch InvocationTargetException
                    // can catch InterruptedException
                }
            }
        };
        setVisible(true);
        Thread splashThread = new Thread(waitRunner, "SplashThread");
        splashThread.start();
    }
    /**
     * Nasconde lo splash
     */
    public void splashHide() {
        setVisible(false);
    }
}
La classe chiamata Principale non la posto perchè è molto lunga e poi quella funziona, ho provato a lanciarla mettendoci un main e si apre una sola volta perfettamente.

Qualche idea?

Ciao.