2011-09-16 17 views
9

Estoy haciendo una aplicación con java que tiene un JTextPane. Quiero poder ejecutar algún código cuando se presiona la tecla enter (o cuando el usuario pasa a la siguiente línea). He buscado en la web y no he encontrado una solución. ¿Sería mejor abordar esto con C#? Si no, ¿cómo puedo registrar la tecla Enter en el evento keyTyped() de JTextPane? Si C# es una buena opción, ¿cómo haré esto en C#?Java: Registrar <ENTER> presionar la tecla en JTextPane

Aquí es una solución que pensé que trabajar ... pero no lo hicieron

//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"); 
    } 
} 

Por qué el ejemplo anterior no funciona es porque no importa qué tecla presiono, me sale un código de clave de 0. lo haría prefiera una solución a este problema en Java pero C# funcionaría igual de bien, quizás mejor. Además, intente responder la pregunta con ejemplos y no enlaces (a menos que realmente lo necesite). ¡Gracias!

+0

no use keyListeners, use keyBindings como @Hovercraft sugirió – kleopatra

+0

De los JavaDocs para getKeyCode(): 'Para eventos KEY_TYPED, el keyCode es VK_UNDEFINED. Se ha documentado como tal al menos desde 1.3. –

Respuesta

13

Una solución es agregar un enlace de clave en el panel de texto. por ejemplo,

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 para [enlaces de teclas] (http://download.oracle.com/javase/tutorial/uiswing/misc/keybinding.html), aunque se perderá la acción de inserción y corte predeterminada. – trashgod

+2

@trashgod cierto, pero el requisito no está completamente claro, podría ser a) reemplazar el comportamiento predeterminado o b) agregar el comportamiento predeterminado para b) simplemente ajustar el predeterminado y desencadenar en el – kleopatra

1

Esta respuesta es por si alguien alguna vez ve este hilo Tengo las mismas cosas que el Sr. Mohammad Adib. Así que en lugar de utilizar (evt.getKeyCode() == evt.VK_ENTER) utilizo (evt.getKeyChar() == '\ n')

and the solution worked. 
+0

personalizado mi comentario a la pregunta aún se cumple: no use keyListeners ... alguna vez. Hay soluciones en un nivel de abstracción más alto, vea la respuesta de @rashgod – kleopatra

+0

De los JavaDocs para getKeyCode(): 'Para eventos KEY_TYPED, el keyCode es VK_UNDEFINED. Se ha documentado como tal al menos desde 1.3. Supongo que el OP nunca leyó los documentos. –

0

Busco tecla ENTER en la contraseña campo de texto, para iniciar el método de inicio de sesión cuando se presiona ENTER. El siguiente código imprimirá en la consola el código clave. Después de ejecutar el programa y escribir unas cuantas tihngs en el cuadro descubrí por la tecla ENTER es el código 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 ... */ } 
     } 
    }); 

Si usted está buscando una sola pulsación de tecla, todavía puede ser un poco perezoso y evitar el aprendizaje de nueva cosas sobre enlaces de teclas, mediante el uso de este método. La diversión comienza cuando se agregan los accesos directos CTRL + [Carta], pero esto es para otra discusión.

Cuestiones relacionadas