在CheckBoxTreeViewer中,如何停止检查/取消选中项目以及选择它们?

时间:2017-04-13 19:34:55

标签: swt eclipse-rcp jface

我正在使用JFace的CheckBoxTreeViewer。

当用户点击某个项目的文本时,它将在树中以及同一文档的演示文稿的其他位置中被选中。这是理想的行为。

当用户点击该复选框时,树项目也会被选中,至少在Windows和Mac实施中是这样。由于上述期望的行为,这反过来导致当前选择被替换。

我希望用户能够在不替换当前选择的情况下打开/关闭树中的项目。有没有办法配置CheckBoxTreeViewer,以便检查/取消选中也不选择树项?或者这种行为只是特定于操作系统的外观的一部分?

1 个答案:

答案 0 :(得分:0)

我看到的行为不是默认行为或本机行为。感谢@ 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;
  }
}