SWT固定高度空表格创建及按钮点击填充数据实现方案
解决SWT表格固定高度/模拟空白行的问题
嘿,这个需求我之前做SWT项目时刚好碰到过!SWT的Table确实没法直接插入“无数据的空白行”,但我们可以通过两种思路来实现你要的效果,根据你提到的「无需添加虚拟数据」的要求,优先推荐固定高度的方案:
方案一:固定表格高度(表头+3行),无需虚拟数据
这个方法的核心是计算出「表头高度 + 3行数据的高度」,然后强制表格保持这个高度,不管有没有数据。当后续填充的数据超过3行时,表格自带的滚动条会自动激活(只要你加了SWT.V_SCROLL样式)。
实现步骤&代码示例:
- 创建表格并设置必要样式(垂直滚动条、表头可见等)
- 添加表头列后,先让表格完成布局,确保能正确获取表头和行的高度
- 计算固定高度,通过布局数据(比如
GridData的heightHint)设置给表格 - 按钮点击时填充数据,数据超出可视范围自动显示滚动条
import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; public class FixedHeightTableDemo { public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new GridLayout(1, false)); shell.setText("SWT固定高度表格示例"); // 创建表格,启用垂直滚动条、边框、全选样式 Table table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL); table.setHeaderVisible(true); // 添加表头列 TableColumn col1 = new TableColumn(table, SWT.NONE); col1.setText("第一列"); col1.setWidth(180); TableColumn col2 = new TableColumn(table, SWT.NONE); col2.setText("第二列"); col2.setWidth(180); // 先让表格执行布局,确保能正确获取高度值(否则可能拿到0) table.pack(); // 计算固定高度:表头高度 + 3行数据的高度 int headerHeight = table.getHeaderHeight(); int rowHeight = table.getItemHeight(); int fixedTableHeight = headerHeight + rowHeight * 3; // 设置表格的布局数据:宽度填充父容器,高度固定为计算值 GridData tableGridData = new GridData(SWT.FILL, SWT.FILL, true, false); tableGridData.heightHint = fixedTableHeight; table.setLayoutData(tableGridData); // 创建填充数据按钮 Button fillDataBtn = new Button(shell, SWT.PUSH); fillDataBtn.setText("点击填充测试数据"); fillDataBtn.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false)); // 按钮点击事件:填充超过3行的数据,触发滚动条 fillDataBtn.addListener(SWT.Selection, event -> { // 清空现有数据 table.removeAll(); // 填充10条测试数据 for (int i = 1; i <= 10; i++) { TableItem item = new TableItem(table, SWT.NONE); item.setText(new String[]{"测试数据" + i, "详细内容" + i}); } }); shell.setSize(400, 300); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } }
效果说明:
- 初始化时,表格会保持「表头+3行」的高度,视觉上和有3个空白行一致,但实际上没有添加任何虚拟数据
- 点击按钮填充10条数据后,表格高度不变,超出的内容会通过垂直滚动条查看
方案二:模拟空白行(添加空TableItem)
如果你更倾向于「真的显示空白行」的视觉效果,也可以在初始化时添加几个空的TableItem,但这属于添加虚拟数据,你可以根据需求选择:
关键代码片段:
// 初始化时添加3个空行 for (int i = 0; i < 3; i++) { new TableItem(table, SWT.NONE); } // 填充真实数据时,先清空空行 fillDataBtn.addListener(SWT.Selection, event -> { table.removeAll(); // 清空所有行(包括空行) // 然后添加真实数据... });
注意点:
- 这种方法需要在填充真实数据时先清空所有行,避免空行和真实数据混在一起
- 如果后续数据不足3行,表格会自动收缩,如果你想保持高度,还是得结合方案一的固定高度设置
内容的提问来源于stack exchange,提问作者XtremeBaumer
相关产品推荐
相关产品推荐

