SplashScreenfrage



  • Hallo zusammen,
    Ich hab ein kleines Prog mit dem JBuilder geschrieben und möchte nun noch ein SplashScreen einbauen! Aber ich weiss weder wie noch wo!?! 😕
    Folgendes hab ich:
    aus den Netz:

    class SplashWindow3 extends JWindow
    {
        public SplashWindow3(String filename, Frame f, int waitTime)
        {
            super(f);
            JLabel l = new JLabel(new ImageIcon(filename));
            getContentPane().add(l, BorderLayout.CENTER);
            pack();
            Dimension screenSize =
              Toolkit.getDefaultToolkit().getScreenSize();
            Dimension labelSize = l.getPreferredSize();
            setLocation(screenSize.width/2 - (labelSize.width/2),
                        screenSize.height/2 - (labelSize.height/2));
            addMouseListener(new MouseAdapter()
                {
                    public void mousePressed(MouseEvent e)
                    {
                        setVisible(false);
                        dispose();
                    }
                });
            final int pause = waitTime;
            final Runnable closerRunner = new Runnable()
                {
                    public void run()
                    {
                        setVisible(false);
                        dispose();
                    }
                };
            Runnable waitRunner = new Runnable()
                {
                    public void run()
                    {
                        try
                            {
                                Thread.sleep(pause);
                                SwingUtilities.invokeAndWait(closerRunner);
                            }
                        catch(Exception e)
                            {
                                e.printStackTrace();
                                // can catch InvocationTargetException
                                // can catch InterruptedException
                            }
                    }
                };
            setVisible(true);
            Thread splashThread = new Thread(waitRunner, "SplashThread");
            splashThread.start();
        }
    }
    

    und den JBuilderKram:

    package displaytest;
    
    import javax.swing.UIManager;
    import java.awt.*;
    
    /**
     * <p>Überschrift: </p>
     * <p>Beschreibung: </p>
     * <p>Copyright: Copyright (c) 2004</p>
     * <p>Organisation: </p>
     * @author unbekannt
     * @version 1.0
     */
    
    public class DISPLAYTEST {
      boolean packFrame = false;
    
      //Die Anwendung konstruieren
      public DISPLAYTEST() {
        Frame1 frame = new Frame1();
        //Frames überprüfen, die voreingestellte Größe haben
        //Frames packen, die nutzbare bevorzugte Größeninformationen enthalten, z.B. aus ihrem Layout
        if (packFrame) {
          frame.pack();
        }
        else {
          frame.validate();
        }
        //Das Fenster zentrieren
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = frame.getSize();
        if (frameSize.height > screenSize.height) {
          frameSize.height = screenSize.height;
        }
        if (frameSize.width > screenSize.width) {
          frameSize.width = screenSize.width;
        }
        frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
        frame.setVisible(true);
      }
    
      //Main-Methode
      public static void main(String[] args) {
        try {
          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch(Exception e) {
          e.printStackTrace();
        }
        new DISPLAYTEST();
      }
    }
    

    Jetzt wird ja hier mit Frame1 frame = new Frame1(); meine GUI gebastelt, wo aber wird jetzt die Info für das SplashScreen eingefügt? Und was genau übergebe ich für Frame f?!? Reicht als String der FileName (Bild.jpg) oder muss der Pfad (C:\Verzeichnis\Bild.jpg) dahin??

    Danke für Eure Hilfe!!



  • Erst einmal die Beantwortung der Frage "Wozu ein Splashscreen". Generell wird ein SplashScreen immer nur dann verwendet, wenn der Start und das zur Verfügung stehen der gestarteten Applikation eine ganze Weile dauert und man den Benutzer nicht verunsichern will ob die Applikation nun tatsächlich schon gestartet wurde. D.h. der SplashScreen dient nur zur Überbrückung einer gewissen Wartezeit. Demzufolge muss ein Programm etwa folgenden Ablauf besitzen:

    Programmstart
       Anzeige des SplashScreens (in der Regel Produktinfo)
           Zeitaufwendige Initialisierung des Programms
       Ausblenden des SplashScreens
       Benutzung des Programms
    Programmende
    

    Damit das nun so funktioniert, muss man wie in dem von dir geposteten Beispiel ein JWindow benutzen, welches der Benutzer nicht schließen kann. Das Schließen des JWindow muss das Programm von selbst tun. Damit hast du bereits einen einfachen SplashScreen. Nun ist es aber so, dass viele Programme bei der Initialisierung (beispielsweise NetBeans) Informationen im SplashScreen anzeigen darüber was gerade getan wird (Reading Database, Setting up editor etc.). Um dies machen zu können muss der SplashScreen in einen eigenen Thread ausgelagert werden, damit er die Chance hat sich zu aktualisieren. Wenn man dies nicht macht wird aufgrund der zeitraubenden Initialisierung dem SplashScreen keine CPU-Zeit gegeben und die Kommandos in der MessageQue werden nicht abgearbeitet.

    Um selbst einen SplashScreen zu erstellen würde ich dir vorerst zur einfachen Variante raten - dem einfachen Einblenden eines Fensters mit Produktinfo. Alles andere ist dann schon eine Schwierigkeitsstufe höher. Hoffe ich konnte dir helfen.


Anmelden zum Antworten