我有一个在处理动作事件时GUI已锁定的GUI,所以我需要一个进度条来显示。我可以显示JDialog
,但进度条不会显示。我使用SwingUtilities.invokeLater()
和invokeAndWait()
但无济于事。进度条不会显示。任何提示或帮助将不胜感激。
pb = new JProgressBar(0, 100);
pb.setPreferredSize(new Dimension(175, 40));
pb.setString("Working");
pb.setStringPainted(true);
JLabel label = new JLabel("Progress: ");
JPanel center_panel = new JPanel();
center_panel.add(label);
center_panel.add(pb);
dialog = new JDialog((JFrame) null, "Working ...");
dialog.getContentPane().add(center_panel, BorderLayout.CENTER);
dialog.pack();
dialog.setLocationRelativeTo(this); // center on screen
dialog.toFront(); // raise above other java windows
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
dialog.setVisible(true);
pb.setIndeterminate(true);
}
});
Thread.sleep(5000);
template = AcronymWizardController
.sharedInstance().readAndDislpayDocx(contdFile);
parseDocxText(contdFile);
pb.setIndeterminate(false);
savedFile.setText(contdFile.toString());
dialog.dispose();
答案 0 :(得分:4)
Swing是一个单线程API,也就是说,所有UI更新和修改都是在一个线程中执行的(称为事件调度线程或EDT)。阻止此线程的任何内容都将阻止它处理其他更新,例如重绘。
你有很多选择。您的直接要求是将长时间运行的任务从EDT中移除。为此,您可以使用SwingWorker
或Thread
。
根据您的说明,SwingWorker
会更容易。
举一个简单的例子,请查看JProgressBar won't update
有关详细信息,请查看Concurrency in Swing
您的其他选择是使用类似ProgressMonitor
,example here