在 CheckBoxTreeViewer 中,如何阻止 checking/unchecking 项也被选中?

In CheckBoxTreeViewer, how to stop checking/unchecking items from also selecting them?

我正在使用 JFace 的 CheckBoxTreeViewer。

当用户单击某个项目的文本时,它会 select 在树中和同一文档的演示文稿中的其他地方编辑。这是期望的行为。

当用户只需单击复选框时,树项也会变成 selected,至少在 Windows 和 Mac 实现中是这样。由于上述期望的行为,这反过来导致当前的 selection 被替换。

我希望用户能够在不替换当前 selection 的情况下转动树中的 on/off 项。有没有办法配置 CheckBoxTreeViewer,使 checking/unchecking 也不会 select 树项目?或者该行为只是 OS 特定外观的一部分?

我看到的行为不是默认行为或本机行为。感谢@LorisSecuro 的评论和示例使这一点变得清晰。

我发现并解决了两个问题。

第一个是我的错。在 ICheckStateListener 中,我遗漏了一些代码...设置选择。

第二个问题是其他人可能 运行 遇到的问题。每当有人 checked/unchecked 一个项目时,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.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;
  }
}