2012-07-09 23 views
9

gibi ilerleme çubuğuyla açılış ekranı hazırlayın Ana sınıf yüklerimi bir dosyadan yapılandırma yükler ve sonra bir çerçeve gösterir. Eclipse gibi bir ilerleme çubuğu ile bir sıçrama ekranı yapmak istiyorum böylece dosya yüklenirken ilerleme artacak ve dosya yüklendikten sonra sıçrama kaybolur. Sonra ana çerçevem ​​yüklenir.Eclipse

MainClass kodu:

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

yüzden bunu başarmak için nasıl tavsiye lütfen, Swing ile çok deneyimi yok. o durmadan sonsuza dek sayım devam ediyor sayaç belirtilen numaraya aldığında

  • o (300) durdurmak gerekir:

    GÜNCELLEME: i aşağıdaki örnek bulduk ama biraz sorun var zamanlayıcı ve açılış ekranını gizleme.

  • Sayacı dosya yüklemesine bağlamak istiyorum, bu nedenle dosya yüklendiğinde, dosya yüklenene kadar ilerleme kaydediliyor, ilerleme tamamlanacak ve açılış ekranı kayboluyor.

    @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

Bazı harika eğitim ve açıklamalar için bkz. here [bu soru] 'ya göz attınız mı (http://stackoverflow.com/questions/2089359/java-6-splash-screen?rq=1)? Bazı iyi bağlantıları var. –

cevap

7

o zamanlayıcı durdurulur ve Giriş ekranını saklamadan sonsuza kadar sayma tutar (300) durdurmak gerekir.

Aşağıdaki kod harika iş gibi görünüyor (sayaç uzun sürebilir ölümcül hata ile ardından dosya yükleme ve tersi):

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(); 
    } 
}; 

i dosyaya sayacı bağlamak istiyorum yükleniyor, bu yüzden dosya yüklendiğinde, dosya yüklenene kadar ilerleme gerçekleşir, ardından ilerleme tamamlanır ve açılış ekranı kaybolur.

Bir Task sonra dosya tamamen okunduğunda kontrol edip SplashScreen sona erebilir kullanılarak ProgressMonitor ve ProgressMonitorInputStream bakmak gerekir.

+0

Yavaş yükleme için ilerleme çubuğunu nasıl alabilirim, çünkü çok hızlı yükleniyor? Sayıyı artırmaya çalıştım ama hala çok hızlı yükleniyor. –

+0

@Msaleh Eğer kullandığınız kodu kullanıyorsanız, basit bir değişiklik yaparak 'timer1 = yeni Zamanlayıcı (400, al); 'büyük bir şeye değiştirin. Örnekte, zamanlayıcı her 0.5 saniyede çağrılacaktır. –

+0

, eğer 'if (count == 300)' ve 'timer1 = new Timer (50, al);' her biri arasındaki farkı açıklayabilir misiniz? . –

10

Java bir sadece bu amaç için SplashScreen sınıfında inşa etti. here'un nasıl kullanılacağı hakkında bir eğitim var. Sayaç belirtilen numaraya aldığında

+0

Bunun için teşekkürler. SplashScreen sınıfını belirtmeden önce API'da görmemiştim. – Bobulous