【问题标题】:Stopping default behavior of events in Swing在 Swing 中停止事件的默认行为
【发布时间】:2010-11-07 07:39:18
【问题描述】:

我在通过单击发送按钮或在一段代码的消息文本字段中按 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("");
}

最后一段代码使文本区域空白。但是,在按回车键发送消息后,文本框不是空的,而是包含换行符。

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

【问题讨论】:

    标签: java user-interface swing event-handling


    【解决方案1】:

    尝试在致电sendMessage() 后添加evt.consume()

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

    【讨论】:

      【解决方案2】:

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

      阅读Key Bindings 以了解这是如何完成的。所有 Swing 组件都使用键绑定。

      【讨论】:

      • 据我了解,作为论坛的新手,-2 表示有几个人认为答案是错误的或误导性的。我是否因为没有解释什么是 Action 或其他原因而得到否定的结果?另外,每当有新的解决方案/评论添加到帖子中时,我是否应该收到自动电子邮件?
      • 似乎很多人并没有真正帮助论坛的新人,但感谢您,因为您多次帮助我理解我的错误并为我指明正确的方向:- )
      【解决方案3】:

      正如 camickr 所说, 您应该绑定操作以输入密钥;

      动作 sendAction = new AbstractAction("Send"){ 公共无效actionPerformed(ActionEvent ae){ // 在这里做你的事情 } }; textarea.registerKeyboardAction(sendAction, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), JComponent.WHEN_FOCUSED); sendButton.setAction(sendAction);

      如果您更感兴趣,我使用以下技术为 textarea 实现了 Autoindent 功能: here

      【讨论】:

      • -1 用于传播过时的 api(registerKeyboardAction 至少从 jdk 1.3 开始已经过时,在 2009 年之前就已经过时了 ;-)
      猜你喜欢
      • 1970-01-01
      • 2015-03-11
      • 2017-10-02
      • 2011-10-19
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 2019-03-31
      相关资源
      最近更新 更多