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标准中所包含的各种 ...
随机推荐
- 迁移桌面程序到MS Store(2)——Desktop App Converter
迁移传统桌面程序到MS Store的另一种方式是使用Desktop App Converter工具.虽然本篇标题包含了Desktop App Converter(以下简称DAC),实际上我是来劝你别用 ...
- Android------------------RecyclerView学习
一.多种布局的保存 1.Type->getItemViewType(int position) 2.RecylerView.Holder : 定一个holder的内部类,里面保存一些 ...
- 一分钟学会git
首先 克隆 源码地址 git clone git://github.com/jquery/jquery.git 更新 git pull查看状态 git status暂存所有(注意 . 表示全部暂存) ...
- 百度地图sdk---pc端
<div class="map" style="width: 1196px;height: 500px;margin: 50px auto;"> & ...
- python -猜字小游戏
代码运行效果如下: 注意: 1.必须要在python3环境想使用 2.QQ:3084276329(一起交流学习) 3.还请大家评论 Guess the word game代码如下: #! /usr/b ...
- Python学习之二
基础语法 一.起始行 #!/usr/bin/python 或 #!/usr/bin/env python 目的是在运行python脚本的时候告诉系统我们要用Python解释器去运行py脚本 # -*- ...
- 6_文件IO
1. 基本文件读取 readline(),readlines(),write(),writelines() f.read(size),指定读取文件的字节数,需要注意的是 ...
- 关于并发用户数的思考-通过PV量换算并发
首先介绍一下pv量:PV(访问量):即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次.UV(独立访客):即Unique Visitor,访问您网站的一台电脑客户端为一个访客.00 ...
- 8 Ways to Become a Better Coder
It’s time to get serious about improving your programming skills. Let’s do it! That’s an easy career ...
- Oracle死锁查询及批量处理
一.数据库死锁的现象程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错. 二.死锁的原理当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提交,另一条对于这一列数据做 ...