如何去除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
相关产品推荐
相关产品推荐

