首先,我使用 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);
}
}
});
答案 0 :(得分:3)
请看这个页面:https://docs.oracle.com/javase/tutorial/uiswing/components/progress.html。
具体而言,“使用确定进度条”部分应该是您正在寻找的部分。示例代码有点复杂,但可能就像使用这些东西一样简单。
请注意:该示例使用SwingWorker
(more on those here)来更新进度值。这是因为进度条是在Swing线程中绘制的,如果进程也在该线程上运行,则不会更新。
您需要在不是Swing线程的线程上更新您的程序。
编辑1 - 使用代码更新您的问题
所以看起来你已经了解了进度条码。我没有运行它,但你看到它应该工作。下一步是使用update()
方法进程替换计时器。
为此,您需要执行以下操作:
update()
方法在与swing线程分开的线程中运行(此处可以使用类似SwingWorker
的内容)。progressBar.setValue(x)
,则需要在更新主题内调用x = how far your process has got
。progressBar.setValue(x)
的更多调用。您可以将它们放在任何您喜欢的地方,但最好在长时间处理之前和之后放置它们。注意:您 使用线程进行进度条。这意味着您可能遇到deadlock和race conditions之类的问题。小心!