java swing awt, 如何实现一个按钮按下之后刷新界面

 outPrint.setText"其他地方数据正在清空...";//这个没有显示 outPrint.repaint;//没用 outPrint.validate;//没用 try { Thread.sleep3000; } 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.invokeLaternew Runnable{ Thread.sleep3000; 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 SimActivityint target{ this.target = target; } @Override protected Void doInBackground throws Exception { //这里执行耗时的操作,例如读取文件 try{ whilecurrent<target{ Thread.sleep100; current++; publishcurrent; } }catchInterruptedException e{ } return null; } @Override protected void processList<Integer> chunks { forInteger chunk : chunks{ //进度条设置值 processBar.setValuechunk; } } @Override protected void done { //完成后的清理工作例如刷新界面或者改变某些组件的状态等 } }

使用sleep方法有时间上的不确定性,你并不能确认你最终需要执行多少时间
使用事件监听回调机制

发表评论

电子邮件地址不会被公开。 必填项已用*标注