问题是你在打电话
.repaint()
在同一个线程中,你正在做你的“工作”(thread.sleep)。
"repaint() does not invoke paint() directly. It schedules a call to an intermediate method, update(). Finally, update() calls paint()..."
。这意味着你正在安排一堆
repaint()
呼叫,但它们未被处理。我还打赌,一旦值达到100,进度条就会跳到满,这是因为主线程已经结束
重新绘制()
呼叫终于被处理了。
为了使jProgressBars正常工作,您必须让它们的重新绘制发生在与您正在工作的线程不同的线程中(这显然也应该发生在不同的线程-这对于大多数Swing更新也是如此)。在调用代码之前,请尝试在新线程中启动此Runnable:
public class ProgressBarPainter implements Runnable{
public JProgressBar jProgressBar1;
public void run(){
while(true){
try {
Thread.sleep(50);
jProgressBar1.repaint();
} catch (InterruptedException ex) {
break;
}
}
}
}
实例
运转
使用上述内容的代码:
public class Frame extends JFrame {
private static final long serialVersionUID = 1L;
private JProgressBar bar;
public Frame(){
JPanel contentPanel = (JPanel) getContentPane();
JButton b = new JButton("Do Process");
b.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
ProgressBarPainter p = new ProgressBarPainter();
p.jProgressBar1 = bar;
Thread t = new Thread(p);
t.start();
Worker w = new Worker();
w.jProgressBar1 = bar;
Thread t2 = new Thread(w);
t2.start();
}
});
contentPanel.add(b, BorderLayout.SOUTH);
bar = new JProgressBar();
contentPanel.add(bar, BorderLayout.CENTER);
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new Frame();
}
}
class Worker implements Runnable{
public JProgressBar jProgressBar1;
public void run(){
int x = 0;
while(jProgressBar1.getValue() != jProgressBar1.getMaximum()){
try {
Thread.sleep(50);
jProgressBar1.setValue(x++);
} catch (InterruptedException ex) {
break;
}
}
}
}
class ProgressBarPainter implements Runnable{
public JProgressBar jProgressBar1;
public void run(){
while(true){
try {
Thread.sleep(50);
jProgressBar1.repaint();
} catch (InterruptedException ex) {
break;
}
}
}
}