ViewerFilter主要用于根据条件来显示或隐藏Tree或Table中的数据,它的实现就不赘述了,在程序中用了一个下拉框来做触发条件:
 
    - filterCombo.addSelectionListener(new SelectionAdapter() {  
-             @Override  
-             public void widgetSelected(SelectionEvent e) {  
-                 String text = filterCombo.getText();  
-                 if (!text.equals(EMPTY_FILLTER_STRING)) {  
-                     viewer.resetFilters();  
-                     viewerFilter.setFilterData(text);  
-                     viewer.addFilter(viewerFilter);  
-                 } else {  
-                     viewer.resetFilters();  
-                 }  
-             }  
-         });  
 
从代码中可以看到,当选中的条件为空字符串时——表明不过滤结果——就调用viewer.resetFilters()方法来去掉Filter,如果选中
条件不为空,就首先将现有的Filter清空,然后将把输入值作为过滤条件赋给Filter,再将Filter添加给viewer.
关于自定义选中Column的颜色则参照了Snippet229的代码,监听了EraseItem的事件:
 
    - protected void setSelectedRowColor() {  
-         table.addListener(SWT.EraseItem, colorListener);  
-     }  
-   
-     private class RowColorListener implements Listener {  
-         public void handleEvent(Event event) {  
-   
-             if ((event.detail & SWT.SELECTED) != 0) {  
-                 GC gc = event.gc;  
-                 Rectangle area = table.getClientArea();  
-                  
-  
-  
-   
-                 int columnCount = table.getColumnCount();  
-                 if (event.index == columnCount - 1 || columnCount == 0) {  
-                     int width = area.x + area.width - event.x;  
-                     if (width > 0) {  
-                         Region region = new Region();  
-                         gc.getClipping(region);  
-                         region.add(event.x, event.y, width, event.height);  
-                         gc.setClipping(region);  
-                         region.dispose();  
-                     }  
-                 }  
-                 gc.setAdvanced(true);  
-                 if (gc.getAdvanced())  
-                     gc.setAlpha(127);  
-                 Rectangle rect = event.getBounds();  
-                 Color foreground = gc.getForeground();  
-                 Color background = gc.getBackground();  
-                 gc.setForeground(tabComposite.getDisplay().getSystemColor(  
-                         SWT.COLOR_RED));  
-                 gc.setBackground(tabComposite.getDisplay().getSystemColor(  
-                         SWT.COLOR_LIST_BACKGROUND));  
-                 gc.fillGradientRectangle(0, rect.y, 1024, rect.height, false);  
-                   
-                 gc.setForeground(foreground);  
-                 gc.setBackground(background);  
-                 event.detail &= ~SWT.SELECTED;  
-             }  
-         }  
-     }  
 
该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,异常自然也就不会发生了。修改后的代码如下:
 
    - filterCombo.addSelectionListener(new SelectionAdapter() {  
-     @Override  
-     public void widgetSelected(SelectionEvent e) {  
-         String text = filterCombo.getText();  
-         if (!text.equals(EMPTY_FILLTER_STRING)) {  
-             table.removeListener(SWT.EraseItem, colorListener);  
-             viewer.resetFilters();  
-             viewerFilter.setFilterData(text);  
-             viewer.addFilter(viewerFilter);  
-             table.addListener(SWT.EraseItem, colorListener);  
-         } else {  
-             viewer.resetFilters();  
-         }  
-     }  
- });