Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [JAVA] Apertura doppia finestra dopo lo splash screen

    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.
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  2. #2
    Ho fatto un po' di prove e non capisco perchè mi ripete 2 volte il codice del costruttore della classe principale
    Il costruttore banalmente è così:
    codice:
    public Principale() {
            super("Principale");
            initialize();
    }
    Dove inizialize() è il metodo in cui "costruisco" il JFrame.

    Come risolvo sto problema?
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  3. #3

    up!

    Nessuno a qualche idea in merito??
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    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....
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Ciao...ho risolto il problema che era veramente una stupidata. Prima di scrivere la classe dello splash screen e la classe Main avevo messo il main all'interno della classe principale per fare le prove, poi lo avevo tolto lasciando questo:
    codice:
    static{
            try{
                UIManager.setLookAndFeel(new org.jvnet.substance.SubstanceLookAndFeel());
            }
            catch(Exception a){
                //Messaggio di errore
            }
            new Principale(); 
    }
    Solo che nel togliere la parte di dichiarazione del main mi è svuggito questa parte in neretto maledetta...scusa per la perdita di tempo, ma oggi pomeriggio l'ho guardato 10 volte senza trovare il problema, ora dopo aver letto la tua risp ho aperto ancora e per caso mi è capitato di vedere questa cosa!

    Grazie comunque per la risposta, sei stato molto gentile...magari mi hai ispirato...

    Ciao.
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.