停止Swing中事件的默认行为

时间:2009-07-01 12:21:30

标签: java user-interface swing event-handling

我在通过单击发送按钮调用的方法中有以下代码,或者在一段代码中按消息文本字段中的Enter键。

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

最后一段代码会使文本区域空白。但是,按Enter按钮发送消息后,文本框中包含换行符,而不是为空。

我的猜测是,在我的事件处理程序运行之后,然后添加了换行符。如何停止添加换行符?

3 个答案:

答案 0 :(得分:14)

在致电evt.consume()

后尝试添加sendMessage()
private void messageTextAreaKeyPressed(java.awt.event.KeyEvent evt) { 
 if(evt.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
    sendMessage();
    evt.consume();
 }
}  

答案 1 :(得分:9)

Action中Enter键的默认JTextArea是插入新行,如您所见。因此,解决方案是使用自定义Action替换默认的Action。这种方法的好处是Action(或JButton等)也可以使用此JMenuItemAction基本上与ActionListener相同,您只需要实现actionPerformed()方法。

阅读Key Bindings以了解如何完成此操作。所有Swing组件都使用Key Bindings。

答案 2 :(得分:2)

正如卡米克所说,    你应该绑定动作来输入密钥;

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

如果你更喜欢,我使用这种技术为textarea实现了Autoindent功能: here