前两天做个项目,要后台用线程给前台送数据,没找到方法,老是报错,怀疑是SWT的问题,到处找SWT的资料看,都不成,
最后还是怀疑自己,发现了自己程序中的一个错误,最后才成功。SWT报错也奇怪,因为是我程序送的数据是NULL,结果不报我送的
程序出错处,而是最后是SWT...assertNotNull错误,使我以为是SWT的bug。
以下是例子代码:
界面程序:
public class ShowWindow extends ApplicationWindow {
public synchronized void addReceiveList(ArrayList receiveArr){
//receiveList是在界面中用作model的List
//receiveArr是后台送过来的新数据
if(receiveArr==null)return;
int len=receiveArr.size();
log.info("receive len="+len);
if(len==0)return;
int size=receiveList.size();
int extra=size+len-300;
if(extra>0){
for(int i=0;i<extra;i++) receiveList.remove(i);
}
receiveList.addAll(receiveArr);
receiveViewer.setInput(receiveList);
receiveViewer.refresh();
}
protected Control createContents(Composite parent) {
.......
receiveViewer = new TableViewer(container, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER|SWT.V_SCROLL|SWT.H_SCROLL);
receiveTable = receiveViewer.getTable();
receiveTable.setLinesVisible(true);
receiveTable.setHeaderVisible(true);
......
}
......
}
后台送数据的Thread:
public class ReceiveThread extends Thread{
public void run() {
try{
......
if(beanArr.size()>0){
showWindow.getDisplay().syncExec(new Runnable(){
public void run(){
showWindow.addReceiveList(beanArr);
}
});
}
}catch(Exception e){
showWindow.getDisplay().asyncExec(new Runnable () {
public void run () {
MessageDialog.openWarning(showWindow.getShell(),"系统出错","接收线程出错,已经停止运行!\n"+message);
}
});
}
}
}