Stato chiave modificatore
Domanda
Ho un piccolo problema (rikiki) in SWT ...
Sto creando una piccola classe che estende org.eclipse.swt.widgets.Composite e che dovrebbe essere nidificata in un'app RCP ...
In questa piccola classe ho dei widget che dovrebbero reagire all'evento del mouse o della tastiera
MA
Devo usare i tasti modificatori ( Maiusc / Ctrl / Alt / ... ) per modificare i comportamenti dei miei coponenti quando li faccio clic o invio loro un evento da tastiera ...
Il problema è che non posso semplicemente ascoltare mod-key perché il mio utente può eliminarlo dal mio componente e quindi fare clic su di esso ...
Non posso usare un filtro di visualizzazione per evitare di disturbare la shell che nidifica il mio componente. ( ma potrebbe essere la mia ultima soluzione nel caso in cui non ci sia altra soluzione )
Non riesco a creare un componente trasparente che legge e invia eventi a tutti i miei componenti perché sarebbe, al massimo, grande quanto il mio componente e non riceverebbe mod-key dalla shell fuori dal mio componente (o addirittura fuori dalla shell) ...
Qualcuno ha qualche idea?
Soluzione
Più o meno è come
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_!>;
}
};
};
Spero che aiuti ...
Altri suggerimenti
Prova qualcosa lungo queste linee per acquisire tutti i tasti e salvarli per dopo:
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 );
}
} );
Puoi testare i tasti modificatori usando il seguente metodo:
/**
* 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);
}
Esempio di chiamata:
item.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent keyEvent) {
if(getModifierKeyCode(keyEvent) == SWT.CTRL && keyEvent.keyCode == 'f') { // CTRL + F
// do something
)
}
}