我的主类从文件加载配置然后显示一个框架。我想使用像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
}
}
}
答案 0 :(得分:10)
Java有一个内置的SplashScreen
类,仅用于此目的。有一个关于如何使用它的教程here。
答案 1 :(得分:8)
当计数器达到指定的数字时,它应该停在(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();
}
};
我想将计数器绑定到文件加载,所以当文件是 加载进度加载,直到文件加载然后 进度完成,启动画面消失。
您应该使用ProgressMonitor
查看ProgressMonitorInputStream
和Task
,然后您可以检查文件何时完全阅读并结束SplashScreen
。请参阅here了解一些很棒的教程和解释