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

setText() not working in mouseClicked() function

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

Thread.sleep() 会导致事件调度线程 (EDT) 休眠,这意味着 GUI 在循环代码执行完毕之前无法重新绘制自身。

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

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

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