SWT的TABLE对象一步实现可复制(不用每个TABLE实例都修改)

类库开刀(一)

SWT的TABLE对象一步实现可复制

(不用每个TABLE实例都修改)

第一章          概要

最近的一个项目,涉及到离线办公需求,索性弄了一个CS客户端满足这个需求。不过用户在CS已经成型的时候竟然又追加了一个需求:每个表格的单元格可以简单复制,大家知道SWT的TABLE是不可以直接复制的。到网上搜索了一下有没有可以简单的、比用修改每个列表的一步解决方法,我比较懒总是喜欢一步到位。项目到了收尾阶段还要全盘修改一些代码,简直就是测试人员的噩梦,开发人员的悲剧。

网上的解决办法是,table实例加上监听鼠标点击事件与键盘按钮事件,我们这个CS一共有300多个表格,如果一个一个加起来。。。苦苦寻觅了几个小时仍旧是无果,索性按照监听这个思路给SWT的TABLE.CLASS开刀!

我的目标是,修改一个类库文件,就可以实现300多表格的可复制处理。

第二章          修改步骤

第一节        锁定目标

经过验证,还是将监听加入到:org\eclipse\swt\widgets\Table.java中比较好。

这个源文件在\plugins\org.eclipse.swt.win32.win32.x86_3.4.1.v3452b.jar中。

第二节        创建等位目录

我们需要在项目工程的src目录下创建与org.eclipse.swt.win32.win32.x86_3.4.1.v3452b.jar这个包相同的路径,才可以实现Debug调试我们所修改的内容是否可以成功。目录结构下图所示,仅供参考。

第三节        创建Table.java文件

在widgets目录创建Table.java文件,文件代码直接将org.eclipse.swt.win32.win32.x86_3.4.1.v3452b.jar的Table.class反编译后的代码拷贝即可。

第四节        开始动刀

找到如下方法:

Java代码 复制代码 收藏代码
  1. public Table (Composite parent, int style) { 
  2.     super (parent, checkStyle (style)); 
public Table (Composite parent, int style) {	super (parent, checkStyle (style));}

修改内容:

Java代码 复制代码 收藏代码
  1. public Table (Composite parent, int style) { 
  2.     super (parent, checkStyle (style)); 
  3.  
  4.     // CONAC 曲文博 添加 开始 
  5.     this.addMouseListener(new MouseAdapter() { 
  6.         public void mouseDown(MouseEvent event) { 
  7.             Point pt = new Point(event.x, event.y); 
  8.             final TableItem item = getItem(pt); 
  9.             if (item == null) { 
  10.                 return; 
  11.             } 
  12.             int column = -1; 
  13.             for (int i = 0, n = getColumnCount(); i < n; i++) { 
  14.                 Rectangle rect = item.getBounds(i); 
  15.                 if (rect.contains(pt)) { 
  16.                     column = i; 
  17.                     break; 
  18.                 } 
  19.             } 
  20.  
  21.             Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
  22.             StringSelection contents=new StringSelection(item.getText(column)); //用拷贝文本框文本实例化StringSelection对象 
  23.             clipboard.setContents(contents, null); //设置系统剪贴板内容 
  24.         } 
  25.     }); 
  26.     // CONAC 曲文博 添加 结束 
public Table (Composite parent, int style) {	super (parent, checkStyle (style));	// CONAC 曲文博 添加 开始	this.addMouseListener(new MouseAdapter() {		public void mouseDown(MouseEvent event) {			Point pt = new Point(event.x, event.y);			final TableItem item = getItem(pt);			if (item == null) {				return;			}			int column = -1;			for (int i = 0, n = getColumnCount(); i < n; i++) {				Rectangle rect = item.getBounds(i);				if (rect.contains(pt)) {					column = i;					break;				}			}			Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();			StringSelection contents=new StringSelection(item.getText(column)); //用拷贝文本框文本实例化StringSelection对象			clipboard.setContents(contents, null); //设置系统剪贴板内容		}	});	// CONAC 曲文博 添加 结束}

第三章          编译

到此Table.java文件修改结束,那么在工程内编译一下,会得到如下两个文件:

Table$1.class、Table.class

将这两个文件直接拷贝到org.eclipse.swt.win32.win32.x86_3.4.1.v3452b.jar中对应的目录下覆盖即可,此时Eclipse应该关闭。

第四章          总结

重启Eclipse,启动工程后,我们发现所有的Table都实现了那个监听,达到了目的。只要鼠标点击单元格一下,内容就可以被复制到剪贴板中,也省去了用户的复制操作。

如有不足希望大家指正。

第五章          文件下载

一、Table.java

二、Table$1.class、Table.class

三、org.eclipse.swt.win32.win32.x86_3.4.1.v3452b.jar

这个文件的版本有点低,呵呵,我们做的CS系统主要用的是RCP所以就定在了比较低的版本上,如果无特殊需要可以不必下载 http://download.csdn.net/detail/jingyinghai/4673813

 

转自: http://hwak.iteye.com/blog/1699707

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值