2015-03-13 55 views
1

我已經實現了TreeViewer,並在其中添加了雙擊偵聽器。這個雙擊監聽器應該展開/摺疊節點。SWT TreeViewer在設置SWT.FULL_SELECTION時同時展開和摺疊

treeViewer = new TreeViewer(component, SWT.BORDER | SWT.MULTI); 
treeViewer.addDoubleClickListener(new IDoubleClickListener() { 
      public void doubleClick(DoubleClickEvent e) { 
       final IStructuredSelection selection = (IStructuredSelection) e 
         .getSelection(); 
       if (selection == null || selection.isEmpty()) 
        return; 

       final Object sel = selection.getFirstElement(); 
       TreeNode selNode = (TreeNode) sel; 

       if (treeViewer.getExpandedState(sel)) { 
        treeViewer.collapseToLevel(sel, 1); 
       } else { 
        treeViewer.expandToLevel(sel, 1); 
       } 
      } 
     }); 

現在,如果我改變的TreeViewer是FULL_SELECTION像...

treeViewer = new TreeViewer(component, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION); 

這behavoiur更改很奇怪。

當雙擊顯示標籤的節點時,一切都如前所述。但是當點擊該行時,離標籤稍遠一點,節點同時展開/摺疊,完全沒有改變。

調試它我發現,在我收到雙擊事件之前,還有另一個事件被觸發(或者是在我處理它之前正在偵聽它),擴展/摺疊特定節點。禁用監聽器,我能夠擺脫這種行爲。但是當雙擊標籤時,這又禁用了節點的擴展。

我在調試eclipse時看到過類似的行爲,並想知道這是一個知道的bug還是更壞的預期行爲?

任何建議表示感謝,並提前謝謝!

回答

1

我可以觀察到你在Windows 7上描述的問題。這個東西展開/摺疊項目很可能是本機代碼。

雖然我認爲這是SWT或Win32樹形控件中的一個bug,並且在SWT中修復或解決了這個問題,但我發現了一種可以一見成效的解決方法。如果在Tree小部件上使用SWT偵聽器而不是IDoubleClikListener,則可以確定標籤本身是否已單擊,或者僅確定並自行展開/摺疊該項目,或者將其保留爲

treeViewer.getTree().addListener(SWT.DefaultSelection, new Listener() { 
    @Override 
    public void handleEvent(Event event) { 
    TreeItem treeItem = (TreeItem)event.item; 
    Point cursorLocation = event.display.getCursorLocation(); 
    Point localCursorLocation = treeItem.getParent().toControl(cursorLocation); 
    if(treeItem.getBounds().contains(localCursorLocation)) { 
     // put your JFace expand/collapse code here 
    } 
    } 
}); 

由於此問題可能取決於平臺,因此您應該在所有目標平臺上進行測試。

+0

謝謝你的回答。 我自己正在搞這個想法,但無法弄清楚如何讓我的手在標籤或行被點擊。 +1。 我會在接下來的日子裏進一步檢查,但現在我會將其標記爲正確的答案。 – Dalewn 2015-03-14 18:09:22

+0

我測試了你的代碼,它適用於我。我只需要將'treeItem.getBounds(int Index)'修改爲'treeItem.getBounds()',以便使它適用於多列樹。 – Dalewn 2015-03-16 08:57:01

+0

感謝您的反饋,我已經更新了相應的答案。 – 2015-03-16 09:16:06