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

时间:2016-01-27 10:34:27

标签: java updates jprogressbar

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

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

我的btn代码

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);
            }
        }
    });

1 个答案:

答案 0 :(得分:3)

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

具体而言,“使用确定进度条”部分应该是您正在寻找的部分。示例代码有点复杂,但可能就像使用这些东西一样简单。

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

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

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

  1. 确保您的update()方法在与swing线程分开的线程中运行(此处可以使用类似SwingWorker的内容)。
  2. 如果您要更新栏progressBar.setValue(x),则需要在更新主题内调用x = how far your process has got
  3. 在更新主题中添加对progressBar.setValue(x)的更多调用。您可以将它们放在任何您喜欢的地方,但最好在长时间处理之前和之后放置它们。
  4. 注意: 使用线程进行进度条。这意味着您可能遇到deadlockrace conditions之类的问题。小心!