2011-09-16 8 views
9

Sto facendo un'applicazione con java che ha un JTextPane. Voglio essere in grado di eseguire qualche codice quando il immette il tasto premuto (o quando l'utente passa alla riga successiva). Ho cercato sul Web e non ho trovato una soluzione. Sarebbe meglio affrontare questo con C#? In caso contrario, come posso registrare il tasto Invio nell'evento keyTyped() di JTextPane? Se C# è una buona opzione, come farei in C#?Java: registrazione <ENTER> pressione tasto su JTextPane

Ecco una soluzione ho pensato avrebbe funzionato ... ma non

//Event triggered when a key is typed 
private void keyTyped(java.awt.event.KeyEvent evt) { 
    int key = evt.getKeyCode(); 
    if (key == KeyEvent.VK_ENTER) { 
     Toolkit.getDefaultToolkit().beep(); 
     System.out.println("ENTER pressed"); 
    } 
} 

Perché l'esempio di cui sopra non funziona è perché non importa quale tasto premo, ho un keyCode 0. vorrei preferisco una soluzione a questo problema in Java ma C# funzionerebbe altrettanto bene, forse meglio. Inoltre, prova a rispondere alla domanda con esempi e non con link (a meno che tu non ne abbia davvero bisogno). Grazie!

+0

non utilizzare keyListeners, utilizzare keyBindings come @Hovercraft suggerito – kleopatra

+0

Da JavaDocs per getKeyCode(): 'Per gli eventi KEY_TYPED, il codice chiave è VK_UNDEFINED. È stato documentato come tale almeno dal 1.3. –

risposta

13

Una soluzione consiste nell'aggiungere una rilegatura a chiave sul testo. per esempio,

JTextPane textPane = new JTextPane(); 

    int condition = JComponent.WHEN_FOCUSED; 
    InputMap iMap = textPane.getInputMap(condition); 
    ActionMap aMap = textPane.getActionMap(); 

    String enter = "enter"; 
    iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), enter); 
    aMap.put(enter, new AbstractAction() { 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     System.out.println("enter pressed"); 
    } 
    }); 
+3

+1 per [associazioni di tasti] (http://download.oracle.com/javase/tutorial/uiswing/misc/keybinding.html), sebbene l'azione di interruzione dell'inserto predefinita vada persa. – trashgod

+2

@trashgod true, ma il requisito non è completamente chiaro, potrebbe essere un) sostituire il comportamento predefinito o b) aggiungere al comportamento predefinito Per b) semplicemente avvolgere l'impostazione predefinita e il trigger nel commento personalizzato – kleopatra

1

Questa risposta è nel caso in cui nessuno mai vede questa discussione ho avuto le stesse cose di Mohammad Adib. Così, invece di utilizzare (evt.getKeyCode() == evt.VK_ENTER) Io uso (evt.getKeyChar() == '\ n')

and the solution worked. 
+0

alla domanda ancora valida: non usare keyListeners ... ever. Esistono soluzioni a un livello di astrazione più elevato, vedere la risposta di @graphgod – kleopatra

+0

Da JavaDocs per getKeyCode(): 'Per gli eventi KEY_TYPED, il codice chiave è VK_UNDEFINED. È stato documentato come tale almeno dal 1.3. Presumo che l'OP non abbia mai letto i documenti. –

0

Cerco ENTER digitare la password campo di testo, per avviare il metodo di accesso quando è stato premuto INVIO. Il codice sottostante stamperà nella console il codice di accesso. Dopo aver eseguito il programma e digitando alcune tihngs nel box ho scoperto per tasto Invio è il codice 13.

txtPass = new Text(shlLogin, SWT.BORDER | SWT.PASSWORD); 
    txtPass.addKeyListener(new KeyAdapter() { 
     @Override 
     public void keyPressed(KeyEvent e) { 
      System.out.println(e.keyCode); 
      if (e.keyCode == 13) { /* ... Do your stuff ... */ } 
     } 
    }); 

Se siete alla ricerca di una singola pressione di un tasto, si può ancora essere un po 'pigro e evitare di imparare nuove roba sulle associazioni di tasti, usando questo metodo. Il divertimento inizia quando si aggiungono le scorciatoie CTRL + [Lettera] - ma questo è per un'altra discussione.