2012-07-09 24 views
9

La mia classe principale carica la configurazione da un file quindi mostra una cornice. Voglio fare uno splash screen con una barra di avanzamento come Eclipse in modo che il progresso aumenti mentre il file viene caricato e lo splash sparisce dopo il caricamento del file. Quindi il mio frame principale viene caricato.Crea schermata iniziale con barra di avanzamento come Eclipse

codice 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 
    } 
} 

Non ho molta esperienza con swing, quindi si prega di avvisare come fare questo.

UPDATE: ho trovato il seguente esempio, ma hanno poca problema:

  • quando il contatore raggiunge il numero specificato occorre fermarsi a (300) mantiene il conteggio per sempre senza fermarsi il timer e nascondendo lo splash screen.

  • voglio associare il contatore al caricamento del file, così mentre il file è caricato il progresso viene caricato fino a quando il file non viene caricato, quindi il progresso si completa e la schermata iniziale scompare.

    @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

Hai estratto [questa domanda] (http://stackoverflow.com/questions/2089359/java-6-splash-screen?rq=1)? Ha dei buoni collegamenti. –

risposta

7

quando il contatore raggiunge il numero specificato dovrebbe fermarsi a (300) si continua a contare per sempre senza fermare il timer e nascondere la schermata spruzzata.

Il codice qui sotto sembra funzionare grande (con l'errore fatale il contatore può richiedere più tempo, allora il file di carico e 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(); 
    } 
}; 

voglio legare il contatore al file caricamento, quindi mentre il file è caricato, il progresso viene caricato fino a quando il file non viene caricato, quindi il progresso viene completato e la schermata iniziale scompare.

Si dovrebbe dare un'occhiata a ProgressMonitor e ProgressMonitorInputStream utilizzando un Task si può quindi controllare quando il file è completamente letto e terminare la SplashScreen. vedi here per un ottimo tutorial e spiegazione

+0

Come posso caricare la barra di avanzamento lentamente, perché si carica molto velocemente? ho provato ad aumentare il conteggio, ma carica ancora molto velocemente. –

+0

@Msaleh se si sta usando il codice ho fornito una semplice modifica del valore di 'timer1 = new Timer (400, al);' per qualcosa di più grande. Nell'esempio il timer verrà ora chiamato ogni 0.5 secondi, –

+0

, per favore, puoi spiegare la differenza tra "if (count == 300)" e "the timer1 = new Timer (50, al);" ciò che ognuno di loro fa . –

10

Java è dotato di un SplashScreen classe solo per questo scopo. C'è un tutorial su come usarlo here.

+0

Grazie per quello. Non avevo individuato la classe SplashScreen nell'API prima di menzionarla. – Bobulous