ciao Matteo. Allora io ho fatto una prova:
codice:
import java.awt.*;
import javax.swing.*;
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();
}
}
class Principale extends JFrame {
public Principale() {
super("Superminchiata");
try {
Thread.sleep(5000);
}
catch (Exception e) {
}
this.setSize(600, 600);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
/*
* Classe dello spash screen
*/
;
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("C:/Documents and Settings/Andrea/Desktop/ShowLetter.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);
}
}
Mettendo in evidenza l'unica modifica apportata alla classe splash. La classe principale che ho scritto non fa un bel niente, solo spreca tempo (altrimenti lo spash screen quasi non si vedeva, tanto rapidamente veniva chiuso...): questo funziona a dovere, una sola istanza di principale... a questo punto, non so dove possa risiedere il problema, se non in Principale....