使用JProgressBar运行JFrame

eps*_*sac 3 java swing jframe jprogressbar

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
Run Code Online (Sandbox Code Playgroud)

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

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

Hov*_*els 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);
}
Run Code Online (Sandbox Code Playgroud)

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