如何为Vaadin 7 Table动态添加列?排查数据截断问题
搞定Vaadin 7 Table动态列展示+数据截断问题
嗨,我来帮你解决这个Vaadin 7 Table的动态列和数据截断问题!先从你现有代码的问题入手,再给你一套靠谱的实现方案。
你的代码为啥会出问题?
看了你的代码,发现几个关键逻辑错误,这直接导致了列混乱和数据截断:
- 列重复创建:你在遍历
wip的每个元素时,都循环添加列。比如wip有3个元素,每个元素拆出10列,那你会重复加3次10列,Table的列数直接乱套。 - 行重复添加:处理单个
foo时就遍历整个wip加行,等于同一行被反复添加,数据互相覆盖,肯定不对。 - 没统一列数:你没先统计所有行里最长的
foos长度,要是后面的行元素更多,对应的列根本没创建,自然数据就被“截断”了。
正确的实现步骤(分三步)
要动态适配列数且完整展示数据,必须遵循「先确定最大列数→统一建列→逐行填数据」的流程:
1. 先预处理数据,拿到最大列数
先把所有行的数据拆好,同时找出最长的那一行的元素个数,这就是我们需要的总列数:
List<String> wip = new ArrayList<>(); // 这里假设你已经给wip塞了数据 int maxColNum = 0; List<String[]> allProcessedRows = new ArrayList<>(); // 遍历处理每一行,统计最大列数 for (String foo : wip) { // 先清理空格再拆分 String cleanedStr = StringUtils.deleteWhitespace(foo); String[] rowData = StringUtils.splitByWholeSeparator(cleanedStr, "->"); allProcessedRows.add(rowData); // 更新最大列数 if (rowData.length > maxColNum) { maxColNum = rowData.length; } }
2. 创建Table并一次性加完所有列
现在用最大列数来创建所有需要的容器属性(也就是列),顺便设置Table宽度避免列被隐藏:
Table resultTable = new Table(); // 设为100%宽度,避免内容超出时列被截断 resultTable.setWidth("100%"); // 允许横向滚动(如果列数多的话很有用) resultTable.setScrollable(true); // 循环添加所有列 for (int i = 0; i < maxColNum; i++) { String colId = "COL_" + i; // 列的类型是String,默认值设为"--" resultTable.addContainerProperty(colId, String.class, "--"); // 给列加个友好的表头名称 resultTable.setColumnHeader(colId, "列 " + (i + 1)); }
3. 逐行把数据塞进Table
现在可以把预处理好的每行数据对应到列里:
for (int rowIdx = 0; rowIdx < allProcessedRows.size(); rowIdx++) { String[] currentRow = allProcessedRows.get(rowIdx); String rowId = "ROW_" + rowIdx; // 先创建空行 Item tableItem = resultTable.addItem(rowId); // 给每一列填数据 for (int colIdx = 0; colIdx < currentRow.length; colIdx++) { String colId = "COL_" + colIdx; tableItem.getItemProperty(colId).setValue(currentRow[colIdx]); } // 列数不够的行,就用默认的"--"填充,不用额外处理 }
为啥之前最后四列会被截断?
结合你的情况,大概率是这两个原因:
- 列没建全:你之前是处理一个
foo才建对应长度的列,如果后面的foo有更多元素,对应的列根本没创建,数据没地方放就看起来像被截断。 - Table宽度不够:如果Table没设宽度,超出可视区域的列会被隐藏,设置
setWidth("100%")或者开启横向滚动就能解决。
额外小Tips
- 如果列数接近50,建议开启列折叠:
resultTable.setColumnCollapsingAllowed(true);,用户可以自己隐藏不用的列。 - 可以给列设置固定宽度,比如
resultTable.setColumnWidth("COL_0", 120);,避免长内容挤压其他列。 - 要是需要排序,直接开
resultTable.setSortEnabled(true);就行。
内容的提问来源于stack exchange,提问作者PeachesToad
相关产品推荐
相关产品推荐

