gembin

OSGi, Eclipse Equinox, ECF, Virgo, Gemini, Apache Felix, Karaf, Aires, Camel, Eclipse RCP

HBase, Hadoop, ZooKeeper, Cassandra

Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.

There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.

About Me

 

ViewerFilter与自定义选中Column的颜色

ViewerFilter主要用于根据条件来显示或隐藏Tree或Table中的数据,它的实现就不赘述了,在程序中用了一个下拉框来做触发条件:

 
  1. filterCombo.addSelectionListener(new SelectionAdapter() {  
  2.             @Override  
  3.             public void widgetSelected(SelectionEvent e) {  
  4.                 String text = filterCombo.getText();  
  5.                 if (!text.equals(EMPTY_FILLTER_STRING)) {  
  6.                     viewer.resetFilters();  
  7.                     viewerFilter.setFilterData(text);  
  8.                     viewer.addFilter(viewerFilter);  
  9.                 } else {  
  10.                     viewer.resetFilters();  
  11.                 }  
  12.             }  
  13.         });  

从代码中可以看到,当选中的条件为空字符串时——表明不过滤结果——就调用viewer.resetFilters()方法来去掉Filter,如果选中 条件不为空,就首先将现有的Filter清空,然后将把输入值作为过滤条件赋给Filter,再将Filter添加给viewer.

关于自定义选中Column的颜色则参照了Snippet229的代码,监听了EraseItem的事件:


 
  1. protected void setSelectedRowColor() {  
  2.         table.addListener(SWT.EraseItem, colorListener);  
  3.     }  
  4.   
  5.     private class RowColorListener implements Listener {  
  6.         public void handleEvent(Event event) {  
  7.   
  8.             if ((event.detail & SWT.SELECTED) != 0) {  
  9.                 GC gc = event.gc;  
  10.                 Rectangle area = table.getClientArea();  
  11.                 /* 
  12.                  * If you wish to paint the selection beyond the end of last 
  13.                  * column, you must change the clipping region. 
  14.                  */  
  15.                 int columnCount = table.getColumnCount();  
  16.                 if (event.index == columnCount - 1 || columnCount == 0) {  
  17.                     int width = area.x + area.width - event.x;  
  18.                     if (width > 0) {  
  19.                         Region region = new Region();  
  20.                         gc.getClipping(region);  
  21.                         region.add(event.x, event.y, width, event.height);  
  22.                         gc.setClipping(region);  
  23.                         region.dispose();  
  24.                     }  
  25.                 }  
  26.                 gc.setAdvanced(true);  
  27.                 if (gc.getAdvanced())  
  28.                     gc.setAlpha(127);  
  29.                 Rectangle rect = event.getBounds();  
  30.                 Color foreground = gc.getForeground();  
  31.                 Color background = gc.getBackground();  
  32.                 gc.setForeground(tabComposite.getDisplay().getSystemColor(  
  33.                         SWT.COLOR_RED));  
  34.                 gc.setBackground(tabComposite.getDisplay().getSystemColor(  
  35.                         SWT.COLOR_LIST_BACKGROUND));  
  36.                 gc.fillGradientRectangle(0, rect.y, 1024, rect.height, false);  
  37.                 // restore colors for subsequent drawing  
  38.                 gc.setForeground(foreground);  
  39.                 gc.setBackground(background);  
  40.                 event.detail &= ~SWT.SELECTED;  
  41.             }  
  42.         }  
  43.     }  


该Snippet的URL为:http://dev.eclipse.org/viewcvs/index.cgi /org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet229.java?view=co

自定义颜色的目的是为了个性化,它与Filter看上来似乎是风马牛不相及的,但是在应用中却出现了问题,会出现一大堆空指针异常,而且Debug根本跟 踪不过去,最开始以为是Filter实现的问题,但做了很长时间的调试都没有发现问题所在,过了4、5个小时以后,才想到也许和EraseItem事件有 关系,然后把上面的代码注释掉,果然就一点问题没有了.......

又过了好久,才在同事的提示下,监测一下在EraseItem事件被触发的时候,Filter是否完成了对数据的过滤,赫然发现在过滤以后 TableItem本来应该只有两个的,但是在RowColorListener的handleEvent方法中table.getItemCount的 结果却是三,也就是在Filter的过滤还未结束的时候,handleEvent已经被触发了......这样子到最后自然会有异常产生。问题的来源找到 了,解法也随即而生,在输入条件发生改变的时候,先把RowColorListener remove掉,当Filter完成以后再把RowColorListener添加给Table,异常自然也就不会发生了。修改后的代码如下:


 
  1. filterCombo.addSelectionListener(new SelectionAdapter() {  
  2.     @Override  
  3.     public void widgetSelected(SelectionEvent e) {  
  4.         String text = filterCombo.getText();  
  5.         if (!text.equals(EMPTY_FILLTER_STRING)) {  
  6.             table.removeListener(SWT.EraseItem, colorListener);  
  7.             viewer.resetFilters();  
  8.             viewerFilter.setFilterData(text);  
  9.             viewer.addFilter(viewerFilter);  
  10.             table.addListener(SWT.EraseItem, colorListener);  
  11.         } else {  
  12.             viewer.resetFilters();  
  13.         }  
  14.     }  
  15. }); 

posted on 2008-04-15 14:05 gembin 阅读(702) 评论(0)  编辑  收藏 所属分类: Eclipse RCP


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(6)

随笔分类(440)

随笔档案(378)

文章档案(6)

新闻档案(1)

相册

收藏夹(9)

Adobe

Android

AS3

Blog-Links

Build

Design Pattern

Eclipse

Favorite Links

Flickr

Game Dev

HBase

Identity Management

IT resources

JEE

Language

OpenID

OSGi

SOA

Version Control

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜

free counters