public class Pragrassbar extends JFrame implements MouseListener {
JProgressBar jb;
int i = 0, num = 0;
JButton jbt;
JLabel jl;
Pragrassbar() {
setSize(400, 400);
setLayout(new FlowLayout());
jbt = new JButton("Start");
jl = new JLabel("Click Start!");
jb = new JProgressBar(0, 2000);
jb.setValue(0);
jb.setStringPainted(true);
jbt.addMouseListener(this);
add(jbt);
add(jb);
add(jl);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void mouseClicked(MouseEvent me) {
jl.setText("downloading.....");
jbt.setEnabled(false);
try {
while (i <= 2000) {
jb.setValue(i);
jb.paintImmediately(0, 0, 200, 25);
i = i + 40;
Thread.sleep(30);
}
jl.setText("download complete");
jbt.setEnabled(true);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
Pragrassbar m = new Pragrassbar();
m.setVisible(true);
}
setText()在MouseListener接口的mouseClicked函数下无法正常工作 虽然它在我使用的while循环之后工作
答案 0 :(得分:3)
Thread.sleep()导致事件调度线程(EDT)休眠,这意味着GUI不能重新绘制自己,直到循环代码执行完毕。
不要使用Thread.sleep。相反,长时间运行的代码应该在一个单独的线程中执行,这样你就不会阻止EDT。您可能应该使用SwingWorker
。
阅读Concurrency上Swing教程中的部分,了解有关此方法的更多信息和工作示例。
您还可以阅读How to Use Progress Bars部分,了解正确执行此操作的方法。