使用像Eclipse这样的进度条制作启动画面 [英] Make splash screen with progress bar like Eclipse

查看:148
本文介绍了使用像Eclipse这样的进度条制作启动画面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

My main class loads configuration from a file then shows a frame. I want to make a splash screen with a progress bar like Eclipse so that the progress will increase while the file is being loaded and the splash disappears after the file is loaded. Then my main frame gets loaded.

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,请告知如何实现这一点。

I don't have much experience with Swing, so please advise how to accomplish that.

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

UPDATE: i have found the following example, but it have little issue:


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

  • when the counter gets to the specified number it should stop at (300) it keeps counting for ever without stopping the timer and hiding the splash screen.

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

i want to bind the counter to the file loading, so while the file is loaded the progress gets loaded until the file gets loaded then the progress completes and the splash screen disappears.

@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)
它会继续计数永远不会停止计时器并隐藏
启动画面。

when the counter gets to the specified number it should stop at (300) it keeps counting for ever without stopping the timer and hiding the splash screen.

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

The code below seems to work great (with the fatal flaw the counter may take longer then the file loading and vice versa):

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 want to bind the counter to the file loading, so while the file is loaded the progress gets loaded until the file gets loaded then the progress completes and the splash screen disappears.

您应该使用任务 ProgressMonitor ProgressMonitorInputStream c $ c>然后您可以检查文件何时被完全读取并结束 SplashScreen 。请参阅此处以获取一些精彩的教程和解释

You should take a look at ProgressMonitor and ProgressMonitorInputStream using a Task you may then check when the file is completely read and end the SplashScreen. see here for some great tutorial and explanation

这篇关于使用像Eclipse这样的进度条制作启动画面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆