2009-07-01 20 views
5

Tengo el siguiente bit de código en un método llamado al hacer clic en el botón Enviar, o al presionar Intro en el campo de texto del mensaje en un fragmento de código.Detener el comportamiento predeterminado de eventos en Swing

// In class ChatWindow 
private void messageTextAreaKeyPressed(java.awt.event.KeyEvent evt) { // Event handler created by Netbeans GUI designer to call this method.   
    if(evt.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { 
     sendMessage(); 
    } 
} 
public void sendMessage() { 
    String currentMessage = messageTextArea.getText(); 
    addMessage("You", currentMessage); 
    app.sendMessage(currentMessage, 1); 
    messageTextArea.setText(""); 
} 

El último bit del código muestra el área de texto en blanco. Sin embargo, después de enviar un mensaje presionando el botón enter, en lugar de estar vacío, el cuadro de texto contiene una nueva línea.

Supongo que después de que se ejecute mi controlador de eventos, ENTONCES se agrega el carácter de nueva línea. ¿Cómo detengo la nueva línea que se agrega?

Respuesta

14

intento de añadir evt.consume() después de su llamada a sendMessage()

private void messageTextAreaKeyPressed(java.awt.event.KeyEvent evt) { 
if(evt.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { 
    sendMessage(); 
    evt.consume(); 
} 
} 
9

El valor predeterminado para Action la tecla Intro en un JTextArea es insertar una nueva línea como usted ha visto. Entonces la solución es reemplazar el predeterminado Action con un Action personalizado. El beneficio de este enfoque es que este Action también puede ser utilizado por JButton (oetc.). Un Action es básicamente lo mismo que un ActionListener, todo lo que necesita hacer es implementar el método actionPerformed().

Lea en Key Bindings para ver cómo se hace esto. Todos los componentes Swing utilizan enlaces clave.

+3

ser nuevo en el foro como yo lo entiendo, el -2 indica un par de personas creen que la respuesta es incorrecto o engañoso. ¿Obtuve el resultado negativo porque no le expliqué qué es una Acción o por alguna otra razón? Además, ¿debería recibir correos electrónicos automáticos siempre que se agregue una nueva solución/comentario a la publicación? – camickr

+0

Parece que muchas personas realmente no ayudan a los recién llegados a los foros, pero gracias a ti, como me has ayudado muchas veces en la comprensión de mis errores y apuntándome en la dirección correcta :-) –

2

como dijo camickr, debe vincular la acción para ingresar la clave;

 
Action sendAction = new AbstractAction("Send"){ 
    public void actionPerformed(ActionEvent ae){ 
     // do your stuff here 
    } 
}; 

textarea.registerKeyboardAction(sendAction, 
     KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), JComponent.WHEN_FOCUSED); 
sendButton.setAction(sendAction); 

si son más interesed, he implementado función autoindent de área de texto, el uso de esta técnica: here

+0

-1 para la difusión de fecha api (registerKeyboardAction está desactualizado desde al menos jdk 1.3, antes del 2009 ;-) – kleopatra

Cuestiones relacionadas