我正在使用JFace的CheckBoxTreeViewer。
当用户点击某个项目的文本时,它将在树中以及同一文档的演示文稿的其他位置中被选中。这是理想的行为。
当用户点击该复选框时,树项目也会被选中,至少在Windows和Mac实施中是这样。由于上述期望的行为,这反过来导致当前选择被替换。
我希望用户能够在不替换当前选择的情况下打开/关闭树中的项目。有没有办法配置CheckBoxTreeViewer,以便检查/取消选中也不选择树项?或者这种行为只是特定于操作系统的外观的一部分?
答案 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;
}
}