带有JProgressBar的JDialog

时间:2012-12-22 22:25:28

标签: java swing jdialog jprogressbar

  

可能重复:
  Java GUI JProgressBar not painting

我有一个在处理动作事件时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();

1 个答案:

答案 0 :(得分:4)

Swing是一个单线程API,也就是说,所有UI更新和修改都是在一个线程中执行的(称为事件调度线程或EDT)。阻止此线程的任何内容都将阻止它处理其他更新,例如重绘。

你有很多选择。您的直接要求是将长时间运行的任务从EDT中移除。为此,您可以使用SwingWorkerThread

根据您的说明,SwingWorker会更容易。

举一个简单的例子,请查看JProgressBar won't update

有关详细信息,请查看Concurrency in Swing

您的其他选择是使用类似ProgressMonitorexample here

的内容