2009-07-21 54 views
2

我一直在創建一個自定義的TabFolder擴展,該擴展添加了一個按鍵監聽器,允許使用ALT +熱鍵快速切換標籤。SWT,在添加密鑰列表器時保持默認的標籤排序

通過將KeyAdapter添加到我的TabFolder,事件處理程序只有在選擇了選項卡標題時才能正常工作(在這種情況下,ALT + ARROW_LEFT/ARROW_RIGHT也可以工作)。當TabFolder中的任何Widget處於活動狀態時,我需要使用此熱鍵;但是,如果所選內容位於選項卡文件夾之外的其他選項卡文件夾或小部件中,則它不應處於活動狀態。

在試圖解決這個問題,我寫了一個簡單的遞歸函數的鍵偵聽器適用於所有的標籤文件夾的孩子:

public void applyQuickSwitchKeyBindings() { 
    removeKeyListener(ka); 
     addKeyListener(ka); 
    for(Control c: getChildren()) 
     applyQuickSwitchKeyBindingsToChildren(c); 

    } 

private void applyQuickSwitchKeyBindingsToChildren(Control c) { 

    if(c==null) return; 
    if(c instanceof Composite) { 
     Control[] controls = ((Composite)c).getChildren(); 
     for(Control c2: controls) 
      applyQuickSwitchKeyBindingsToChildren(c2); 
     if(controls.length < 1) { 
      c.removeKeyListener(ka); 
      c.addKeyListener(ka); 
     } 
    } 
} 

然後我打電話applyQuickSwitchKeyBindings()我添加了後控制選項卡組中的每個TabItem。

好消息是快速切換熱鍵(ALT +#)效果很好!

壞消息是,基於z-index的原始TAB排序現在沒有了。當你打你你目前的文本框失去焦點,不就什麼都獲得焦點的SWT.TAB關鍵...

問題:

1)可以分別控制只能有一個KeyListener的?

2.)爲什麼原來的TAB遍歷不再工作?

在此先感謝!

回答

0

to 1)我敢肯定,允許多個KeyListener。 2)我不確定,這取決於你在你的KeyAdapter中做什麼。也許你可以發佈呢?

我只是Tab鍵順序被打斷了,您可以通過調用setTabList(Control[])來重置(或更改)它。

setTablList(new Control[] { 
    control1, 
    control2, 
    control3, 
    .... 
}); 
0

因此,經過更多的時間與SWT學習和開發,我發現我的問題。當您添加偵聽器時,它會應用到您調用addXXXListener函數的窗口小部件/控件。所以如果這個控件沒有激活,那麼聽衆不會被解僱。

該解決方案似乎是SWT的全局過濾機制,允許您添加全局應用程序(顯示)範圍偵聽器。

Display.getCurrent().addFilter(SWT.keyPress, new KeyPressListener()); 

請原諒這一行的不正確性,但是如果你google了,你會明白我的意思。

我也讀過使用這個節省。