我看到的行为不是默认行为或本机行为。感谢@ LorisSecuro的评论和示例,使其明确。
我发现并修复了两个问题。
第一个是我的错。在ICheckStateListener
中,我错过了一些代码...设置选择。
第二个问题是其他人可能遇到的问题。每当有人选中/取消选中某个项目时,CheckboxTreeViewer正在呼叫我的ISelectionChangedListener
- 即使选择未发生变化,也会返回。假定我的ISelectionChangedListener已被调用,并且将选择设置在树外,我推测选择已经改变。
MySelectionChangedListener.selectionChanged(SelectionChangedEvent event)
...
CheckboxTreeViewer(Viewer).fireSelectionChanged(SelectionChangedEvent) line: 160
CheckboxTreeViewer(StructuredViewer).updateSelection(ISelection) line: 2197
CheckboxTreeViewer(StructuredViewer).handleSelect(SelectionEvent) line: 1228
CheckboxTreeViewer.handleSelect(SelectionEvent) line: 291
StructuredViewer$4.widgetSelected(SelectionEvent) line: 1257
OpenStrategy.fireSelectionEvent(SelectionEvent) line: 242
...
该解决方案很简单。我跟踪选择内容,并在ISelectionChangedListener中执行任何操作之前验证它是否已经实际更改。
@Override
public void selectionChanged(SelectionChangedEvent event) {
ITreeSelection treeSelection = m_treeViewer.getStructuredSelection();
List<?> newSelection = treeSelection.toList();
if (! m_lastKnownSelection.equals(newSelection)) {
...
m_lastKnownSelection = newSelection;
}
}
在Windows 10,使用[本实施例中程序(http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/DemonstratesCheckboxTreeViewer.htm)(并添加风格'SWT.MULTI '),点击复选框不会选择该项目,并保留以前的选择。你有[MCVE](https://stackoverflow.com/help/mcve)显示你描述的行为吗? –
@LorisSecuro - 我已经试过这个例子,并且得到你描述的行为,即使没有添加SWT.MULTI。感谢您提供非常有用的观察。你的例子就够了。现在我可以看看这个例子和我们的案例有什么不同。一个区别是我在RCP中运行。不确定这件事情是否尚未解决。谢谢! –
@LorisSecuro - 谢谢。您的观察导致我在代码中导致观察到的行为与默认行为不同的两个问题。因为其中一个问题可能会影响其他人,所以我已经发布了这个答案。 –