2009-12-22 14 views
8

Ho un problema con setAccelerator(). In questo momento, ho il codice che funziona per Ctrl + X per l'operazione DELETE. Voglio impostare l'acceleratore su Shift + Delete anche per lo stesso JMenuItem.È possibile definire più acceleratori per un JMenuItem?

Il mio codice come segue:

JMenuItem item = new JMenuItem(menuText); 
item.setAccelerator(KeyStroke.getKeyStroke(
    KeyEvent.VK_X, KeyEvent.CTRL_MASK)); 
item.setAccelerator(KeyStroke.getKeyStroke(
    KeyEvent.VK_DELETE, KeyEvent.SHIFT_MASK)); 

ma questo funziona solo per Maiusc + Canc operazione. Sembra sovrascrivere l'operazione Ctrl + X. Possiamo fare in modo che entrambe queste sequenze di tasti funzionino contemporaneamente?

Guida.

risposta

3

Da: http://java.sun.com/j2se/1.4.2/docs/api/java/awt/AWTEvent.html

Le maschere sono utilizzati anche per specificare di quali tipi di eventi un AWTEventListener dovrebbero ascoltare.

Quindi è possibile combinare la maschera per due chiavi, ma non per KeyEvents.

item.setAccelerator( 
    KeyStroke.getKeyStroke(
     KeyEvent.VK_X, KeyEvent.CTRL_MASK + KeyEvent.SHIFT_MASK)); 

Una soluzione soluzione potrebbe essere quella di prendere il KeyEvent nel mezzo (dopo il componente licenziato, ma prima che i vostri ascoltatori agire su di esso) e controllare, se il suo uno dei due combinazioni. Quindi attiva un evento, sul quale si accetta programmaticamente di rappresentare l'azione desiderata.

+0

Questo dovrebbe essere un OR invece di un PLUS: 'KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK' – MondKin

0

La seconda chiamata supera effettivamente l'acceleratore. Se il metodo inizia con set, ce ne sarà solo uno. Se il metodo inizia con add, puoi averne più di uno (ad esempio per un numero di listener).

Se si desidera che più sequenze di tasti facciano lo stesso, penso che si debba aggiungere un keyListener al frame superiore (o al pannello, alla finestra di dialogo, ...) che richiama i listener di azione aggiunti al menuItem.

7

Sì, si può fare. Dietro le quinte setAccelerator() sta creando un Key Binding, tuttavia come notato il secondo binding sostituisce il primo.

Quindi, è necessario creare un'azione (non un ActionListener) per aggiungere la voce di menu. Leggi la sezione dal tutorial Swing su How to Use Actions per ulteriori informazioni. Ora che hai creato l'Azione, puoi condividere l'Azione con un altro KeyStroke creando manualmente un Key Binding. Puoi leggere la sezione dal tutorial Swing su How to Use Key Bindings per una spiegazione dettagliata. Oppure puoi leggere il mio blog su Key Bindings che fornisce alcuni semplici esempi di codice.

Questa seconda associazione non verrà visualizzata nella voce di menu stessa.

Problemi correlati