JFace TableViewer性能改善 -- 使用VirtualTable
前一篇提到了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的更多相关文章
- SWT table性能改善 -- 使用VirtualTable
在SWT程序中使用table展示数据时,如果数据过多,执行起来会比较慢,不过,我们可以借助VirtualTable来解决这一问题. Eclipse官网中关于VirtualTable的说明见:http: ...
- 性能改善之For与Foreach
关于For与Foreach的区别,博客园里已经有好多这样文章了,都分析的挺好:http://www.cnblogs.com/jobs/archive/2004/07/17/25218.aspx 不过 ...
- EF的性能改善和思考
EF是个工具,用的好了性能就会很好,用的不好性能就会有很大损失. 先从EF的设计思想来讲解 EF的初衷是根据缓存中的实体对象,以及实体对象的状态(删除.更新.添加)来对数据库进行操作,这些实体对象.以 ...
- WPF性能改善---之化整为零(蜂窝的衍生应用)
在有的项目中,有这样的需求,由于显示器的显示区域是有限的,而软件却要展示一个远大于显示区域的一些元素,此时就要引入放大.缩小.拖动等UI控制技术,而在使用这些技术的同时,在后台有效的控制渲染元素的个数 ...
- 待性能改善的一个SQL
select t.*, t.rowid from tb_tk_datasakusei_ctrl t; alter table ATOMBB.TB_TK_JISSEKI_INFO_DETAIL add ...
- 性能改善后复杂SQL
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-/ ...
- 细数改善WPF应用程序性能的10大方法
WPF(Windows Presentation Foundation)应用程序在没有图形加速设备的机器上运行速度很慢是个公开的秘密,给用户的感觉是它太吃资源了,WPF程序的性能和硬件确实有很大的关系 ...
- [转]响应式WEB设计学习(3)—如何改善移动设备网页的性能
原文地址:http://www.jb51.net/web/70362.html 前言 移动设备由于受到带宽.处理器运算速度的限制,因而对网页的性能有更高的要求.究竟是网页中的何种元素拉低了网页在移动设 ...
- Web标准中用于改善Web应用程序性能的各种方法总结
提起Web应用程序中的性能改善,广大开发者们可能会想到JavaScript与DOM访问等基于各种既存技术的性能改善方法.最近,各种性能改善方法被汇总成为一个Web标准. 本文对Web标准中所包含的各种 ...
随机推荐
- 第二节:创建模型,使用Code First,配置映射关系
这一节,实现模型的创建,配置映射关系 使用Code First数据迁移. 创建模型 一,首先创建几个接口:实体接口,聚合根接口,值对象接口 1,实体接口: 2,聚合根接口: 3,值对象接口: 二,模型 ...
- 《基于MVC的JavaScript Web富应用开发》学习笔记
第1章 MVC和类 1. 什么是MVC? MVC是一种设计模式, 它将应用划分为3个部分: 数据(模型, Model), 展现层(视图, View) 和用户交互层(控制器, Controller). ...
- MariaDB MyCat实现读写分离(15)
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...
- 第十三章 ReentrantLock 简介
Java 5.0 提供的新的加锁机制:当内置加锁机制不适合时 , 作为一种可选择的高级功能 一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一 ...
- Failed to start docker.service: Unit not found.
安装教程参考: https://docs.docker.com/install/linux/docker-ce/centos/#install-docker-ce-1 https://yq.aliyu ...
- 【learning】 扩展欧几里得算法(扩展gcd)和乘法逆元
有这样的问题: 给你两个整数数$(a,b)$,问你整数$x$和$y$分别取多少时,有$ax+by=gcd(x,y)$,其中$gcd(x,y)$表示$x$和$y$的最大公约数. 数据范围$a,b≤10^ ...
- Cookies与session的区别
Cookies 机制 Cookies是服务器在本地机器上存储的一段文本,并随每一个请求发送至同一个服务器. IETF RFC2965 HTTP State Management Mechanism 是 ...
- springcloud~演化的微服务架构
微服务 将整体功能按着模块划分成多个独立的单元,这些单元可以独立部署,它们之前通过轻量级的web api方式进行通讯,对于微服务框架来说,最流行的就是springcloud和Service Fabri ...
- Linux配置多个Tomcat同时运行
Linux系统下怎样配置多个Tomcat同时运行呢,首先修改变量为第一个tomcat,然后修改第二个tomcat启动的脚本 1.修改环境变量 # vi /etc/profile ####### 工程1 ...
- apk的php解析
<?php/****************************************************** * Android APK File Parser * Author: ...