Java 在JTextArea中按下空格键后如何调用方法

Java 在JTextArea中按下空格键后如何调用方法,java,swing,jtextarea,Java,Swing,Jtextarea,很抱歉,这可能是一个简单的问题,但是每次在JTextArea中按下空格键时,我如何调用一个方法?我曾尝试将keylistener附加到文本区域,但无法使其正常工作。谢谢。阅读上的Swing教程 本教程有很多例子,你可以在论坛上找到很多其他的例子 创建要执行的自定义操作时,将扩展TextAction 虽然@camickr有一个好的、简单的解决方案,我对此进行了改进,但一个复杂但更彻底的选择是使用与JTextArea相关联的文档,并覆盖它的insertString()方法。例如,有时您已经在这样做了

很抱歉,这可能是一个简单的问题,但是每次在JTextArea中按下空格键时,我如何调用一个方法?我曾尝试将keylistener附加到文本区域,但无法使其正常工作。谢谢。

阅读上的Swing教程

本教程有很多例子,你可以在论坛上找到很多其他的例子


创建要执行的自定义操作时,将扩展TextAction

虽然@camickr有一个好的、简单的解决方案,我对此进行了改进,但一个复杂但更彻底的选择是使用与
JTextArea
相关联的
文档,并覆盖它的
insertString()
方法。例如,有时您已经在这样做了,以防止字母添加到数字字段中。与KeyBinding相比,它的优点是,当用户复制并粘贴到JTextArea时,它也会捕获。因此,如果用户将“foo bar”复制并粘贴到该区域中,KeyBinding将无法捕捉到这一点(我很确定,我错了吗?)。e、 例如,非常示意性地:

JTextArea jt=new JTextArea();

jt.addKeyListener(new KeyListener(){ 

    public void keyPressed(KeyEvent ke){ 

         if(ae.getKeyCode()==KeyEvent.VK_SPACE){
              //call your method
         }
    }
});
@Override
public void insertString(int offset, String str, AttributeSet a) throws BadLocationException {
  if (str.contains(" "))
    callMySpecialSpaceMethod();
  super.insertString(offset, str, a);
}
正如@camickr所指出的,我们可以设置DocumentFilter,而不是直接对Document.insertString()进行子类化和重写。(.)不幸的是,它的一些铸造有点笨重,但以下是基本代码:

((AbstractDocument)myTextArea.getDocument()).setDocumentFilter(new DocumentFilter() {

    @Override
    public void insertString(FilterBypass fb, int offset, String str, AttributeSet a) throws BadLocationException {
        if (str.contains(" "))
            callMySpecialSpaceMethod();
        fb.insertString(offset, str, a);
    }

});

这比KeyBinding要复杂得多,所以,除非你真的需要这么彻底,或者你已经因为另一个原因这样做了,否则KeyBinding更简单。这取决于您的需求-在您的情况下,我认为您不在乎他们是否复制和粘贴。

您的keylistener代码是什么样子的?不要使用keylistener。Swing设计用于键绑定。无需重写文档的insertString()方法。如果你真的想在文档级别做一些事情,那么根据具体的需求,你可以使用
DocumentListener
DocumentFilter
。你是对的-使用DocumentListener/Filter听起来很熟悉。我已经有一段时间没有这样做了,但是我想提到一般的文档概念。当我有时间时,我会编辑/更新。而且,对于这篇文章,你的键绑定帖子几乎肯定是正确的方法。-1,仅仅因为某些东西有效并不意味着它应该被提升。在AWT应用程序中,当您没有选择余地时,会使用这种方法。长期以来,论坛成员一直在努力推广正确使用Swing的方法。正如我在前面的评论中提到的,Swing设计用于键绑定。一旦你学会了这个挥杆,它就更容易使用和定制了。