TableViewer.getElementAt()返回已过滤的元素

时间:2019-04-16 07:46:42

标签: java swt jface

我正在尝试自动选择过滤表中的第一项。

我基本上是在做以下事情:

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立即接受过滤?

2 个答案:

答案 0 :(得分:1)

根据我的经验,选择第一个(可见)元素的最可靠方法是(仅一次)绕过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;
}

多年来,我已成功使用此代码处理排序,过滤和虚拟表。

答案 1 :(得分:0)

好吧,我发现了问题所在,这是我自己的错。我设置的过滤器是可变的,因此可以或多或少地严格过滤。问题是我在设置选择后 激活了更严格的过滤。

仍然感谢大家的帮助。