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

时间:2013-03-26 03:02:15

标签: java swing jtextarea

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

3 个答案:

答案 0 :(得分:6)

阅读How to Use Key Bindings上的Swing教程。

本教程有示例,您可以在论坛中找到大量其他示例。

当您创建要执行的自定义Action时,您将扩展TextAction。

答案 1 :(得分:4)

JTextArea jt=new JTextArea();

jt.addKeyListener(new KeyListener(){ 

    public void keyPressed(KeyEvent ke){ 

         if(ae.getKeyCode()==KeyEvent.VK_SPACE){
              //call your method
         }
    }
});

答案 2 :(得分:0)

虽然@camickr有一个很好的,简单的解决方案我已经投票,但是复杂但更彻底的选项是使用与Document相关联的JTextArea,并覆盖它insertString()方法。有时您已经这样做了,例如,为了防止字母被添加到数字字段。 KeyBinding的优势在于它还可以在用户复制并粘贴到JTextArea时捕获。因此,如果用户将“foo bar”复制并粘贴到该区域,KeyBinding将无法捕获(我很确定,我在这里错了吗?)并且Document技术将会。例如,非常示意性地:

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

正如@camickr所指出的,不是直接子类化和重写Document.insertString(),而是可以设置它的DocumentFilter。 (favor Composition over Inheritance。)不幸的是,它有些笨重,但这里是基本代码:

((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更简单。这取决于您的要求 - 在您的情况下,我认为您不关心它们是否复制和粘贴。