为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

红糖糍粑 2019-04-13 08:36:27
outPrint.setText("其他地方数据正在清空...");//这个没有显示outPrint.repaint();//没用outPrint.validate();//没用try{Thread.sleep(3000);}catch(InterruptedExceptione1){e1.printStackTrace();}就是给个提示,正在清空,等一会(3000ms)
查看完整描述

2 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

在UI线程sleep等待,是不会刷新界面的。
outPrint.setText("其他地方数据正在清空...");
newThread(){
publicvoidrun(){
try{
//sleep或做其它事情
}finally{
outPrint.setText("清空完毕");
}
}
}.start();
                            
查看完整回答
反对 回复 2019-04-13
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

Swing是单线程事件分发机制来处理界面响应的,如果只是想等待一段时间然后刷新界面可以这样:
outPrint.setText("其他地方数据正在清空...");
EventQueue.invokeLater(newRunnable(){
Thread.sleep(3000);
outPrint.repaint();
});
如果要做一个比较耗费时间的操作,最好还是用SwingWorker类
通过SwingWorker的doInBackground()方法处理费时间的任务,调用publish(...)把中间数据发布出来使得process方法可以接收到;
方法process(...)来做中间数据的处理;
方法done()来做任务结束后的界面更新。
/**
*假设用来更新进度条,进度条的满值为100
*@ClassName:SimActivity
*@Description:TODO
*
*/
privateclassSimActivityextendsSwingWorker{
privateintcurrent=0;
privateinttarget=0;
publicSimActivity(inttarget){
this.target=target;
}
@Override
protectedVoiddoInBackground()throwsException{
//这里执行耗时的操作,例如读取文件
try{
while(currentThread.sleep(100);
current++;
publish(current);
}
}catch(InterruptedExceptione){
}
returnnull;
}
@Override
protectedvoidprocess(Listchunks){
for(Integerchunk:chunks){
//进度条设置值
processBar.setValue(chunk);
}
}
@Override
protectedvoiddone(){
//完成后的清理工作例如刷新界面或者改变某些组件的状态等
}
}
                            
查看完整回答
反对 回复 2019-04-13
  • 2 回答
  • 0 关注
  • 1938 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信