SWT, сохранить порядок вкладок по умолчанию при добавлении Key Listner - PullRequest
2 голосов
/ 22 июля 2009

Я создаю собственное расширение 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 больше не работает?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 10 июля 2010

Итак, после дополнительного времени обучения и развития с помощью SWT я обнаружил свою проблему. Когда вы добавляете слушателя, он применяется к виджету / элементу управления, на котором вы вызываете функцию addXXXListener. Поэтому, если этот элемент управления не активен, слушатели не будут запущены.

Решением, похоже, является глобальный механизм фильтрации SWT, который позволяет добавлять глобальные прослушиватели области приложения (отображения).

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

Извините за неправильность этой строки, но если вы гуглите ее, вы поймете, о чем я.

Я также прочитал, чтобы использовать это экономно.

0 голосов
/ 26 августа 2009

до 1) Я уверен, что допускается более одного KeyListener.

до 2) Я не уверен, это зависит от того, что вы делаете в своем KeyAdapter. Может быть, вы можете опубликовать это тоже?

У меня просто порядок вкладок как-то нарушен, вы можете сбросить (или изменить) его вызовом setTabList( Control[] ).

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