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:
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.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); } }
Qualche idea?![]()
Ciao.![]()

Rispondi quotando