2017-04-13 68 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; 
    } 
} 
相關問題