SWT Table

By | 4月 7, 2018

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

image