2015-02-11 94 views
2

我正在做一個簡單的菜單來刪除樹上的項目。但是,刪除項目後,樹不會收到選擇事件,因此,偵聽器中的代碼不會執行(完整代碼中的偵聽器將更新部分UI)。刪除選擇後SWT選擇事件

我簡化了下面的代碼,省略了詳細信息。它是這樣的:

tree.addListener (SWT.Selection, new Listener(){ 
    public void handleEvent(Event e) { 
    (....) 
    } 
} 

我也試過這樣:

tree.addSelectionListener (new SelectionListener(){ 
     public void widgetDefaultSelected(SelectionEvent e){ 
      (...) 
     } 
     public void widgetSelected(SelectionEvent e) { 
      (...) 
     } 
    } 

在我的菜單操作(刪選),有這樣的:

TreeItem [] selected = tree.getSelection(); 
    tree.deselectAll(); 
    if (selected.length > 0) 
    { 
     for(TreeItem i : selected){ 
      i.dispose(); 
     } 
    } 

刪除選擇之後,我的選擇監聽器不會觸發。如果我使用Ctrl +單擊組合取消選擇所有itens,它會觸發。

我該怎麼辦?有沒有辦法在刪除itens後將SWT.Selection事件觸發到樹上,還是應該隔離監聽器中的代碼再次調用它?不應該tree.deselectAll()觸發選擇事件?

+0

'if(selected.length> 0)'部分不能編譯,因爲你似乎沒有在任何地方聲明'selected'。你是從我們這裏隱藏的東西嗎? – 2015-02-11 16:45:42

+0

是的,我試圖簡化代碼以避免混淆兩者之間的內容。對不起,這確實讓人困惑,我會編輯。我不應該嘗試簡化代碼來提問嗎? – 2015-02-11 16:50:02

+0

我注意到我已經聲明瞭它,TreeItem [] selected = tree.getSelection(); – 2015-02-11 16:50:55

回答

4

您可以用編程方式發送的選擇事件:

Event event = new Event(); 
event.widget = tree; 
event.display = tree.getDisplay(); 
event.type = SWT.Selection; 
tree.notifyListeners(SWT.Selection, event); 
+0

謝謝!這解決了我的問題! 不應該由tree.deselectAll()自動觸發事件嗎? – 2015-02-11 17:01:58

+1

'Tree.deselectAll'禁止發送通知。所以我想這是SWT設計的一部分。 – 2015-02-11 17:09:48

+0

那麼,SWT是跛腳。我查看了tree.deselectAll()的文檔,並沒有提到有關選擇通知被該方法抑制的任何內容。這應該。 – 2015-02-11 18:49:31

1

有同樣的情況,發現 this鏈接提的是,以編程爲setSelection可能永遠此事件,發送失敗的設計,所以總是把它(如果需要)以編程方式設置太