Ключевое состояние модификатора

У меня небольшая (рикики) проблема в SWT...

Я создаю небольшой класс, расширяющий org.eclipse.swt.widgets.Composite и который должен быть вложен в приложение RCP...

В этом небольшом классе у меня есть виджеты, которые должны реагировать на события мыши или клавиатуры.

НО

Мне нужно использовать клавиши-модификаторы (Shift/Ctrl/Alt/...), чтобы изменить поведение компонентов, когда я нажимаю на них или отправляю им событие клавиатуры...

Проблема в том, что я не могу просто слушать нажатие mod-key, потому что мой пользователь может вычеркнуть его из моего компонента, а затем щелкнуть по нему...

Я не могу использовать фильтр отображения, чтобы не мешать оболочке, в которую вложен мой компонент. (но, возможно, это будет мое последнее решение, если нет другого решения)

Я не могу сделать прозрачный компонент, который считывает и отправляет события всем моим компонентам, потому что он будет, самое большее, таким же большим, как мой компонент, и не будет получать удары mod-key из оболочки моего компонента. (или даже из скорлупы)...

Кто-нибудь знает?


person Ar3s    schedule 16.06.2009    source источник
comment
О, нашел кое-что о государственных масках ... я поищу об этом больше ^^   -  person Ar3s    schedule 16.06.2009


Ответы (3)


Более-менее похоже

myComponent.add<Any>Listener(new <Appropriate>Listener(){
    @Override
    public void <AppropriateMethod>(like KeyPress)>(<Appropriate>Event e) {
        int stateMask=e.stateMask;
        if((stateMask & SWT.ALT)==SWT.ALT){
            <Do_appropriate_actions>;
        }
        if((stateMask & SWT.CTRL)==SWT.CTRL){
            <Do_another_appropriate_actions>;
        }
        if((stateMask & SWT.SHIFT)==SWT.SHIFT){
            <Do_an_even_more_appropriate_actions_cause_you_are_kind_of_a_code_roxxor_!>;
        }
    };
};

Надеюсь, поможет ...

person Ar3s    schedule 26.06.2009

Попробуйте что-нибудь в этом роде, чтобы захватить все ключи и сохранить их на потом:

    Display.getDefault().addFilter( SWT.KeyDown, new Listener() {

        public void handleEvent( Event passedEvent ) {
            //Listen for and store as static var last pressed keycode
            System.out.println( "Key Event: " + passedEvent );
        }
    } );
person fisherja    schedule 23.06.2009
comment
Да, но он фиксирует все нажатия клавиш, даже ненужные... Мой метод State-Mask (нажатие клавиши модификатора при запуске другого события) намного проще ^^ (по крайней мере, в моем случае) - person Ar3s; 24.06.2009
comment
Для полноты вы могли бы опубликовать свой метод/решение и на этот вопрос? Спасибо - person fisherja; 24.06.2009

Вы можете проверить ключи-модификаторы, используя следующий метод:

/**
 * Key code of pressed modifier key.
 *
 * @param keyEvent the received key event
 * @return the key code or 0 if no modifier key is pressed
 */
private static int getModifierKeyCode(KeyEvent keyEvent) {
    return (keyEvent.stateMask & SWT.MODIFIER_MASK);
}

Пример вызова:

item.addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent keyEvent) {
        if(getModifierKeyCode(keyEvent) == SWT.CTRL && keyEvent.keyCode == 'f') { // CTRL + F
            // do something
        )
    }
}
person Terran    schedule 28.08.2018
comment
Спасибо. (Это было 9 лет назад, но надеюсь, что однажды это кому-нибудь поможет) - person Ar3s; 28.08.2018