我看到的行爲不是默認行爲或本機行爲。感謝@ 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;
}
}
在Windows 10,使用[本實施例中程序(http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/DemonstratesCheckboxTreeViewer.htm)(並添加風格'SWT.MULTI '),點擊複選框不會選擇該項目,並保留以前的選擇。你有[MCVE](https://stackoverflow.com/help/mcve)顯示你描述的行爲嗎? –
@LorisSecuro - 我已經試過這個例子,並且得到你描述的行爲,即使沒有添加SWT.MULTI。感謝您提供非常有用的觀察。你的例子就夠了。現在我可以看看這個例子和我們的案例有什麼不同。一個區別是我在RCP中運行。不確定這件事情是否尚未解決。謝謝! –
@LorisSecuro - 謝謝。您的觀察導致我在代碼中導致觀察到的行爲與默認行爲不同的兩個問題。因爲其中一個問題可能會影響其他人,所以我已經發布了這個答案。 –