JFace TableViewer - 如何在调用 setInput(...) 后正确触发 SelectionChanged()?
JFace TableViewer - how to properly fireSelectionChanged() after calling setInput(...)?
我在包含 TableViewer
的 RCP 程序中有一个编辑器。 TableViewer
的内容可以作为编辑器中 Action
的结果进行更新。目前这是通过创建新输入并调用
来完成的
tableViewer.setInput(updatedInput);
不幸的是,这不会发送 SelectionChangedEvent
,直到编辑器失去焦点或在 table 中做出新的选择。这会导致 Command
出现问题,它通过 HandlerUtil.getCurrentSelection(event)
-
获取当前选择
ISelection oldSelection = tableViewer.getSelection();
Collection<Foo> newFoos = fooAction.createNewFoos();
tableViewer.setInput(newFoos);
...
...//call an action.
...//Inside the action:
Collection<Foo> selectedFoos = HandlerUtil.getCurrentSelection(event).toList();
//No good! We get the unchanged selection back!
我看到有两种方法可以解决这个问题。遍历输入并调整现有对象而不是调用 setInput()
可能会起作用,但在我的情况下不是一个选项。相反,我想触发一个 SelectionChangedEvent
,它将使 HandlerUtil
更新其 currentSelection
变量。目前,我是这样实现的:
ISelection oldSelection = tableViewer.getSelection();
Collection<Foo> newFoos = fooAction.createNewFoos();
tableViewer.setInput(newFoos);
ISelection selection = tableViewer.getSelection();
tableViewer.setSelection(null);
tableViewer.setSelection(selection);
这有效,因为选择会发生变化,这会强制触发一个事件。但这也是一个丑陋的 hack,即使有评论,我认为这可能会使将来查看这段代码的任何人感到困惑。
那么在所有这些都已解决的情况下,是否有适当的方法让 TableViewer
发射 SelectionChangedEvent
?我可以使用适当的 ContentProvider
使它自动发生吗?或者我可以通过从视图或编辑器中触发 属性 更改来以某种方式完成此操作吗?
如有任何提示,我们将不胜感激!
除了您应该将选择设置为空而不是 null 之外,您显示的内容很好:
tableViewer.setSelection(StructuredSelection.EMPTY);
我在包含 TableViewer
的 RCP 程序中有一个编辑器。 TableViewer
的内容可以作为编辑器中 Action
的结果进行更新。目前这是通过创建新输入并调用
tableViewer.setInput(updatedInput);
不幸的是,这不会发送 SelectionChangedEvent
,直到编辑器失去焦点或在 table 中做出新的选择。这会导致 Command
出现问题,它通过 HandlerUtil.getCurrentSelection(event)
-
ISelection oldSelection = tableViewer.getSelection();
Collection<Foo> newFoos = fooAction.createNewFoos();
tableViewer.setInput(newFoos);
...
...//call an action.
...//Inside the action:
Collection<Foo> selectedFoos = HandlerUtil.getCurrentSelection(event).toList();
//No good! We get the unchanged selection back!
我看到有两种方法可以解决这个问题。遍历输入并调整现有对象而不是调用 setInput()
可能会起作用,但在我的情况下不是一个选项。相反,我想触发一个 SelectionChangedEvent
,它将使 HandlerUtil
更新其 currentSelection
变量。目前,我是这样实现的:
ISelection oldSelection = tableViewer.getSelection();
Collection<Foo> newFoos = fooAction.createNewFoos();
tableViewer.setInput(newFoos);
ISelection selection = tableViewer.getSelection();
tableViewer.setSelection(null);
tableViewer.setSelection(selection);
这有效,因为选择会发生变化,这会强制触发一个事件。但这也是一个丑陋的 hack,即使有评论,我认为这可能会使将来查看这段代码的任何人感到困惑。
那么在所有这些都已解决的情况下,是否有适当的方法让 TableViewer
发射 SelectionChangedEvent
?我可以使用适当的 ContentProvider
使它自动发生吗?或者我可以通过从视图或编辑器中触发 属性 更改来以某种方式完成此操作吗?
如有任何提示,我们将不胜感激!
除了您应该将选择设置为空而不是 null 之外,您显示的内容很好:
tableViewer.setSelection(StructuredSelection.EMPTY);