[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[备忘]SWT中删除Table行,TableEditor位置不刷新的问题,解决方法

上一篇:[转帖]Java interoperation with a Native DLL using JNA
下一篇:[备忘]Java中,使用JNA调用Visa32.dll,控制频谱仪~~

添加日期:2012/8/13 10:36:53 快速返回   返回列表 阅读5863次
比如一个表格,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();
}

 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved