Java 强制JFrame刷新

Java 强制JFrame刷新,java,refresh,jframe,Java,Refresh,Jframe,我在JFrame中构建了一个UI。其中一个按钮启动一个长时间运行的调用(仍然在同一个java进程中),在执行过程中,UI被冻结 我想,为了弄清楚程序仍在运行,我可以显示一个进度条,也许是在弹出窗口中,这样用户就可以随时了解程序正在做什么 因此,我创建了一个新的JDialog,在其中添加了一个JProgressBar,并在事情发生时对其进行更新。问题是该对话框的内容没有得到更新。我对它的标题所做的更改会立即显示出来,我输出到控制台的任何内容都会立即显示出来,但UI本身不会显示任何内容 我是否可以发

我在JFrame中构建了一个UI。其中一个按钮启动一个长时间运行的调用(仍然在同一个java进程中),在执行过程中,UI被冻结

我想,为了弄清楚程序仍在运行,我可以显示一个进度条,也许是在弹出窗口中,这样用户就可以随时了解程序正在做什么

因此,我创建了一个新的JDialog,在其中添加了一个JProgressBar,并在事情发生时对其进行更新。问题是该对话框的内容没有得到更新。我对它的标题所做的更改会立即显示出来,我输出到控制台的任何内容都会立即显示出来,但UI本身不会显示任何内容

我是否可以发出命令强制重新绘制

以下是本节的核心内容:

  killWindow = new JDialog();
  killWindow.setUndecorated(true);
  killWindow.setTitle("stopping tests - 0 of " + numActive);
  killProgress = new JProgressBar(0, numActive);
  killWindow.add(killProgress);
  killProgress.setStringPainted(true);
  killWindow.pack();
  killWindow.setLocationRelativeTo(frame);
  killWindow.setVisible(true);
然后,随着我们的进步…:

  killProgress.setValue(++killedTests);                    // not seen!
  killProgress.setString("Killing test on " + nickname()); // not seen!
  log("Killed another test, " + killedTests + " so far");  // visible in real time
  killWindow.setTitle("stopping tests - " + killedTests +
                      " of " + killProgress.getMaximum()); // visible in real time

我错过了什么?我试着在这里搜索,但没有看到任何明显的东西?

你必须在另一个线程中执行长时间运行的任务

有一个名为“AWT事件分派线程”的线程,负责UI组件的更新。如果它正忙于执行长时间运行的任务,它将不会更新UI(也不会刷新您的对话框)

你可以考虑使用A/.P/> 来自SwingWorker这是一个样本

final JLabel label;
class MeaningOfLifeFinder extends SwingWorker<String, Object> {
   @Override
   public String doInBackground() {
       return findTheMeaningOfLife();
   }

   @Override
   protected void done() {
       try { 
           label.setText(get());
       } catch (Exception ignore) {
       }
   }
}

(new MeaningOfLifeFinder()).execute();
最终JLabel标签;
类的意思是FlifeFinder扩展了SwingWorker{
@凌驾
公共字符串doInBackground(){
return find themeaningoflife();
}
@凌驾
受保护的void done(){
试试{
label.setText(get());
}捕获(异常忽略){
}
}
}
(新含义flifefinder()).execute();
通过在不同的线程中运行长任务,您允许AWT事件调度线程显示响应UI


您可以查看此“”以更好地理解这些概念。

听起来您可能正在事件调度线程(EDT)上运行长时间运行的任务。看看SwingWorker。如果您使用的是1.6,它内置:

如果没有,您可以在以下网址找到更多信息: