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.