2013-10-05 37 views
1

我陷入了SWT問題。我想推遲創建一個ViewerComparator類,直到用戶真正想從ComboViewer中選擇一個項目。在我的用例中,Comparator是一個非常複雜的野獸,它使用了大量的資源。用戶通常不需要真正打開CombiViewer,所以我想我可以通過將比較器的創建推遲到真正需要的時刻節省計算時間。打開時調用JFace ComboViewer setComparator()

這裏是我的嘗試:

comboViewer1.addOpenListener(new IOpenListener(){ 

    @Override 
    public void open(OpenEvent event) { 

     if (comboViewer1.getComparator() == null){ 
      comboViewer1.setComparator(new ViewerComp(transientModelThing.getComRef())); 
     } 
    } 
}); 

我不是很熟悉SWT和JFace。但在調試器中,我發現這個開放的方法從來沒有被調用過。我期望在用戶試圖摺疊組合框時調用它。

沒有想法爲什麼聽衆不工作? postSelectionListener,我註冊很多相同的方式完美地運作。 comboViewer1和transientModelThing是一個公共全局變量。 ViewerComp是我的私人類,它實現了這個複雜的比較器。

+0

因此,這是不被調用的「open」方法,而不僅僅是不執行的「if」部分? – Baz

+1

當雙擊列表中的某個條目(或根據打開的策略單擊時),會調用IOpenListener。 Combo查看器打開下拉列表時不會調用它。 –

+0

@ greg-449,THX,我需要什麼類型的監聽器?應該有一個可以在comboviewer擴展之前使用的鉤子。 – luksch

回答

0

在回答如果他們解決了自己的問題的優良傳統,我把這裏我的解決方案:

comboViewer1.getControl().addListener(SWT.MouseEnter, new Listener(){ 

    @Override 
    public void handleEvent(Event event) { 

     if (comboViewer1.getComparator() == null){ 
      comboViewer1.setComparator(new ViewerComp(transientModelThing.getComRef())); 
     } 
    } 
}); 

我用SWT.MouseEnter事件現在。這當然不是我想要的,但它足夠接近。

@ greg-449 Thx for input!

+0

不會'SWT.MouseDown'成爲更好的解決方案嗎? – Baz

+0

我嘗試了兩個。 '''MouseDown'''不能用於這個目的。 – luksch

+0

您使用的是哪個版本的SWT?據[這](https://bugs.eclipse.org/bugs/show_bug.cgi?id=273850),它應該工作。 – Baz

相關問題