SWT里TableEditor的作用是可以在表格里面显示一些控件,例如列表、按钮等,有时候是根据表格的内容在控件上显示不同内容的,如果更新了表格内容,就要同时更新控件,但是表格内容可以通过Table控件的removeAll()来清除,而表格中的控件则无法用这个方法清除,你调用Table的removeAll()方法,往表格里填入新内容后,控件还是上次的控件,但是你一操作那些控件就会出异常,提示那些控件已经disposed。
解决方法是显式地调用控件及TableEditor的dispose()方法,在你建立TableEditor的时候,把它的引用保存起来,把里面的控件的引用也保存起来,到整个表格需要的清除的时候,通过引用先把控件dispose掉,再把TableEditor也dispose掉,这样整个表格的内容就真正清除了。
例如有一个表格名为table,里面的每一行都有3列,第一列是文本,第二列是Combo,第三列是Button,绘制表格的时候是这样的:
TableItem ti = new TableItem(table,SWT.NONE);
ti.setText(0,"some string");
te = new TableEditor(table);
Combo combo = new Combo(table,SWT.NONE);
controls.add(combo);
te.setEditor(combo,ti,1);
Button button = new Button(table,SWT.NONE);
controls.add(button);
te.setEditor(button,ti,2);
其中te和controls都是成员变量,te的类型是TableEditor,controls的类型是ArrayList<Control>。
当整个table要清除内容时,可以这样:
//删除控件
for(Control control:controls){
control.dispose();
}
//删除TableEditor
te.dispose();
//删除文本
table.removeAll();