繁体   English   中英

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

[英]How to call a method after the space bar is pressed in a JTextArea

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

阅读关于如何使用键绑定的Swing教程。

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

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

JTextArea jt=new JTextArea();

jt.addKeyListener(new KeyListener(){ 

    public void keyPressed(KeyEvent ke){ 

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

虽然@camickr有一个很好的,简单的解决方案,我已经投票,但是复杂但更彻底的选项是使用与JTextArea关联的Document ,并覆盖它的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。 赞成组合而不是继承 。)不幸的是,它有点笨拙的一些演员,但这里是基本的代码:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM