我正在尝试自动选择过滤表中的第一项。
我基本上做了以下事情:
table = new TableViewer(...);
table.addFilter(filter);
table.setContentProvider(contentProvider);
table.setInput(input);
first = table.getElementAt(0);
table.setSelection(new StructuredSelection(first));
令人惊讶的是(取决于过滤器)我可以得到一个从getElementAt(0)
过滤掉的元素。结果是最终不会选择任何项目。
我尝试在获得具有相同结果的元素之前调用table.refresh()
。
如果我稍后调用getElementAt(0)
,我确实得到了正确的第一个元素(没有过滤掉)。
如何让getElementAt
立即尊重过滤?
根据我的经验,选择第一个(可见)元素的最可靠方法是 - 仅限一次 - 绕过JFace,依赖其内部数据模型,并使用SWT API选择第一个TableItem
,如下所示:
static Object selectFirstElement(TableViewer tableViewer) {
Object firstElement = null;
Table table = tableViewer.getTable();
if (table.getItemCount() > 0) {
firstElement = table.getItem(0).getData();
tableViewer.setSelection(new StructuredSelection(firstElement), true); // true == reveal
}
return firstElement;
}
几年来,我已经使用已排序,过滤和虚拟表成功使用此代码。
好吧,我发现了什么是错的,这是我自己的错。我设置的过滤器是可变的,所以它可以或多或少严格过滤。问题是我在设置选择后激活了更严格的过滤。
无论如何,谢谢大家的帮助。