最近一直在帮别人调SWT项目的错误,觉得这个错误有必要记下来……
在console中发现是这个错误,我们可以进行如下判断:
1、从console中点击到swt底层代码,会发现,给控件setText()时, setText()方法会调用checkWidgt()方法,
2、checkWidgt()方法会判断现在使用的线程是否是打开面板时的线程,
3、所以,在方法中调用了线程,而线程又要给某个面板中的控件setText()时,就要异步调用setText()。
Display.getDefault().asyncExec(new Runnable(){//在新线程中访问主线程main中的组件,必须使用异步调用方案public void run(){
EmailChecking.label_1.setText(time);
}
});
我们来看个例子:
//发邮件操作
SendEmailUtil email=new SendEmailUtil(true);
yzm=email.send("13298581430@163.com",toAddr,null);
在send()方法中,调用了新的线程。
新线程中的run()方法:
public void run() {
// 设置日期2012-12-21
Calendar c = Calendar.getInstance();
c.set(2012, 12, 21, 0, 0, 0);
// 单独设置年、月、日、小时、分钟、秒
c.set(Calendar.YEAR, 2012);
c.set(Calendar.MONTH, Calendar.DECEMBER); // 0 表示1月,11 表示12月
c.set(Calendar.DAY_OF_MONTH, 21);
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
// 获取2012-12-21 0:0:0时间点对应的毫秒数
long endTime = c.getTimeInMillis();
// 获取系统当前时间
Date now = new Date();
// 获取当前时间点对应的毫秒数
long currentTime = now.getTime();
// 计算两个时间点相差的秒数
long seconds = (endTime - currentTime) / 1000;
seconds=10;
boolean flag=true;
while (flag) {
final String time="还剩: " + seconds + " 秒";
Display.getDefault().asyncExec(new Runnable(){//在新线程中访问主线程main中的组件,必须使用异步调用方案
public void run(){
//label.setText(df.format(date));
EmailChecking.label_1.setText(time);
isTimeOut=true;
}
});
seconds--;
if(seconds==-1){
flag=false;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
isTimeOut=false;
}