ViewerFilter主要用于根據(jù)條件來顯示或隱藏Tree或Table中的數(shù)據(jù),它的實(shí)現(xiàn)就不贅述了,在程序中用了一個下拉框來做觸發(fā)條件:
- 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();
- }
- }
- });
從代碼中可以看到,當(dāng)選中的條件為空字符串時——表明不過濾結(jié)果——就調(diào)用viewer.resetFilters()方法來去掉Filter,如果選中
條件不為空,就首先將現(xiàn)有的Filter清空,然后將把輸入值作為過濾條件賦給Filter,再將Filter添加給viewer.
關(guān)于自定義選中Column的顏色則參照了Snippet229的代碼,監(jiān)聽了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看上來似乎是風(fēng)馬牛不相及的,但是在應(yīng)用中卻出現(xiàn)了問題,會出現(xiàn)一大堆空指針異常,而且Debug根本跟
蹤不過去,最開始以為是Filter實(shí)現(xiàn)的問題,但做了很長時間的調(diào)試都沒有發(fā)現(xiàn)問題所在,過了4、5個小時以后,才想到也許和EraseItem事件有
關(guān)系,然后把上面的代碼注釋掉,果然就一點(diǎn)問題沒有了.......
又過了好久,才在同事的提示下,監(jiān)測一下在EraseItem事件被觸發(fā)的時候,F(xiàn)ilter是否完成了對數(shù)據(jù)的過濾,赫然發(fā)現(xiàn)在過濾以后
TableItem本來應(yīng)該只有兩個的,但是在RowColorListener的handleEvent方法中table.getItemCount的
結(jié)果卻是三,也就是在Filter的過濾還未結(jié)束的時候,handleEvent已經(jīng)被觸發(fā)了......這樣子到最后自然會有異常產(chǎn)生。問題的來源找到
了,解法也隨即而生,在輸入條件發(fā)生改變的時候,先把RowColorListener
remove掉,當(dāng)Filter完成以后再把RowColorListener添加給Table,異常自然也就不會發(fā)生了。修改后的代碼如下:
- 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();
- }
- }
- });