JProgressBar问题总结
设置JProgressbar主要有以下几个点:
jpb.setMaximum(100);//设置最大值
jpb.setMinimum(0);//设置最小值
jpb.setValue(0);//设置初始值
jpb.setStringPainted(true);//设置进度条上是否显示进度具体进度如50%
jpb.setPreferredSize(new Dimension(400,50));设置大小,注意不是setsize
还有就是他有一个ChangeListener事件,可以监听进度条的变化。
这是我再百度上看到的那个人得
问题,和我的差不多。
//如下程序,在运行的时候,本应该进度从0显示到9(每0.1秒进度加1)。
//可是为什么结果是:按下“start”后,没反应,经过短暂的时候,直接
//显示9?谁能告诉我其中的原因。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class NewClass
{
static JProgressBar jpb=null;
static JButton jb=null;
public static void main(String args[])
{
JFrame frm=new JFrame();
Container contentPane=frm.getContentPane();
jpb=new JProgressBar();
jpb.setOrientation(JProgressBar.HORIZONTAL);
jpb.setMaximum(100);jpb.setMinimum(0);jpb.setValue(0);
jpb.setStringPainted(true);
jpb.setPreferredSize(new Dimension(400,50));
contentPane.add(jpb,BorderLayout.CENTER);
jb=new JButton("Start");
jb.addActionListener(new Change());
contentPane.add(jb,BorderLayout.SOUTH);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.pack();
frm.setVisible(true);
}
static class Change implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
for(int i=1;i<10;i++)
{
try
{
Thread.sleep(100);jpb.setValue(i);
}catch(InterruptedException ie){}
}
}
}
}
解决办法:
因为你的程序是单线程的。当你按下按钮的时候,
程序就开始执行那个for循环,直到for循环结束为止,程序的控制权才会返回,这段时间内,程序的控制权都在for循环那里,而那里不会做任何事情,只是在不断的设置一个值,然后睡觉。你注意,这时候界面是死的,进度条根本得不到重新绘制的机会(界面重绘,按钮的响应,都是由同一个线程分发的事件,你现在按钮响应事件中写setValue会在事件队列中添加一个事件,但是你自己还没完成,后续的当然更不可能做了),甚至你可以发现你按下按钮后,按钮保持深色,这表明按钮根本没有弹起来。在做这种时间非常长的事件处理的时候,你要新开一个线程才可以。这样,actionPerformed只是新建了一个线程,他会迅速返回,那么后续的repaint事件也可以及时得到执行,GUI就不会死了~
static class Change impl
ements ActionListener {
public void actionPerformed(ActionEvent e) {
new Thread(new Runnable() {
public void run() {
for (int i = 1; i < 10; i++) {
try {
Thread.sleep(100);
jpb.setValue(i);
} catch (InterruptedException ie) {
}
}
}
}).start();
}
}