2017-04-13 86 views
1

我正在使用JFace的CheckBoxTreeViewer。在CheckBoxTreeViewer中,如何停止检查/取消选中项目也选择它们?

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

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

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

+1

在Windows 10,使用[本实施例中程序(http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/DemonstratesCheckboxTreeViewer.htm)(并添加风格'SWT.MULTI '),点击复选框不会选择该项目,并保留以前的选择。你有[MCVE](https://stackoverflow.com/help/mcve)显示你描述的行为吗? –

+0

@LorisSecuro - 我已经试过这个例子,并且得到你描述的行为,即使没有添加SWT.MULTI。感谢您提供非常有用的观察。你的例子就够了。现在我可以看看这个例子和我们的案例有什么不同。一个区别是我在RCP中运行。不确定这件事情是否尚未解决。谢谢! –

+0

@LorisSecuro - 谢谢。您的观察导致我在代码中导致观察到的行为与默认行为不同的两个问题。因为其中一个问题可能会影响其他人,所以我已经发布了这个答案。 –

回答

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; 
    } 
} 
相关问题