我正在尝试构建一个包含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;
}
}
答案 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)
ViewerFilter
对TableViewer
的输入进行操作,因为您没有使用tableViewer.setInput(model)
,因此在您的情况下将为空。而是直接创建TableItem
。
您需要设置内容提供者,标签提供者,并定义一个模型,您可以为表查看器传递给.setInput
,并删除直接创建TableItem
的函数。
执行此操作后,ViewerFilter
应该有效。
有很多教程可以用来描述这一点,包括https://eclipse.org/articles/Article-Table-viewer/table_viewer.html和http://wiki.eclipse.org/index.php/JFaceSnippets