0

可能重复:
Java GUI JProgressBar 未绘制

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

1 回答 1

4

Swing 是单线程 API,也就是说,所有 UI 更新和修改都在单个线程(称为事件调度线程或 EDT)内执行。任何阻塞该线程的东西都会阻止它处理额外的更新,比如重绘。

你有很多选择。您的直接要求是将长期运行的任务从 EDT 中移出。为此,您可以使用 aSwingWorker或 a Thread

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

举个简单的例子,看看JProgressBar 不会更新

有关更多信息,您应该查看Swing 中的并发

您的其他选择是在此处使用类似ProgressMonitor,的示例

于 2012-12-22T22:51:36.237 回答