3
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 部分不会处理。

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

4

2 回答 2

9

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

解决方案是在后台线程中执行长时间运行的任务,例如 SwingWorker 对象提供的线程。然后您可以通过 SwingWorker 的发布/进程对更新进度条(如果是决定性的)。有关这方面的更多信息,请阅读这篇关于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 被执行。

于 2011-11-24T02:37:01.613 回答
2

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

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

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

您可以在这些链接中查看 Java 中的线程进度条

于 2011-11-24T04:42:35.713 回答