关于swing中组件的刷新的刷新问题一角

木子的木木 2017-12-29 10:47:24

//一个更新JLabel的线程
<code>class CountLabel implements Runnable{
private JLabel label;
CountLabel(JLabel label){
this.label=label;
}
@Override
public void run() {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
String result_start = "共抓取";
String result_end = "条结果";
while (!c.getState()) {
label.setText(result_start+c.getList().size()+result_end);
}
}


}


//省略了无关代码
//这是ActionListener的一个方法
//crawler时一个自定义爬虫类的对象,其中有一个耗时较长的getInfo方法
//我希望在JLabel上实时更新爬取的数据条数
//可能会写出下面的代码
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
if (arg0.getActionCommand().equals("crawler")){
//关键代码
//如果直接从
new Thread(new CountLabel(countLabel)).start();
crawler.getInfo();
flButton.setEnabled(true);
}else if (arg0.getActionCommand().equals("filter")){
if (c.getState())
new Thread(progress).start();
else
JOptionPane.showMessageDialog(null, "爬取未完成");
}else if(arg0.getActionCommand().equals("save")){

}
}

好,ok,多线程刷新JLabel,想法是对的,但是由于主线程UI在Listener的actionPerformed阻塞了,就无法更新组件,修改后的代码如下

//让Crawler实现在另开的线程工作
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
if (arg0.getActionCommand().equals("crawler")){
//关键代码
//如果直接从
new Thread(new CountLabel(countLabel)).start();
new Thread(crawler).start();
flButton.setEnabled(true);
}else if (arg0.getActionCommand().equals("filter")){
if (c.getState())
new Thread(progress).start();
else
JOptionPane.showMessageDialog(null, "爬取未完成");
}else if(arg0.getActionCommand().equals("save")){

}
}

上面我们把爬取的任务开了另一个线程执行,就不会让UI线程阻塞在监听器了
如有什么错误,请指正


...全文
374 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

50,531

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧