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