如何更新 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()
方法进程替换计时器。
为此,您需要执行以下操作:
- 确保您的
update()
方法 运行 在与 swing 线程分开的线程中(此处可以使用类似 SwingWorker
的方法)。
- 当您想要更新栏时,您需要在更新线程中调用
progressBar.setValue(x)
,其中 x = how far your process has got
。
- 在更新线程中添加对
progressBar.setValue(x)
的更多调用。你可以把它们放在任何你喜欢的地方,但最好把它们放在长过程之前和之后。
注意:您将线程用于进度条。这意味着你可以 运行 变成 deadlock and race conditions 这样的东西。小心!
首先,我使用 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()
方法进程替换计时器。
为此,您需要执行以下操作:
- 确保您的
update()
方法 运行 在与 swing 线程分开的线程中(此处可以使用类似SwingWorker
的方法)。 - 当您想要更新栏时,您需要在更新线程中调用
progressBar.setValue(x)
,其中x = how far your process has got
。 - 在更新线程中添加对
progressBar.setValue(x)
的更多调用。你可以把它们放在任何你喜欢的地方,但最好把它们放在长过程之前和之后。
注意:您将线程用于进度条。这意味着你可以 运行 变成 deadlock and race conditions 这样的东西。小心!