setText()在mouseClicked()函数中不起作用

时间:2015-10-06 17:38:43

标签: java swing mouselistener thread-sleep

 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循环之后工作

1 个答案:

答案 0 :(得分:3)

Thread.sleep()导致事件调度线程(EDT)休眠,这意味着GUI不能重新绘制自己,直到循环代码执行完毕。

不要使用Thread.sleep。相反,长时间运行的代码应该在一个单独的线程中执行,这样你就不会阻止EDT。您可能应该使用SwingWorker

阅读Concurrency上Swing教程中的部分,了解有关此方法的更多信息和工作示例。

您还可以阅读How to Use Progress Bars部分,了解正确执行此操作的方法。