Состояние ключа- модификатора
Вопрос
У меня есть крошечный (рикики) проблема в SWT ...
Я создаю небольшой класс, расширяющий org.eclipse.swt.виджеты.Составной и который должен быть вложен в приложение RCP ...
В этом небольшом классе у меня есть виджеты, которые должны реагировать на событие мыши или клавиатуры
НО
Мне нужно использовать ключи-модификаторы (Shift/Ctrl/Alt/...), чтобы изменить поведение моих копонентов, когда я нажимаю на них или отправляю им событие клавиатуры...
Проблема в том, что я не могу просто слушать мод-ключ поразительно, потому что мой пользователь может вычеркнуть его из моего компонента, а затем щелкнуть по нему...
Я не могу использовать фильтр отображения, чтобы не нарушать работу оболочки, в которую вложен мой компонент. (но, может быть, это будет мое последнее решение на случай, если другого решения не будет)
Я не могу создать прозрачный компонент, который считывает и отправляет события всем моим компонентам, потому что он, самое большее, будет таким же большим, как мой компонент, и не получит мод-ключ удаляет из оболочки мой компонент (или даже из оболочки) ...
У кого-нибудь есть какие-нибудь идеи?
Решение
Более или менее это похоже на
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_!>;
}
};
};
Надеюсь , это поможет ...
Другие советы
Попробуйте что-нибудь в этом роде, чтобы захватить все ключи и сохранить их на потом:
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 );
}
} );
Вы можете протестировать наличие ключей-модификаторов, используя следующий метод:
/**
* 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
)
}
}