你有一个经典的并发和Swing问题.您的问题是您在主Swing线程,EDT或事件调度线程上执行长时间运行的任务,这将锁定线程,直到该过程完成,从而阻止它执行其任务,包括与用户交互和绘制GUI图形.
解决方案是在后台线程中执行长时间运行的任务,例如SwingWorker对象给出的.然后,您可以通过SwingWorker的发布/进程对更新进度条(如果是决定因素).有关这方面的更多信息,请阅读Concurrency in 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)的原因 – 这样如果它是一个模态对话框,它就不会阻止SwingWorker被执行.