Я создаю собственное расширение TabFolder, которое добавляет слушателя клавиш, чтобы позволить быстрое переключение вкладок с помощью сочетания клавиш ALT + #.
Добавив KeyAdapter в мой TabFolder, обработчик событий работает правильно только тогда, когда у вас выбран заголовок вкладки (в этом случае также работают ALT + ARROW_LEFT / ARROW_RIGHT.). Мне нужно, чтобы эта горячая клавиша была активной, когда активен любой виджет с вкладкой TabFolder; однако он не должен быть активным, если выделение находится в другой папке вкладок или в виджете вне папки вкладок.
В попытке решить эту проблему я написал простую рекурсивную функцию для применения ключевого слушателя ко всем дочерним элементам папки tab:
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 теперь отсутствует. Когда вы нажимаете клавишу SWT.TAB, вы теряете фокус на текущем текстовом поле и не фокусируетесь ни на чем другом ...
Вопросы:
1.) Может ли каждый элемент управления иметь только один KeyListener?
2.) Почему оригинальный обход TAB больше не работает?
Заранее спасибо!