使用JProgressBar运行JFrame

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之前,一些处理部分不会处理。

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

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

解决方案是在后台线程中执行长时间运行的任务,例如SwingWorker对象给出的。 然后,您可以通过SwingWorker的发布/进程对更新进度条(如果是决定因素)。 有关这方面的更多信息,请阅读本文关于Swing中的并发性 。

例如,

 public void myMethod() { final MyProgessBarFrame progFrame = new MyProgessBarFrame(); new SwingWorker() { 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)的原因 – 这样如果它是一个modal dialog,它就不会阻止SwingWorker被执行。

您会注意到,当显示进度条时,以及进度条的处理,实际任务也正在完成。 所以你可以从这里了解到存在multithreading。

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

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

您可以在Java中查看Threads & Progress Bar的这些链接。