2009-07-01 4 views
5

Ich habe das folgende Codebeispiel in einer Methode, die durch Klicken auf die Schaltfläche Senden aufgerufen wird, oder durch Drücken der Eingabetaste in das Nachrichtentextfeld in einem Codeabschnitt.Anhalten des Standardverhaltens von Ereignissen 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(""); 
} 

Das letzte Bit Code löscht den Textbereich. Nachdem eine Nachricht jedoch durch Drücken der Eingabetaste gesendet wurde und nicht leer ist, enthält das Textfeld eine neue Zeile.

Meine Vermutung ist, dass nachdem mein Event-Handler ausgeführt wird, THEN das Zeilenumbruchzeichen hinzugefügt wird. Wie verhindere ich, dass der Zeilenumbruch hinzugefügt wird?

Antwort

14

try evt.consume() nach Ihrem Anruf auf sendMessage()

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

Der Standard Action für die Enter-Taste in einem JTextArea hinzuzufügen, ist eine neue Zeile einzufügen, wie Sie gesehen haben. Die Lösung besteht also darin, den Standard Action durch einen benutzerdefinierten Action zu ersetzen. Der Vorteil dieses Ansatzes ist, dass diese Action auch von der JButton (oder JMenuItem etc.) verwendet werden kann. Ein Action ist im Grunde das gleiche wie ein ActionListener, alles, was Sie tun müssen, implementieren Sie die actionPerformed() Methode.

Lesen Sie auf Key Bindings, um zu sehen, wie dies gemacht wird. Alle Swing-Komponenten verwenden Key Bindings.

+3

neues Wesen auf dem Forum, wie ich es verstehe, die -2 zeigt ein paar Leute, die Antwort glauben ist falsch oder irreführend. Habe ich das Negative bekommen, weil ich nicht erklärt habe, was eine Aktion ist oder aus einem anderen Grund? Sollte ich auch automatische E-Mails erhalten, wenn eine neue Lösung/Kommentar zur Buchung hinzugefügt wird? – camickr

+0

Scheint so, als ob viele Leute den Foren nicht wirklich helfen würden, aber danke an Sie, denn Sie haben mir oft geholfen, meine Fehler zu verstehen und mich in die richtige Richtung zu lenken :-) –

2

wie camickr sagte, sollten Sie Aktion binden, um Schlüssel einzugeben;

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

, wenn Sie mehr interesed sind, implementiert I autoindent Funktion für Textfeld, mit dieser Technik: here

+0

-1 für das Verteilen datiert api (registerKeyboardAction ist seit mindestens jdk 1.3 veraltet, wayy vor 2009 ;-) – kleopatra