【问题标题】:Running a JFrame with a JProgressBar使用 JProgressBar 运行 JFrame
【发布时间】:2011-11-24 02:34:02
【问题描述】:
public void myMethod {
   MyProgessBarFrame progFrame = new MyProgressBarFrame(); // this is a JFrame
   progFrame.setVisible(true); // show my JFrame loading

   // do some processing here while the progress bar is running
   // .....

   progFrame.setvisible(false); // hide my progress bar JFrame
} // end method myMethod

我有上面的代码。但是当我运行它时,在我关闭进度条 JFrame 之前,do some processing 部分不会处理。

如何在 do 处理部分显示我的进度条并告诉 Java 继续?

【问题讨论】:

  • 你读过JProgressBar API吗?它有一个指向 How to Monitor Progress 上的 Swing 教程的链接,其中还谈到了 ConcurrencySwingWorkers
  • 是的,camickr 是对的。
  • 谢谢大家!目前我没有时间阅读。我正在做一个项目:-(
  • 这就是为什么您要预先阅读,以便您了解基础知识并且不要浪费时间以错误的方式做事。

标签: java swing jframe jprogressbar


【解决方案1】:

您遇到了并发和 Swing 的经典问题。您的问题是您正在主 Swing 线程、EDT 或事件调度线程上执行长时间运行的任务,这将锁定线程直到进程完成,从而阻止它执行包括与用户交互在内的任务和绘制 GUI 图形。

解决方案是在后台线程中执行长时间运行的任务,例如 SwingWorker 对象提供的线程。然后您可以通过 SwingWorker 的发布/进程对更新进度条(如果是决定性的)。有关更多信息,请阅读Concurrency in Swing 上的这篇文章。

例如,

public void myMethod() {
  final MyProgessBarFrame progFrame = new MyProgessBarFrame();
  new SwingWorker<Void, Void>() {
     protected Void doInBackground() throws Exception {

        // do some processing here while the progress bar is running
        // .....
        return null;
     };

     // this is called when the SwingWorker's doInBackground finishes
     protected void done() {
        progFrame.setVisible(false); // hide my progress bar JFrame
     };
  }.execute();
  progFrame.setVisible(true);
}

另外,如果这是从另一个 Swing 组件显示的,那么您可能应该显示一个模态 JDialog 而不是 JFrame。这就是为什么我在 SwingWorker 代码之后 在窗口上调用 setVisible(true) 的原因——这样如果它是一个模态对话框,它就不会阻止 SwingWorker 被执行。

【讨论】:

  • 哇!似乎我需要了解很多概念才能成功地用 Java 进行 GUI 编程。我尝试了您的代码,它确实有效,尽管我仍然无法理解其背后的理论。我会在交付项目后立即阅读您提供的链接。非常感谢!
  • @Jec:这不仅适用于 GUI 编程,而且适用于一般编程。这就像找到一个永无止境的俄罗斯套娃。
【解决方案2】:

您会注意到,当显示进度条时,随着进度条的处理,实际任务也正在完成。所以你可以从这里理解多线程在进行。

在 Java 中,您可以创建一个单独的线程来显示进度条,而在主线程中您可以完成您的任务。因此,这两个过程将同时运行,它将满足您的需求。

*注意:进度条中显示的进度应取决于主线程中正在进行的处理。

您可以查看这些链接以获取 Java 中的 ThreadsProgress Bar

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多