使用像Eclipse这样的进度条制作启动画面

我的主类从文件加载配置然后显示一个框架。 我想使用像Eclipse这样的进度条创建一个启动画面,以便在加载文件时进度会增加,并且在加载文件后浮动消失。 然后我的主框架被加载。

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

我对Swing没有多少经验,所以请告知如何实现这一目标。

更新:我找到了以下示例,但它没有什么问题:

  • 当计数器达到指定的数字时,它应该停在(300),它会一直计数,而不会停止计时器并隐藏启动画面。

  • 我想将计数器绑定到文件加载,因此在加载文件时,加载进度直到文件加载,然后进度完成,启动屏幕消失。

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

当计数器达到指定的数字时,它应该停在(300),它会一直计数,而不会停止计时器并隐藏启动画面。

下面的代码似乎工作得很好(有致命的缺陷,计数器可能需要比文件加载更长的时间,反之亦然):

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

我想将计数器绑定到文件加载,因此在加载文件时,加载进度直到文件加载,然后进度完成,启动屏幕消失。

您应该使用Task查看ProgressMonitorProgressMonitorInputStream然后可以检查文件何时完全读取并结束SplashScreen 。 看到这里的一些很棒的教程和解释

Java有一个内置的SplashScreen类,仅用于此目的。 这里有一个关于如何使用它的教程。