为什么我的JFrame不更新
问题描述:
我对这个作品的JFrame的代码,将显示用户在图片的导入时间进度:为什么我的JFrame不更新
public class LoadFrame implements Runnable {
JProgressBar progressbar;
JPanel loadpanel;
MainScreen mainscreen;
int progress;
JDialog mainloadframe;
public LoadFrame(String operation) {
mainloadframe = new JDialog();
JLabel operationlabel = new JLabel(operation);
progressbar = new JProgressBar(0, 100);
loadpanel = new JPanel();
mainloadframe.setSize(300, 75);
mainloadframe.setLocationRelativeTo(null);
mainloadframe.setLayout(new GridLayout(1, 2));
mainloadframe.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
mainloadframe.setAlwaysOnTop(true);
mainloadframe.setTitle(operation);
mainloadframe.setVisible(true);
progressbar.setValue(0);
progressbar.setStringPainted(true);
loadpanel.add(progressbar);
loadpanel.add(operationlabel);
mainloadframe.add(loadpanel);
}
public void setMainScreen(MainScreen mainscreen) {
this.mainscreen = mainscreen;
}
public void disposeLoadFrame() {
mainloadframe.dispose();
}
public void setProgress(int progress) {
this.progress = progress;
}
@Override
public void run() {
while (progress != 100) {
progressbar.setValue(progress);
}
}
}
进步的实际计算还处于完成线程,但出于某种原因,在图像完成导入之前,进度条不会显示在JFrame上。我很确定这是一个线程问题,但我似乎无法弄清楚。一点帮助,将不胜感激。
答
Runnable#Thread
不是start()
(后到论坛)必须添加
Thread.sleep(int)
成run()
,然后progressbar.setValue(progress);
MEST通过使用可运行util.Timer替代地被包裹成invokeLater()
#Thread,然后
progressbar.setValue(progress);
mest被包裹成invokeLater()
- 使用
Swing Timer
- 正确的方式是从
SwingWorker
UI更新调用
progressbar.setValue(progress);
对EDT的情况发生。从任何其他线程做到这一点是未定义的行为,并导致任何东西从不稳定的绘图,错误的控制弹出各地,正常工作,根本不工作。 – Joey 2013-05-10 14:04:57