2012-07-09 20 views
9

Mi configuración de cargas de clase principal desde un archivo muestra un marco. Quiero hacer una pantalla de bienvenida con una barra de progreso como Eclipse para que el progreso aumente mientras se carga el archivo y el mensaje desaparece después de cargar el archivo. Entonces mi cuadro principal se carga.Hacer pantalla de bienvenida con barra de progreso como Eclipse

código MainClass:

public static void main(String[] args) { 
    ApplicationContext context = new ClassPathXmlApplicationContext(
    "classpath:/META-INF/spring/applicationContext.xml"); 
    // splash with progress load till this file is loaded 
    UserDao userDao = context.getBean(UserDao.class); 
    isRegistered = userDao.isRegistered(); 
    System.out.println("registered: " + isRegistered); 
    if (isRegistered) { 
    // progress finish and hide splash 
    log.debug("user is registered"); // show frame1 
    } else { 
    // progress finish and hide splash 
    log.debug("user is not registered"); // show frame2 
    } 
} 

no tengo mucha experiencia con Swing, por lo que por favor avise cómo lograr eso.

ACTUALIZACIÓN: he encontrado el siguiente ejemplo, pero tienen poca emisión:

  • cuando el contador llega al número especificado se debe dejar al (300) se mantiene contando para siempre sin parar el temporizador y ocultar la pantalla de bienvenida.

  • quiero vincular el contador a la carga del archivo, por lo que mientras se carga el archivo, el progreso se carga hasta que el archivo se carga y luego se completa el progreso y la pantalla de bienvenida desaparece.

    @SuppressWarnings("serial") 
    @Component 
    public class SplashScreen extends JWindow { 
    
        static boolean isRegistered; 
    
        static Log log = LogFactory.getLog(SplashScreen.class); 
    
        private static JProgressBar progressBar = new JProgressBar(); 
        private static SplashScreen execute; 
        private static int count; 
        private static Timer timer1; 
    
        public SplashScreen() { 
    
         Container container = getContentPane(); 
         container.setLayout(null); 
    
         JPanel panel = new JPanel(); 
         panel.setBorder(new javax.swing.border.EtchedBorder()); 
         panel.setBackground(new Color(255, 255, 255)); 
         panel.setBounds(10, 10, 348, 150); 
         panel.setLayout(null); 
         container.add(panel); 
    
         JLabel label = new JLabel("Hello World!"); 
         label.setFont(new Font("Verdana", Font.BOLD, 14)); 
         label.setBounds(85, 25, 280, 30); 
         panel.add(label); 
    
         progressBar.setMaximum(50); 
         progressBar.setBounds(55, 180, 250, 15); 
         container.add(progressBar); 
         loadProgressBar(); 
         setSize(370, 215); 
         setLocationRelativeTo(null); 
         setVisible(true); 
        } 
    
        public void loadProgressBar() { 
         ActionListener al = new ActionListener() { 
          public void actionPerformed(java.awt.event.ActionEvent evt) { 
           count++; 
           progressBar.setValue(count); 
           if (count == 300) { 
            timer1.stop(); 
            execute.setVisible(false); 
            return; 
           } 
          } 
         }; 
         timer1 = new Timer(50, al); 
         timer1.start(); 
        } 
    
        public static void main(String[] args) { 
    
         execute = new SplashScreen(); 
    
         ApplicationContext context = new ClassPathXmlApplicationContext(
           "classpath:/META-INF/spring/applicationContext.xml"); 
    
         UserDao userDao = context.getBean(UserDao.class); 
    
         isRegistered = userDao.isRegistered(); 
    
    
         if (isRegistered) { 
          // show frame 1 
         } else { 
                    // show frame 2 
    
         } 
    
        } 
    
    } 
    
+1

¿Revisó [esta pregunta] (http://stackoverflow.com/questions/2089359/java-6-splash-screen?rq=1)? Tiene algunos buenos enlaces. –

Respuesta

7

cuando el contador llega al número especificado que debe dejar al (300) que sigue contando para siempre sin detener el temporizador y ocultar la pantalla de bienvenida .

El código de abajo parece que funciona muy bien (con el defecto fatal el contador puede tomar más tiempo entonces la carga de archivos y viceversa):

import java.awt.Color; 
import java.awt.Container; 
import java.awt.Font; 
import java.awt.HeadlessException; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class SplashScreen extends JWindow { 

    static boolean isRegistered; 
    private static JProgressBar progressBar = new JProgressBar(); 
    private static SplashScreen execute; 
    private static int count; 
    private static Timer timer1; 

    public SplashScreen() { 

     Container container = getContentPane(); 
     container.setLayout(null); 

     JPanel panel = new JPanel(); 
     panel.setBorder(new javax.swing.border.EtchedBorder()); 
     panel.setBackground(new Color(255, 255, 255)); 
     panel.setBounds(10, 10, 348, 150); 
     panel.setLayout(null); 
     container.add(panel); 

     JLabel label = new JLabel("Hello World!"); 
     label.setFont(new Font("Verdana", Font.BOLD, 14)); 
     label.setBounds(85, 25, 280, 30); 
     panel.add(label); 

     progressBar.setMaximum(50); 
     progressBar.setBounds(55, 180, 250, 15); 
     container.add(progressBar); 
     loadProgressBar(); 
     setSize(370, 215); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    private void loadProgressBar() { 
     ActionListener al = new ActionListener() { 

      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       count++; 

       progressBar.setValue(count); 

       System.out.println(count); 

       if (count == 300) { 

        createFrame(); 

        execute.setVisible(false);//swapped this around with timer1.stop() 

        timer1.stop(); 
       } 

      } 

      private void createFrame() throws HeadlessException { 
       JFrame frame = new JFrame(); 
       frame.setSize(500, 500); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setVisible(true); 
      } 
     }; 
     timer1 = new Timer(50, al); 
     timer1.start(); 
    } 

    public static void main(String[] args) { 
     execute = new SplashScreen(); 
    } 
}; 

Quiero unir el mostrador para el archivo cargando, de modo que mientras el archivo es cargado, el progreso se carga hasta que el archivo se carga y luego el progreso finaliza y la pantalla de bienvenida desaparece.

Usted debe echar un vistazo a ProgressMonitor y ProgressMonitorInputStream utilizando un Task A continuación, puede comprobar si el archivo está completamente leer y poner fin a la SplashScreen. vea here para un gran tutorial y explicación

+0

¿Cómo puedo hacer que la barra de progreso cargue lentamente, porque se carga muy rápido? Traté de aumentar el conteo, pero todavía carga muy rápido. –

+0

@Msaleh si está usando el código que proporcioné, simplemente cambie el valor de 'timer1 = new Timer (400, al);' a algo más grande. En el ejemplo, ahora se llamará al temporizador cada 0.5 segundos –

+0

¿puede explicar la diferencia entre 'if (count == 300)' y 'timer1 = new Timer (50, al);' lo que hace cada uno de ellos . –

10

Java se ha construido en un SplashScreen clase sólo para este propósito. Hay un tutorial sobre cómo usarlo here.

+0

Gracias por eso. No había detectado la clase SplashScreen en la API antes de mencionarlo. – Bobulous