如何更新 ProgressBar 并在需要时停止它?

How to update a ProgressBar and stop It when I want?

首先,我使用 Eclipse IDE。所以我的问题是:我创建了一个进度条,但是我想让它根据程序所在的位置加载。我有一个刷新按钮,当我点击它时,我的整个程序都会更新。我要的是一个进度条,伴随着更新的过程,结束的时候结束。

抱歉,如果我的英语不是最好的,但我是一名年轻的葡萄牙开发人员。

我的按钮代码

JButton btnActualizar = new JButton("\u21BB");
    btnActualizar.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {


            TxtIpExternoLoja.setText(" ");
            TxtSSIDLoja.setText(" ");
            TxtFirewallLoja.setText(" ");

            TxtIpLojaEtho.setText(" ");
            TxtMaskLojaEtho.setText(" ");
            TxtGWLojaEtho.setText(" ");
            TxtDns1LojaEtho.setText(" ");
            TxtDns2LojaEtho.setText(" ");

            TxtIpLojaWlan.setText(" ");
            TxtMaskLojaWlan.setText(" ");
            TxtGwLojaWlan.setText(" ");
            TxtDns1LojaWlan.setText(" ");
            TxtDns2LojaWlan.setText(" ");

            TxtIpLojaVpn.setText(" ");
            TxtMaskLojaVpn.setText(" ");
            TxtGwLojaVpn.setText(" ");
            TxtDns1LojaVpn.setText(" ");
            TxtDns2LojaVpn.setText(" ");

            // DefaultTableModel model = (DefaultTableModel)
            // tablePing.getModel();
            // model.setRowCount(0);
            TxtTime.setText(" ");

            i = 0;
            t.start();
            btnActualizar.setEnabled(false);
            update();

        }
    });

我的进度条代码:

JProgressBar progressBar = new JProgressBar(0, 15);
    GridBagConstraints gbc_progressBar = new GridBagConstraints();
    gbc_progressBar.insets = new Insets(0, 0, 0, 5);
    gbc_progressBar.gridx = 3;
    gbc_progressBar.gridy = 0;
    PanelBotoes.add(progressBar, gbc_progressBar);
    GridBagConstraints gbc_btnImprimir = new GridBagConstraints();
    gbc_btnImprimir.insets = new Insets(0, 0, 0, 5);
    gbc_btnImprimir.gridx = 5;
    gbc_btnImprimir.gridy = 0;
    PanelBotoes.add(btnImprimir, gbc_btnImprimir);
    progressBar.setStringPainted(true);
    progressBar.setValue(0);

    t = new Timer(interval, new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            if (i == 15) {
                t.stop();
                btnActualizar.setEnabled(true);
            } else {
                i++;
                progressBar.setValue(i);
            }
        }
    });

看看这个页面:https://docs.oracle.com/javase/tutorial/uiswing/components/progress.html

具体来说,关于“使用确定进度条”的部分应该是您要查找的内容。示例代码有点复杂,但可能与这些东西一样简单。

注意:该示例使用 SwingWorker (more on those here) 来更新进度值。这是因为进度条是在 Swing 线程中绘制的,如果进程也在该线程上 运行ning 则不会更新。 您将需要在不是 Swing 线程的线程上更新您的程序。


编辑 1 - 为您的问题更新代码

看来您已经对进度条代码有了想法。我没有 运行 它,但你得到的看起来应该可以工作。您的下一步是用 update() 方法进程替换计时器。 为此,您需要执行以下操作:

  1. 确保您的 update() 方法 运行 在与 swing 线程分开的线程中(此处可以使用类似 SwingWorker 的方法)。
  2. 当您想要更新栏时,您需要在更新线程中调用 progressBar.setValue(x),其中 x = how far your process has got
  3. 在更新线程中添加对 progressBar.setValue(x) 的更多调用。你可以把它们放在任何你喜欢的地方,但最好把它们放在长过程之前和之后。

注意:将线程用于进度条。这意味着你可以 运行 变成 deadlock and race conditions 这样的东西。小心!