Eclipse JFace / SWT ViewerFilter select永远不会被调用

时间:2015-01-23 15:21:09

标签: eclipse swt jface

我正在尝试构建一个包含TableViewer的简单对话框,以及一个可以过滤数据的复选框。但是表是空的,过滤永远不会完成。这段代码怎么了?

public class AsTestDialog extends TitleAreaDialog {

private Table table;

private AsTestFilter filter;

private TableViewer tableViewer;

public AsTestDialog(Shell parentShell) {
    super(parentShell);
}

@Override
 public void create() {
     super.create();
     setTitle("Table Test");
 }

 @Override
 protected Control createDialogArea(Composite parent) {
     Composite area = (Composite) super.createDialogArea(parent);
     area.setLayout(new GridLayout(1, false));

     tableViewer = new TableViewer(area, SWT.BORDER | SWT.FULL_SELECTION);
     table = tableViewer.getTable();
     table.setHeaderVisible(true);
     table.setLinesVisible(true);
     table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

     TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
     TableColumn tblclmnNewColumn = tableViewerColumn.getColumn();
     tblclmnNewColumn.setWidth(130);
     tblclmnNewColumn.setText("Column1");

     TableViewerColumn tableViewerColumn_2 = new TableViewerColumn(tableViewer, SWT.NONE);
     TableColumn tblclmnId = tableViewerColumn_2.getColumn();
     tblclmnId.setWidth(150);
     tblclmnId.setText("Column2");

     Composite composite = new Composite(area, SWT.NONE);
     composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));

     Button btnFilter = new Button(composite, SWT.CHECK);
     btnFilter.setBounds(10, 10, 111, 20);
     btnFilter.setText("Filter");
     btnFilter.addSelectionListener(new SelectionListener() {

        @Override
        public void widgetSelected(SelectionEvent e) {
            System.out.println("CHECKBOX SELECTED");
            filter.setFilterType("foobar");
            tableViewer.refresh();
        }

        @Override
        public void widgetDefaultSelected(SelectionEvent e) {}

     });
     addTestData(table);
     //Filter
     filter = new AsTestFilter();
     tableViewer.addFilter(filter);
     tableViewer.getTable().pack();
     tableViewer.refresh();
     return area;
 }

 private void addTestData(Table table) {
     TableItem item1 = new TableItem(table, SWT.NONE);
     item1.setText(new String[] {"1","2"}); 
     item1.setData("1");
     TableItem item2 = new TableItem(table, SWT.NONE);
     item2.setText(new String[] {"3","4"}); 
     item2.setData("3");
 }
}

过滤器类:

public class AsTestFilter extends ViewerFilter {

private String filterType = "all";

public void setFilterType(String tp) {
    this.filterType = tp;
}

@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
    System.out.println("SELECT CALLED: "+filterType);
    return true;
}

}

2 个答案:

答案 0 :(得分:1)

如果您使用的是JFace TableViewer,则必须使用内容提供商'用

设置
tableViewer.setContentProvider(provider);

然后致电

tableViewer.setInput(input data);

直接创建TableItem个对象将无法正常工作,因为TableViewer期望自己创建这些对象。

如果你有一个简单的数组或List个对象,内容提供者可以简单地:

tableViewer.setContentProvider(ArrayContentProvider.getInstance());

和设置输入:

tableViewer.setInput(array or list);

您的过滤器未被调用,因为您没有调用setInput,表查看器在调用此过程之前不执行任何操作。

答案 1 :(得分:0)

ViewerFilterTableViewer的输入进行操作,因为您没有使用tableViewer.setInput(model),因此在您的情况下将为空。而是直接创建TableItem

您需要设置内容提供者,标签提供者,并定义一个模型,您可以为表查看器传递给.setInput,并删除直接创建TableItem的函数。

执行此操作后,ViewerFilter应该有效。

有很多教程可以用来描述这一点,包括https://eclipse.org/articles/Article-Table-viewer/table_viewer.htmlhttp://wiki.eclipse.org/index.php/JFaceSnippets