2009-07-01 6 views
5

Ho il seguente bit di codice in un metodo chiamato facendo clic sul pulsante di invio o premendo Invio nel campo di testo del messaggio in un pezzo di codice.Arresto del comportamento predefinito degli eventi in 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(""); 
} 

L'ultimo bit di codice oscura l'area di testo. Tuttavia, dopo che un messaggio è stato inviato premendo il pulsante Invio, invece di essere vuoto, la casella di testo contiene una nuova riga.

La mia ipotesi è che dopo che il mio gestore di eventi è stato eseguito, ALLORA è stato aggiunto il carattere di nuova riga. Come posso interrompere l'aggiunta della nuova riga?

risposta

14

prova ad aggiungere evt.consume() dopo la vostra chiamata a sendMessage()

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

L'impostazione predefinita Action per il tasto Invio in un JTextArea è quello di inserire una nuova linea come avete visto. Quindi la soluzione è sostituire il valore predefinito Action con un valore personalizzato Action. Il vantaggio di questo approccio è che questo Action può essere utilizzato anche da JButton (o JMenuItem ecc.). Un Action è praticamente lo stesso di ActionListener, tutto ciò che devi fare è implementare il metodo actionPerformed().

Leggere su Key Bindings per vedere come questo è fatto. Tutti i componenti Swing utilizzano i collegamenti chiave.

+3

Essendo nuovo del forum se ho capito bene, il -2 indica un paio di persone che la risposta è sbagliato o fuorilegge. Ho ricevuto il negativo perché non ho spiegato cos'è un'azione o per qualche altro motivo? Inoltre, dovrei ricevere e-mail automatiche ogni volta che una nuova soluzione/commento viene aggiunta al messaggio? – camickr

+0

Sembra che molte persone non aiutino davvero un nuovo arrivato nei forum, ma grazie a te, dato che mi hai aiutato molte volte a comprendere i miei errori e indirizzandomi nella giusta direzione :-) –

2

come detto, è necessario associare l'azione per immettere la chiave;

 
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); 

se siete più interesed, ho implementato funzionalità autoindent per textarea, utilizzando questa tecnica: here

+0

-1 per la diffusione datata api (registerKeyboardAction è obsoleto dal momento che almeno jdk 1.3, wayy prima del 2009 ;-) – kleopatra