outPrint.setText("其他地方数据正在清空...");//这个没有显示
outPrint.repaint();//没用
outPrint.validate();//没用
try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
就是给个提示,正在清空,等一会(3000ms)
在UI线程sleep等待,是不会刷新界面的。
outPrint.setText("其他地方数据正在清空...");
new Thread(){
public void run(){
try{
//sleep或做其它事情
}finally{
outPrint.setText("清空完毕");
}
}
}.start();
Swing是单线程事件分发机制来处理界面响应的,如果只是想等待一段时间然后刷新界面可以这样:
outPrint.setText("其他地方数据正在清空...");
EventQueue.invokeLater(new Runnable(){
Thread.sleep(3000);
outPrint.repaint();
});
如果要做一个比较耗费时间的操作,最好还是用SwingWorker类
通过SwingWorker的 doInBackground()方法处理费时间的任务,调用publish(...)把中间数据发布出来使得process方法可以接收到;
方法process(...) 来做中间数据的处理;
方法 done() 来做任务结束后的界面更新。
/**
* 假设用来更新进度条,进度条的满值为100
* @ClassName: SimActivity
* @Description: TODO
*
*/
private class SimActivity extends SwingWorker<Void,Integer>{
private int current = 0;
private int target = 0;
public SimActivity(int target){
this.target = target;
}
@Override
protected Void doInBackground() throws Exception {
//这里执行耗时的操作,例如读取文件
try{
while(current<target){
Thread.sleep(100);
current++;
publish(current);
}
}catch(InterruptedException e){
}
return null;
}
@Override
protected void process(List<Integer> chunks) {
for(Integer chunk : chunks){
//进度条设置值
processBar.setValue(chunk);
}
}
@Override
protected void done() {
//完成后的清理工作例如刷新界面或者改变某些组件的状态等
}
}
使用sleep方法有时间上的不确定性,你并不能确认你最终需要执行多少时间
使用事件监听回调机制