`
dearwolf
  • 浏览: 344439 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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. });  
分享到:
评论

相关推荐

    DataGridView添加自定义Columntype

    1. **兼容性**:确保自定义的ColumnType与现有的DataGridView逻辑兼容。 2. **性能考虑**:对于大型数据集,需要优化自定义ColumnType的性能,避免出现性能瓶颈。 3. **异常处理**:实现自定义功能时,应充分考虑...

    c# DataGridView Columns 增加ColumnType选择

    本篇文章将深入探讨如何在`DataGridView`的列中增加自定义的`ColumnType`,并展示如何构建一个自定义的NumericUpDown单元格。 `DataGridViewTextBoxColumn`和`DataGridViewTextBoxColumn`是`DataGridView`默认提供...

    java实体类字段自定义-数据库字段和程序实体类属性不一致解决方案.docx

    Java 实体类字段自定义是指在 Java 开发中,实体类的字段与数据库表的字段不一致的问题。这种情况下,需要实现实体类字段的自定义,以便与数据库字段保持一致。本文将介绍 Java 实体类字段自定义的解决方案,并结合 ...

    自定义pb数据窗口线条颜色

    在PowerBuilder(PB)开发环境中,自定义数据窗口(DataWindow)的线条颜色是一项重要的功能,这能够帮助开发者实现更个性化的界面展示,提升用户体验。本文将深入探讨如何在PB9中实现这一功能,包括对grid样式的...

    Bootstrap Blazor Table 组件(四)自定义列生成.doc

    其次,我们还可以在 TableColumn 中定义每一列的功能,如日期(DateTime)与数量(Count)两列分别赋予排序与过滤功能。在此过程中,过滤功能还会根据你的属性类型,自动生成日期选择框,免除你还要手动输入烦恼。 ...

    ListView自定义控件(文本颜色修改与每行显示图标结合源代码)

    对于自定义文本颜色,ListView控件本身不直接支持每个项的文本颜色自定义。但你可以通过覆盖OnDrawItem事件来实现这一功能: ```csharp this.listView1.DrawItem += new DrawListViewItemEventHandler(ListView1_...

    tekla官方自定义节点CB2_Column_Beam.uel

    tekla官方自定义节点CB2_Column_Beam.uel

    WPF自定义TreeViewItem 样式

    通过以上步骤,我们可以创建出与应用需求相匹配的自定义`TreeViewItem`样式。在实际开发中,可能还需要考虑性能优化,如使用虚拟化来提高大量数据加载时的效率。在CSDN博客链接中提供的文章《WPF自定义TreeViewItem...

    datagridview自定义

    自定义datagridview,包括:样式、合并单元格、进度条列、日期列、合并行……

    修改grid行或列颜色

    2. **列颜色修改**:通过 `ColumnModel` 的 `renderer` 属性指定自定义渲染器,可以在单元格级别上设置背景颜色。 3. **灵活性与可扩展性**:这种方式不仅可以让Grid更具可读性,而且易于维护和扩展。比如可以通过...

    QTreeView树形视图使用自定义模型model

    自定义模型需要继承`QAbstractItemModel`并重写其必要的方法,以便正确地与`QTreeView`交互。 1. **自定义模型创建**: - 创建一个新类,如`CustomModel`,并让它继承自`QAbstractItemModel`。 - 实现`...

    QTreeView 使用自定义Model

    - 除了Model,我们还可以通过自定义QStyledItemDelegate来改变每个单元格的显示方式,例如自定义绘制、字体样式、颜色等。 - 实现`paint()`和`sizeHint()`方法,分别处理绘制和大小计算。 4. **交互功能** - ...

    C# DataGridView自定义列 用Combobox 和DataGridViewLookUpColumn

    C# DataGridView自定义列 用Combobox 和DataGridViewLookUpColumn 京华志&精华志出品 希望大家互相学习,互相进步 支持CSDN 支持微软 主要包括C# ASP.NET SQLDBA 源码 毕业设计 开题报告 答辩PPT等

    datagridview自定义标题文本

    此外,`DataGridView`的样式也是可以自定义的,包括标题的字体、颜色、对齐方式等。例如,想要改变标题的字体大小和颜色,可以这样操作: ```csharp dataGridView1.ColumnHeadersDefaultCellStyle.Font = new Font...

    自定义的 DataGrid样式

    这里设置了背景色和边框颜色,可以根据需求添加更多属性,如字体、行高、列宽等。 3. **数据模板** 数据模板定义了DataGrid中的每一行如何显示数据。使用`DataTemplate`来定义列的显示样式: ```xml ...

    DataGrid自定义列标题

    e.Column.Header = "自定义标题"; } ``` 1.2 使用DataGridTextColumn 如果已经手动定义了列,可以通过设置DataGridTextColumn的Header属性来改变标题: ```xml 自定义标题" Binding="{Binding PropertyName}" /...

    JTable使用自定义数据类型示例工程

    在这个方法中,我们可以设置`JCheckBox`的选中状态以及颜色属性,使得用户能清晰地看到Checkbox的状态。 ```java public class CustomBooleanRenderer extends DefaultTableCellRenderer { @Override public ...

    devexpress 自定义合并单元格和表头

    例如,`column1.MergeWith(column2)`将使column1与column2合并。 2. **自定义合并逻辑**:如果默认的合并规则不能满足需求,可以重写`GridView.CustomDrawCell`事件。在这个事件处理程序中,你可以根据业务逻辑来...

    WPF 自定义CheckBox样式

    在这个模板中,`FontIcon`的`FontFamily`属性被设置为字体图标的库,`Glyph`属性则是对应的图标代码,`Foreground`属性决定图标颜色。 为了响应CheckBox的状态变化(如选中、未选中),我们需要添加Visual State ...

    控件的自定义排列

    ### 控件的自定义排列——C# ListView控件详解 #### 一、概述 在C#的Windows Forms应用程序中,`ListView`控件是一种非常强大的数据展示工具,它能够以列表的形式显示信息,并且可以自定义列的数量和类型。本文将...

Global site tag (gtag.js) - Google Analytics