比如一个表格,3列,每列有个TableEditor,选中某行,删除该行时,
只是该行消失了,下面的行没有上移。
其实,是TableEditor控件没有上移,
只要鼠标胡乱点点,就正常了。
那么,如何删除后,就自动刷新呢?
搜到个方法,是将每个editor重新setItem一下就行了。 -------------------------------------------------------- private Map<TableItem, TableEditor[]> controlMap = new HashMap<TableItem, TableEditor[]>();
用一个Map保存TableEditor的引用~~~
范例代码如下。
protected void addOneSendParam() {
// 表格增加一行 TableItem item = new TableItem(sendParamTable, SWT.NONE);
// 构造编辑器,并保存到Map Text nameText = new Text(sendParamTable, SWT.SINGLE | SWT.BORDER); TableEditor editor = new TableEditor(sendParamTable); editor.grabHorizontal = false; // 宽度 editor.grabVertical = false; // 高度不占满 editor.minimumHeight = 25; editor.minimumWidth = 80; editor.horizontalAlignment = SWT.CENTER; editor.setEditor(nameText, item, 0);
Combo typeCombo = new Combo(sendParamTable, SWT.READ_ONLY); typeCombo.setItems(new String[] { "文本型", "数字型", "开关型" }); typeCombo.select(0); TableEditor typeEditor = new TableEditor(sendParamTable); typeEditor.grabHorizontal = false; // 宽度 typeEditor.grabVertical = false; // 高度不占满 typeEditor.minimumHeight = 25; typeEditor.minimumWidth = 80; typeEditor.horizontalAlignment = SWT.CENTER; typeEditor.setEditor(typeCombo, item, 1);
Text valueText = new Text(sendParamTable, SWT.SINGLE | SWT.BORDER); TableEditor valueEditor = new TableEditor(sendParamTable); valueEditor.grabHorizontal = false; // 宽度 valueEditor.grabVertical = false; // 高度不占满 valueEditor.minimumHeight = 25; valueEditor.minimumWidth = 80; valueEditor.horizontalAlignment = SWT.CENTER; valueEditor.setEditor(valueText, item, 2);
// 控件Map controlMap.put(item, new TableEditor[] { editor, typeEditor, valueEditor });
// 自动滚动到追加的行 sendParamTable.setSelection(sendParamTable.getItemCount() - 1); sendParamTable.showSelection(); }
/** * 表格中删除一行测试值. */ private void deleteOneSendParam() {
// 没有选择行,则返回 int selectedCount = sendParamTable.getSelectionCount(); if (selectedCount == 0) { return; }
// 选择行的下标 int selectedIndex = sendParamTable.getSelectionIndex(); TableItem item = sendParamTable.getItem(selectedIndex);
// 删除编辑控件 TableEditor[] controlArray = controlMap.get(item); for (TableEditor editor : controlArray) { editor.getEditor().dispose(); editor.dispose(); } controlMap.remove(item);
// 删除表格中该行 sendParamTable.remove(selectedIndex);
// 刷新一下,否则可能控件位置没有刷新 for (Entry<TableItem, TableEditor[]> entry : controlMap.entrySet()) { TableEditor[] editorArray = entry.getValue(); for (TableEditor editor : editorArray) { editor.setItem(editor.getItem()); //就是这里啦,重新set一下就正常了。 } }
// 自动选中下一行或上一行 int newCount = sendParamTable.getItemCount(); if (selectedIndex <= newCount - 1) { sendParamTable.setSelection(selectedIndex); } else { sendParamTable.setSelection(selectedIndex - 1); } sendParamTable.showSelection(); }
/** * 表格中删除所有行. */ private void deleteAllSendParam() {
if (sendParamTable.getItemCount() == 0) { return; }
// 删除所有行的编辑控件 TableItem[] items = sendParamTable.getItems(); for (TableItem item : items) {
// 删除编辑控件 TableEditor[] controlArray = controlMap.get(item); for (TableEditor editor : controlArray) { editor.getEditor().dispose(); editor.dispose(); } controlMap.remove(item); }
// 删除表格行 sendParamTable.removeAll(); }
|