Possible Duplicate:
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();

最佳答案

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

您有很多选择。您的紧迫要求是将长期运行的任务移出EDT。为此,您可以使用SwingWorkerThread

根据您的描述,SwingWorker会更容易。

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

有关更多信息,您应该签出Concurrency in Swing

您的另一选择是使用ProgressMonitorexample here之类的东西

07-24 09:47
查看更多