1. Table介绍
Table适合显示表格数据。
- TableColumn:代表表格的一列。
- TableItem:代表表格的一行数据。
Table的样式。
- SWT.SINGLE:只有一行可以被选中,table默认行为。
- SWT.MULTI:可以选中多行,windows下通过ctrl+鼠标点击,进行多选。
- SWT.CHECK:在每一行前添加一个CheckBox,TableItem.getChecked()获得该行勾中状态,勾中状态和改行选中是独立的。
- SWT.FULL_SELECTION:改行选中时,Hightlight整行。默认仅Hightlight第一个Cell。
- SWT.HIDE_SELECTION:选中时,不进行高亮。
1.1. 显示Table Head
table.setHeaderVisible(true);
1.2. 显示网格线
table.setLinesVisible(true);
2. Lazy Table
指Table创建之后,动态的往Table添加新的TableItem,Table会自动刷新。
Thread thread = new Thread(() -> { for (int i = 0; i <= 5; i++) { String[] txts = new String[] {"lazy: " + i}; Display.getDefault().asyncExec(() -> { TableItem tableItem = new TableItem(table, SWT.NONE); tableItem.setText(txts); }); sleep(500); } }); thread.start();
3. Virtual Table
如果Table的数据非常多,比如1万条数据,构造这些数据又非常耗时。一次性构造好table数据,然后再显示table,会等待很久。
解决方法,就是使用Virtual Table,动态加载数据。基本原理,仅加载窗口能看到的数据,当滚动条滚动时再加载那些没有加载的数据。已经加载的TableItem,将一直存在,滚动条回滚时,直接显示,因为之前加载过了。只需要三步,就可以实现Virtual Table。
3.1. 声明Virtual Table
Table样式里加入SWT.VIRTUAL便可。
Table table = new Table(parent, SWT.BORDER | SWT.VIRTUAL | SWT.FULL_SELECTION);
3.2. 占位符 — 空白TableItem
告诉Table有多少行数据,让滚动条正确滚动,此时Table的每行都是空白TableItem。
table.setItemCount(10000);
3.3. 初始化TableItem数据
就是从业务逻辑中,将真正的数据显示在TableItem上,每个TableItem只会执行一次下面代码,且仅当当前TableItem在窗口中可见时,才会调用下面的代码。
table.addListener(SWT.SetData, event -> { // Get current empty TableItem. TableItem item = (TableItem) event.item; int itemIndex = table.indexOf(item); item.setText(retrieveItemText(itemIndex)); }); private String[] retrieveItemText(int itemIndex) { // In real world, you may get data from database or other business logic. return new String[] {String.format("State %s", itemIndex), String.format("City %s", itemIndex)}; }
4. 一开始显示第几行
table.setSelection(100); 滚动条滚动至100条数据,并将其高亮选中;
table.setTopIndex(100); 滚动条滚动至100条数据,没有选中。
示例代码:https://github.com/tadckle/rcp/blob/master/rcp3/rcp3.study/src/rcp3/study/viewers/TableUsage.java