4

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

4

3 回答 3

6

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

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

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

于 2013-03-26T03:05:40.383 回答
4
JTextArea jt=new JTextArea();

jt.addKeyListener(new KeyListener(){ 

    public void keyPressed(KeyEvent ke){ 

         if(ae.getKeyCode()==KeyEvent.VK_SPACE){
              //call your method
         }
    }
});
于 2013-03-26T06:31:27.963 回答
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。(更喜欢组合而不是继承。)不幸的是,它有点笨拙,但这里是基本代码:

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

于 2013-03-26T15:11:29.387 回答