SWT Tabel 概述
当在SWT应用程序中创建表格,每一个Item(行)代 表 Table 一个 Item。如果数量非常多的时候,创建这些Item是非常耗时的,或者说计算这些数据的要求是很高的。这里就传统的表格引出了一个问题,因为这些Items都是提前创建的,而提前创建要初始化数据以至速度减慢.同时,如果用户不想浏览这么多的数据,大部分的初始化的花费是浪费的。 而虚拟表格就是用来出来处理这些问题的。 在虚拟表格和树中, ITEMS创建只要满足基本的显示就可以,这就表示没有额外的内存消耗和其他资源花费在创建没有查看的ITEMS上面,展示更多的数据通过控件的生命周期来控制而不是完全提前创建。虚拟表格的方案在查询大量数据和显示大量数据的时候非常有用。
下面将描述如何使用虚拟表格,同时提供了代码片段和相应的解释。
要使用虚拟表格,你必须确保一系列的items包含一个setData监听器,这样就能确保其能在items上设置数据,items的总数是用来设置处置滚动条的最大值,同时反射出该表格的最大容量,在不同的时候可以改变。
当一个没有初始化的item时候,因为ITEM第一次变的可见,ITEM自动的创建,同时传递SWT 监听器swt.setdata用来设置item的数据。ITEM 的数据包含ITEM的各种属性 如: 文本,图像,颜色,显示的状态。操作系统自由无序的请求数据。
一旦ITEM已经被初始化了,要么通过SETDATA监听器来设置数据,要么通过tableItem的API 如setText()方法来完成数据的设置,此时值就变成了参数,同时setData不在被用来设置数据。唯一不同的是,当一个item被使用Table Clear()方法清空掉的时候,setData 监听器会重新为其设置数据。
下面就让我通过简单的代码来展示下创建虚拟表的基本过程。以下的例子是证明含有10000项的表格,同时修改TableItem阿中已经存在的数据。
.BORDER.
当在SWT应用程序中创建表格,每一个Item(行)代 表 Table 一个 Item。如果数量非常多的时候,创建这些Item是非常耗时的,或者说计算这些数据的要求是很高的。这里就传统的表格引出了一个问题,因为这些Items都是提前创建的,而提前创建要初始化数据以至速度减慢.同时,如果用户不想浏览这么多的数据,大部分的初始化的花费是浪费的。 而虚拟表格就是用来出来处理这些问题的。 在虚拟表格和树中, ITEMS创建只要满足基本的显示就可以,这就表示没有额外的内存消耗和其他资源花费在创建没有查看的ITEMS上面,展示更多的数据通过控件的生命周期来控制而不是完全提前创建。虚拟表格的方案在查询大量数据和显示大量数据的时候非常有用。
下面将描述如何使用虚拟表格,同时提供了代码片段和相应的解释。
要使用虚拟表格,你必须确保一系列的items包含一个setData监听器,这样就能确保其能在items上设置数据,items的总数是用来设置处置滚动条的最大值,同时反射出该表格的最大容量,在不同的时候可以改变。
当一个没有初始化的item时候,因为ITEM第一次变的可见,ITEM自动的创建,同时传递SWT 监听器swt.setdata用来设置item的数据。ITEM 的数据包含ITEM的各种属性 如: 文本,图像,颜色,显示的状态。操作系统自由无序的请求数据。
一旦ITEM已经被初始化了,要么通过SETDATA监听器来设置数据,要么通过tableItem的API 如setText()方法来完成数据的设置,此时值就变成了参数,同时setData不在被用来设置数据。唯一不同的是,当一个item被使用Table Clear()方法清空掉的时候,setData 监听器会重新为其设置数据。
下面就让我通过简单的代码来展示下创建虚拟表的基本过程。以下的例子是证明含有10000项的表格,同时修改TableItem阿中已经存在的数据。
/*
* Virtual Table example snippet: create a table with 1,000,000 items
*
* For a list of all SWT example snippets see
*
*/
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
public class VirtualTabel {
static final int COUNT = 1000000;
public static void main(String[] args) {
Display display = new Display();
final Shell shell = new Shell(display);
shell.setLayout(new RowLayout(SWT.VERTICAL));
final Table table = new Table(shell, SWT.VIRTUAL | SWT.BORDER);
table.addListener(SWT.SetData, new Listener() {
public void handleEvent(Event event) {
TableItem item = (TableItem) event.item;
int index = table.indexOf(item);
item.setText("Item " + index);
System.out.println(item.getText());
}
});
table.setLayoutData(new RowData(200, 200));
Button button = new Button(shell, SWT.PUSH);
button.setText("Add Items");
table.setItemCount(COUNT);
final Label label = new Label(shell, SWT.NONE);
button.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
long t1 = System.currentTimeMillis();
long t2 = System.currentTimeMillis();
label.setText("Items: " + COUNT + ", Time: " + (t2 - t1) + " (ms)");
table.clear(10);
shell.layout();
}
});
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
给虚拟表格添加10000行数据,同时随意的清空第10项
创建表格,要创建虚拟表,必须使用 SWT.VIRTUAL 样式,如果还有其他样式使用起使用 OR 即 ”|“,如SWTfinal Table table = new Table(shell, SWT.VIRTUAL | SWT.BORDER);
.BORDER.
table.addListener(SWT.SetData, new Listener()
给虚拟表格添加setData监听器,当事件发生改变的时候负责,设置、处理数据.获得设置数据的Tableitem
TableItem item = (TableItem)event.item;int index = table.indexOf(item);
item.setText("Item " + index);
取得item的索引,为其设置文本,索引是交替变化的,索引也可以通过 Table.index(tableItem)来获取.
table.setItemCount(COUNT)
设置TableD的数据总是为10000,暗示table能够维持10000的数据量.