Hacer pantalla de inicio con barra de progreso como Eclipse

Mi clase principal carga la configuración de un archivo y luego 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.

Código de 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, así que infórmeme sobre cómo lograrlo.

ACTUALIZACIÓN: he encontrado el siguiente ejemplo, pero tiene un pequeño problema:

  • cuando el contador llega al número especificado, debe detenerse en (300), sigue contando para siempre sin detener el temporizador ni ocultar la pantalla de bienvenida.

  • Quiero vincular el contador con 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 } } } 

cuando el contador llega al número especificado, debe detenerse en (300), sigue contando para siempre sin detener el temporizador ni ocultar la pantalla de bienvenida.

El siguiente código parece funcionar muy bien (con el error fatal, el contador puede tardar más tiempo que la carga del archivo 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 vincular el contador con 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.

Debería echar un vistazo a ProgressMonitor y ProgressMonitorInputStream usando una Task que luego puede verificar cuando el archivo está completamente leído y finalizar SplashScreen . mira aquí para un gran tutorial y explicación

Java tiene una clase integrada SplashScreen solo para este propósito. Hay un tutorial sobre cómo usarlo aquí .