Un bel po' di codice.
Per prima cosa, invece di KeyListener, estendi la classe Action, o una delle sue derivate. In generale ti basta fornire il metodo actionPerformed (implementa ActionListener) e un costruttore che richiama quello della superclasse.
Hai quindi una classe, chiamiamola AscoltaTastAction.
Poi prelevi la Action Map del tuo componente:
codice:
ActionMap mappaAzioni = mioComponente.getActionMap();
aggiungi alla mappa la tua nuova azione:
codice:
amap.put (chiave, AscoltaTastAction);
La chiave puo' essere un oggetto qualsiasi, anche se di solito si usa una stringa.
Ora preleva la Input Map del componente:
codice:
InputMap mappaTasti = mioComponente.getInputMap (JComponent.WHEN_IN_FOCUSED_WINDOW);
Il parametro di getInputMap puo' assumere tre valori:
- JComponent.WHEN_FOCUSED (funziona solo se c'e' il focus)
- JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT (funzionano solo se il componente contiene (o e' lui stesso) l'oggetto che detieni il focus
- JComponent.WHEN_IN_FOCUSED_WINDOW (associazioni di tasti che devono funzionare sempre)
In caso di conflitto, il primo ha priorita' sul secondo che ha priorita' sul terzo.
Ora devi associare il tasto con l'azione.
Per fare questo generi un KeyStroke. Cio' puo' essere una cosa complicata. Ad esempio:
codice:
KeyStroke CTRL_B = KeyStroke.getKeyStroke(KeyEvent.VK_B, InputEvent.CTRL_MASK);
Per fortuna, per le cose piu' semplici, esiste un altro factory che consente di generare questi oggetti da una semplice stringa:
codice:
KeyStroke CTRL_B = KeyStroke.getKeyStroke("ctrl B");
Finalmente, associa il tasto all'azione, usando la stessa chiave che hai usato prima.
codice:
mappaTasti.put (CTRL_B, chiave);