我有来自UI的服务器调用。它的响应时间有点高。所以我想在从服务器加载数据时显示进度条。我使用此approach尝试了以下代码来显示进度条。我在做错的地方当我在按钮点击时调用calculateResult()
方法时,我没有看到进度条。我无需在进度条上显示任何百分比。它只需要显示数据正在加载。
//我试过以下代码。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
public class MyProgressBarTest extends JFrame {
private static final long serialVersionUID = 1L;
private static JProgressBar progressBar;
public static void main(String[] args) {
MyProgressBarTest obj = new MyProgressBarTest();
obj.createGUI();
}
public void createGUI() {
JPanel panel = new JPanel();
JButton button = new JButton("Progress");
progressBar = new JProgressBar();
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
MyCustomProgressBarDialog progressBarObj = new MyCustomProgressBarDialog(progressBar);
progressBarObj.createProgressUI();
MyActionPerformer actionObj = new MyActionPerformer(progressBar);
actionObj.execute();
progressBarObj.setVisible(false);
}
});
// panel.add(progressBar);
panel.add(button);
add(panel);
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
setLocationRelativeTo(null);
// pack();
setSize(200, 300);
setVisible(true);
}
}
class MyActionPerformer extends SwingWorker<String, Object> {
JProgressBar fProgressBar;
public MyActionPerformer(JProgressBar progressBar) {
this.fProgressBar = progressBar;
this.fProgressBar.setVisible(true);
this.fProgressBar.setIndeterminate(true);
}
protected String doInBackground() throws Exception {
calculateResult();
return "Finished";
}
protected void done() {
fProgressBar.setVisible(false);
}
public void calculateResult() {
for (int i = 0; i < 500000; i++) {
System.out.println("Progress Bar: " + i);
}
}
}
class MyCustomProgressBarDialog extends JDialog {
private static JProgressBar progressBar;
public MyCustomProgressBarDialog(JProgressBar progressBar) {
this.progressBar = progressBar;
}
public void createProgressUI() {
add(progressBar);
setLocationRelativeTo(null);
setSize(50, 20);
setVisible(true);
}
}
答案 0 :(得分:5)
您的进度条立即消失的原因是ActionListener
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
MyCustomProgressBarDialog progressBarObj = new MyCustomProgressBarDialog(progressBar);
progressBarObj.createProgressUI();
MyActionPerformer actionObj = new MyActionPerformer(progressBar);
actionObj.execute();
progressBarObj.setVisible(false);
}
});
actionObj.execute();
方法没有阻止(好东西或者它没用),这意味着在你通过该调用启动SwingWorker
之后,你将立即执行progressBarObj.setVisible(false);
语句。
这会导致进度条对话框消失。
我可以想到2个解决方案
SwingWorker
,然后使用setVisible( false )
done
方法在对话框中致电SwingWorker
SwingWorker
会触发PropertyChangeEvent
,以便您确定进度。您可以使用此类侦听器在计算完成时隐藏对话框答案 1 :(得分:1)
您无法看到进度条,因为您没有将其添加到面板
简单:
panel.add(PROGRESS_BAR);
panel.add(button);
会做到这一点。
我希望它有所帮助。干杯
答案 2 :(得分:1)
JProgressBar
是Component
。必须将其添加到Container
才能显示。你没有在任何地方添加你的。