现在要实现一个功能,在其他类中调用我自己创建的view中的table,使table刷新数据库的数据,但是奇怪的是他在 TableItem item=new TableItem(table,SWT.NONE);这一行却报错Argument can not be null的错。我一直不知道该怎么解决这个问题,因为我在自己的类中调用这行代码是没有错的。在和朋友的商量下查看,才发现,我在其他类中调用该类的方法时,是以如下形式调用的
TableView tableView=new TableView();
tableView.updateTable();
并在该行报错,后来才知道,主要有两点问题存在:
1)RCP中的View是单例模式,我不能重新实例化该view,应该以如下形式来做
在TableView中添加如下代码:
private static TableView tableView;
private static Table table;
public static TableView getTableView() {
if (tableView == null) {
tableView = new TableView();
}
return tableView;
}
并在调用该类的其他地方这样写:
TableView.getTableView().updateTable();(并注意红色字体部分,这里table必须以静态变量存在)
2)在完成上面的工作后,程序还是会报线程访问错误
这是因为RCP的UI线程与非UI线程的问题,这也是为什么我在自己的程序中创建table数据没有错,在其地方调用创建table数据却报错的原因。下面贴上updateTable完整的方法
public void updateTable() {
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
TableItem item = null;
Soldier soldierBasic = null;
SoldierRT soldierRT = null;
List<Soldier> soldiersOnline = SoldierOnOffManage.getInstance()
.getSoldiersOn();
for (int i = 0; i < soldiersOnline.size(); i++) {
soldierBasic = new Soldier();
soldierRT = new SoldierRT();
soldierBasic = soldiersOnline.get(i);
soldierRT = SoldierOnOffManage.getInstance()
.getSoldierRTByLid(soldierBasic.getLid());
item = new TableItem(table, SWT.NONE);
item.setText(new String[] { soldierBasic.getName(),
soldierBasic.getPid(), soldierBasic.getSex(),
soldierBasic.getPosition(),
"" + soldierBasic.getAge() + "",
soldierRT.getBreathrate(),
soldierRT.getHeartrate(),
soldierRT.getWalkrate(),
soldierRT.getSportamount(),
soldierRT.getPose(),
soldierBasic.getBoold_type(),
soldierBasic.getLid(),
soldierRT.getCurTime().toString(),
soldierRT.getLat(),
soldierRT.getLon(),
soldierBasic.getDrug_allergy() });
}
}
});
}
如此错误就解决了