前一篇提到了SWT中的table的通过使用virtual table性能得到很大的改善,那么如果既存的工程中使用的是TableViewer来创建的表,也能改成virtual table吗?

答案是肯定的,而且改起来超级简单,只需要在创建TableViewer的时候,加一个SWT.VIRTUAL属性即可~~

直接上示例代码:

package swt.table;

import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableColumn; /**
* A simple TableViewer to demonstrate the usage of a standard content provider
* with a virtual table
*
*/
public class VirtualTableViewer {
private static int tableItems = 30000;
// ContentProvider
private class MyContentProvider implements IStructuredContentProvider {
private MyModel[] elements; public Object[] getElements(Object inputElement) {
return elements;
} public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
this.elements = (MyModel[]) newInput;
}
} // LabelProvider
private class MyLabelProvider implements ITableLabelProvider { public Image getColumnImage(Object element, int columnIndex) {
return null;
} public String getColumnText(Object element, int columnIndex) {
if (element instanceof MyModel) {
MyModel model = (MyModel) element;
if (columnIndex == 0) {
return String.valueOf(model.getCounter());
} else {
return model.getName();
}
}
return null;
} public void addListener(ILabelProviderListener listener) { } public void dispose() { } public boolean isLabelProperty(Object element, String property) {
return false;
} public void removeListener(ILabelProviderListener listener) { } } // model
public class MyModel {
public int counter;
public String name; public MyModel(int counter) {
this.counter = counter;
this.name = "model" + counter;
} public int getCounter() {
return counter;
} public String getName() {
return name;
} public String toString() {
return "Item " + this.counter;
}
} public VirtualTableViewer(Shell shell) {
// ※ SWT.VIRTUAL
TableViewer tableViewer = new TableViewer(shell, SWT.H_SCROLL | SWT.V_SCROLL | SWT.VIRTUAL); // set table title
TableColumn column = new TableColumn(tableViewer.getTable(), SWT.NULL);
column.setText("Column1");
column.pack();
TableColumn column2 = new TableColumn(tableViewer.getTable(), SWT.NULL);
column2.setText("Column2");
column2.pack(); tableViewer.setLabelProvider(new MyLabelProvider());
tableViewer.setContentProvider(new MyContentProvider());
tableViewer.setUseHashlookup(true);
MyModel[] model = createModel();
tableViewer.setInput(model); tableViewer.getTable().setLinesVisible(true);
tableViewer.getTable().setHeaderVisible(true);
tableViewer.getTable().setBounds(10, 10, 280, 350);
} private MyModel[] createModel() {
MyModel[] elements = new MyModel[tableItems]; for (int i = 0; i < tableItems; i++) {
elements[i] = new MyModel(i);
} return elements;
} /**
* @param args
*/
public static void main(String[] args) {
long start = System.currentTimeMillis();
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Virtual TableViewer Demo"); new VirtualTableViewer(shell);
shell.pack();
shell.open(); long end = System.currentTimeMillis();
System.out.println("All cost:" + (end - start)); while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
} display.dispose();
}
}

注意到了?

TableViewer tableViewer = new TableViewer(shell, SWT.H_SCROLL | SWT.V_SCROLL | SWT.VIRTUAL);

仅仅是比平常创建TableViewer多一个SWT.VIRTUAL属性而已~~

不过虚表都有一个问题,在setInput之后,再调用setText来设置某个单元格的时候,单元格所在的行的其他单元格的数据就会被清空掉,

就是说把VirtualTableViewer方法代码改成下面这个样子(其他代码不动):

public VirtualTableViewer(Shell shell) {
// SWT.VIRTUAL
TableViewer tableViewer = new TableViewer(shell, SWT.H_SCROLL | SWT.V_SCROLL | SWT.VIRTUAL); // set table title
TableColumn column = new TableColumn(tableViewer.getTable(), SWT.NULL);
column.setText("Column1");
column.pack();
TableColumn column2 = new TableColumn(tableViewer.getTable(), SWT.NULL);
column2.setText("Column2");
column2.pack(); tableViewer.setLabelProvider(new MyLabelProvider());
tableViewer.setContentProvider(new MyContentProvider());
tableViewer.setUseHashlookup(true);
MyModel[] model = createModel();
tableViewer.setInput(model); tableViewer.getTable().setLinesVisible(true);
tableViewer.getTable().setHeaderVisible(true);
tableViewer.getTable().setBounds(10, 10, 280, 350); // 加了下面这一行改变单元格的值,整行其他单元格的值都没了。
// 去掉SWT.VIRTUAL属性,则不会出现这个问题
tableViewer.getTable().getItem(0).setText("test");
}

JFace TableViewer性能改善 -- 使用VirtualTable的更多相关文章

  1. SWT table性能改善 -- 使用VirtualTable

    在SWT程序中使用table展示数据时,如果数据过多,执行起来会比较慢,不过,我们可以借助VirtualTable来解决这一问题. Eclipse官网中关于VirtualTable的说明见:http: ...

  2. 性能改善之For与Foreach

    关于For与Foreach的区别,博客园里已经有好多这样文章了,都分析的挺好:http://www.cnblogs.com/jobs/archive/2004/07/17/25218.aspx  不过 ...

  3. EF的性能改善和思考

    EF是个工具,用的好了性能就会很好,用的不好性能就会有很大损失. 先从EF的设计思想来讲解 EF的初衷是根据缓存中的实体对象,以及实体对象的状态(删除.更新.添加)来对数据库进行操作,这些实体对象.以 ...

  4. WPF性能改善---之化整为零(蜂窝的衍生应用)

    在有的项目中,有这样的需求,由于显示器的显示区域是有限的,而软件却要展示一个远大于显示区域的一些元素,此时就要引入放大.缩小.拖动等UI控制技术,而在使用这些技术的同时,在后台有效的控制渲染元素的个数 ...

  5. 待性能改善的一个SQL

    select t.*, t.rowid from tb_tk_datasakusei_ctrl t; alter table ATOMBB.TB_TK_JISSEKI_INFO_DETAIL add ...

  6. 性能改善后复杂SQL

    <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-/ ...

  7. 细数改善WPF应用程序性能的10大方法

    WPF(Windows Presentation Foundation)应用程序在没有图形加速设备的机器上运行速度很慢是个公开的秘密,给用户的感觉是它太吃资源了,WPF程序的性能和硬件确实有很大的关系 ...

  8. [转]响应式WEB设计学习(3)—如何改善移动设备网页的性能

    原文地址:http://www.jb51.net/web/70362.html 前言 移动设备由于受到带宽.处理器运算速度的限制,因而对网页的性能有更高的要求.究竟是网页中的何种元素拉低了网页在移动设 ...

  9. Web标准中用于改善Web应用程序性能的各种方法总结

    提起Web应用程序中的性能改善,广大开发者们可能会想到JavaScript与DOM访问等基于各种既存技术的性能改善方法.最近,各种性能改善方法被汇总成为一个Web标准. 本文对Web标准中所包含的各种 ...

随机推荐

  1. IE浏览器兼容性模式

    最近支持公司的一个内部业务管理系统,系统是基于jQuery来实现:用了2年的MVVM框架的我转向这个完全使用jQuery框架来开发的系统,真是相当不爽(相信用过MVVM框架的跟我是相同的感受):更为憋 ...

  2. [ActionScript 3.0] 有必要记录一下:flash builder运用Animate CC 发布的swc的一个奇葩问题,亲测

    之前一直用flash cs6 发布swc 配合flash builder4.6开发,最近用Animate CC发布swc,却出现无法flash builder4.6 无法连接到调试器的问题, 经过反复 ...

  3. D14——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D14 20180919内容纲要: 1.html认识 2.常用标签 3.京东html 4.小结 5.练习(简易淘宝html) 1.html初识(HyperText ...

  4. java list集合运算

    list集合运算 import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.I ...

  5. vue教程1-04 事件 v-on:click="函数"

    vue教程1-04 事件 v-on:click="函数"   v-on:click/mouseout/mouseover/dblclick/mousedown..... 实例:为d ...

  6. odoo开发环境搭建(二):安装Ubuntu 17虚拟机

    odoo开发环境搭建(二):安装Ubuntu 17虚拟机 下载镜像文件: 配置网络: 安装vmware tools: 配置共享文件夹: 选中虚拟机,右键编辑设置里边配置共享文件夹,指定windows本 ...

  7. 使用libcurl的正确姿势

    libcurl支持访问http.ftp等各种服务器,下载图片AV什么的不在话下.但其存在多种接口,异步接口也很难以理解,到底什么样的使用姿势才是正确滴?我们来看看可用的体位: easy interfa ...

  8. c++中的复合类型

    复合类型是指基于其他类型而定义的类型. 而这里介绍的是引用和指针.并且指针和引用都提供了对其他对象的间接访问. 引用 引用还是很好理解的,就是为对象起了另外一个名字,引用类型引用另外一种类型. 通常将 ...

  9. RESTful API后台系统架构设计(Java)

    最近设计和实现了一个JAVA的RESTful API的后台业务系统架构,主要基于Java平台.设计要求是: 性能:平均响应时间(RESTful API)小于2s(平均负载的情况下),并发访问200个以 ...

  10. 摆脱定时任务的cron表达式的困扰

    一.背景 最近因为需要,需要适用Spring的task定时任务进行跑定时任务,以前也接触过,但是因为懒没有好好地理解@Scheduled的cron表达式,这次便对它做了一个全方位的了解和任务,记录下来 ...