一、普通页面的进度条
1、初始化进度条
Progressbar.setOrientation(JProgressBar.HORIZONTAL);//进度条的方向(水平)
Progressbar.setMinimum(0);//进度条最小值
progressbar.setMaximum(100);//最大值
progressbar.setValue(0);//设置进度条当前值
progressbar.setStringPainted(true);//设置进度条是否显示进度信息
2、New 一个Timer并实现监听接口:
//每隔50ms进度条的value加1
Timer timer=new Timer(50,new ActionListener(){
public void actionPerformed(ActionEvent e) {
//获得进度条当前值
int value=jProgressBar1.getValue();
if(value<100){
value++;
jProgressBar1.setValue(value);
}else{
timer.stop();
jProgressBar1.setValue(0);
}
}
});
3、在进度条的jProgressBar1StateChanged事件中加入:
private void m_stateChanged() {
int value=jProgressBar1.getValue();
jLabel1.setText("目前进度已完成:"+value+"%");
}
4、点击开始执行 timer.start();
总结:
对于能都通过一些方法知道程序进度的(比如文件的上传和下载能够通过已处理文件的大小和文件总共大小之间的比例算出进度)能够应用可确定进度的进度条,但如果不能确认程序的执行进度(比如加载窗口中的组件不能判断出程序已经加载了多少),这种情况只能使用不确定进度的进度条:(progressbar.setIndeterminate(true)不确定进度)
另外进度条还可以使用一些动态进度条图片来代替,在耗时进程之前让图片显示,耗时进程执行完后隐藏图片,如:
jLabel_msg.setText("正在验证,请等待...");
jLabel_load.setVisible(true);
//耗时进程
vo = Ench4newProxy.checkUser(vo);
jLabel_load.setVisible(false);
二、程序跳转之间的进度条
应用进度条之前要找到这个程序的耗时进程是什么,一般是连接数据库和初始化窗口,那么应该在main主线程中再开一个线程执行进度条,等到初始化窗口完毕后关闭进度条。
//运行线程
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
//验证信息
m_checkInfo();
//初始窗口
ComUtil.setupLookAndFeel();
JFrame_Main shell = new JFrame_Main();
shell.setVisible(true);
}
});
问题:netbeans中自动生成的这个线程java.awt.EventQueue.invokeLater(new Runnable()很特别,进度条窗口打开后,进度条不动只有等到所有页面全打开后才能动。
解决方法:将验证信息和初始化窗口两个方法放在java.awt.EventQueue.invokeLater(new Runnable()线程之外。如:
public static void main(String[] args) {
//运行进度条线程
final JProgressBar_Thread jprogressBar = new JProgressBar_Thread();
jprogressBar.start();
//验证信息
m_checkInfo();
//初始窗口
jprogressBar_status = "初始化窗口……";
//运行线程
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame_Main shell = new JFrame_Main();
shell.setVisible(true);
//关闭进度条
jprogressBar.close();
}
});
}
1、新建一个JDialog窗口
加入进度条控件(JProgressBar)设置进度条为不确定进度模式即属性indeterminate为true,并添加一些其他控件。
New 一个timer类,不断监听主程序的运行进度,并显示:
/**
* 监听进度条状态
*/
private Timer timer=new Timer(50,new ActionListener(){
public void actionPerformed(ActionEvent e) {
jLabel1.setText(JFrame_Main.jprogressBar_status);
}
});
2、新建一个进度条线程类
/**
* 进度条窗口线程
*/
static class JProgressBar_Thread extends Thread{
JDialog_JProgressBar dialog;
public void run(){
//得到屏幕方法
double width = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
double height = Toolkit.getDefaultToolkit().getScreenSize().getHeight();
dialog = new JDialog_JProgressBar(new javax.swing.JFrame(), true);
dialog.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
System.exit(0);
}
});
dialog.setLocation((int) (width - dialog.getWidth()) / 2, (int) (height - dialog.getHeight()) / 2);
dialog.setVisible(true);
}
public void close(){
dialog.dispose();
}
}
3、在main主线程中开始进度条线程,并且在窗口打开后关闭进度条窗口
三、swing组件的样式
通过:
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
设置swing为当前系统的样式
还可以设置其他样式如:
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");