You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何去除SWT Table中出现的多余列与行?

解决SWT Table出现多余列和行的问题

我帮你排查了代码里的核心问题,这就是导致表格出现多余列和行的根源,下面逐一拆解并给出修复方案:

问题1:错误的表头实现导致多余行

你当前是手动创建一个TableItem当作表头,同时设置refVarTable.setHeaderVisible(false)——这会让这个“表头”被识别成普通的数据行,最终表格里平白多了一行(就是你写的表头内容那行)。SWT的Table有原生的表头机制,完全不需要手动用TableItem模拟。

问题2:数据行列数超出定义导致多余列

填充数据时,你循环values.length来设置单元格文本,如果某行的values数组长度超过3(你定义的列数),SWT会自动创建新列来容纳额外的文本,这就产生了多余列。

修复后的完整代码

String[] variables = variableString.split(NodeItemDetailsProvider.INPUT_VARIABLE + DELIMITER);
String referenceVariables = variables.length > 1 ? variables[1] : ""; //$NON-NLS-1$
boolean isInputAbsent = referenceVariables.equalsIgnoreCase(StringUtils.EMPTY);
String refVarsArray[] = referenceVariables.split(NodeItemDetailsProvider.REFERENCE_VARIABLE_SEPARATOR);

GridData gd_table = new GridData(SWT.FILL, SWT.FILL, true, false);
int tableStyle = SWT.BORDER | SWT.H_SCROLL;
if (refVarsArray.length > 10) {
    tableStyle = SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION; // FULL_SELECTION是Table的整行选中样式
    gd_table.heightHint = 150;
    gd_table.widthHint = 450;
}

Table refVarTable = new Table(top, tableStyle);
refVarTable.setLayoutData(gd_table);
refVarTable.setHeaderVisible(true); // 启用原生表头
refVarTable.setLinesVisible(true);
refVarTable.setBackground(TouchstoneStyleSheet.get(ColorKey.HIGHLIGHTED_TEXT_YELLOW_BACKGROUND));

String[] titles = { "Variable Name", "Variable Value Provided To Reference", //$NON-NLS-1$ //$NON-NLS-2$
        "Variable Value Retrieved From Reference" }; //$NON-NLS-1$

// 创建表头列并配置样式
final Font font = new Font(null, StringUtils.EMPTY, 9, SWT.BOLD);
for (int i = 0; i < titles.length; i++) {
    TableColumn column = new TableColumn(refVarTable, SWT.NONE);
    column.setText(titles[i]);
    column.setFont(font);
}

// 填充数据行,限制列数避免自动新增列
for (String row : refVarsArray) {
    String values[] = row.split(NodeItemDetailsProvider.REFERENCE_INPUT_SEPARATOR);
    TableItem item = new TableItem(refVarTable, SWT.NONE);
    for (int index = 0; index < titles.length; index++) {
        // 只填充定义好的3列,数据不足时用空字符串补位
        item.setText(index, index < values.length ? values[index] : "");
        // 动态调整表格宽度(如果内容过长)
        if (index < values.length && values[index].length() > 90) {
            gd_table.widthHint = 950;
        }
    }
}

// 自动调整列宽适配内容
for (int loopIndex = 0; loopIndex < titles.length; loopIndex++) {
    refVarTable.getColumn(loopIndex).pack();
}

// 释放字体资源
refVarTable.addListener(SWT.Dispose, new Listener() {
    @Override
    public void handleEvent(Event event) {
        font.dispose();
    }
});

额外优化说明

  • 把SWT.FULL_SELECTION移到Table的样式参数里,这是控制整行选中的Table级样式,不是TableItem的属性。
  • 给数据行做了列数限制,即使某行拆分后的数据超过3列,也只会填充前3列,彻底避免自动新增列。
  • 启用原生表头后,去掉了手动创建的表头TableItem,直接解决多余行的问题。

内容的提问来源于stack exchange,提问作者Srikant Barik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:32:16