添加Filter,相当于search功能,当某一行的内容和输入的text匹配时,该行就显示,其它行过滤掉。我写了一个ViewerFilterOnCellText,它对每个元素,遍历每列上显示的字符串,如果有包含search text的,该列就显示;如果没有输入,显示所有行。该ViewerFilterOnCellText支持TableViewer, TreeViewer,GridTableViewer和GridTreeViewer,只要在search text变化时,调用ViewerFilterOnCellText—> setSearchText(String),然后refresh viewer便可。
Note: 判断字符串是否包含search text,使用的是StringUtils.containsIgnoreCase(str, searchStr),忽略大小写,并且不会有正则表达式会遇到的异常,如果str是多行的,也能判断正确。
使用方法:
private final ViewerFilterOnCellText viewerFilter = new ViewerFilterOnCellText(); private TableViewer tableViewer; Label searchLbl = toolkit.createLabel(parent, "Search", SWT.NONE); GridDataFactory.swtDefaults().applyTo(searchLbl); Text searchText = toolkit.createText(parent, "", SWT.BORDER); GridDataFactory.swtDefaults().hint(300, SWT.DEFAULT).applyTo(searchText); searchText.addModifyListener(event -> Display.getDefault().asyncExec(() -> { if (tableViewer != null) { viewerFilter.setSearchText(searchText.getText()); tableViewer.refresh(); } })); tableViewer = new TableViewer(parent, ...); tableViewer.addFilter(viewerFilter);
显示效果,输入时就会滤掉不匹配的行: