我一直在創建一個自定義的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遍歷不再工作?
在此先感謝!