在 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;
}
}
我正在使用 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;
}
}