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();