【问题标题】:JDialog with a JProgressBar [duplicate]带有 JProgressBar 的 JDialog [重复]
【发布时间】:2012-12-22 22:25:27
【问题描述】:

可能重复:
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();

【问题讨论】:

  • @JBNizet 这与这里提出的大约一半的 Swing 问题重复 ;)
  • @MadProgrammer:确实如此。这使得再次问它变得更糟,因此我投票赞成。我想知道怎么可能找不到答案。我链接到的重复问题是右侧“相关”部分中的第一个问题。
  • @JBNizet Hay,你得到了我的 +1 ;)

标签: java swing jdialog jprogressbar


【解决方案1】:

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

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

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

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

如需了解更多信息,请查看Concurrency in Swing

您的其他选择是使用 ProgressMonitor、example here 之类的东西

【讨论】:

  • +1 不错的答案和关于 EDT 的知识
  • 感谢您的信息,但 netbeans 平台有一个进度实用程序,我可以使用它不需要线程管理。
猜你喜欢
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
相关资源
最近更新 更多