Java:在JTextPane上注册<ENTER>键按下

9
我正在使用Java制作一个应用程序,其中包含JTextPane。我希望在按下回车键(或用户进入下一行)时能够执行一些代码。我在网上搜索了很多但是没有找到解决方案。如果不采用C#,如何在JTextPane的keyTyped()事件中注册Enter键?如果C#是一个好的选择,我该如何在C#中实现这个功能?
以下是我认为可行但实际并没有的解决方案...
//Event triggered when a key is typed
private void keyTyped(java.awt.event.KeyEvent evt) {
    int key = evt.getKeyCode();
    if (key == KeyEvent.VK_ENTER) {
        Toolkit.getDefaultToolkit().beep();
        System.out.println("ENTER pressed");
    }
}

上面的例子不起作用的原因是无论我按哪个键,都会得到一个keyCode为0。我更喜欢在Java中解决这个问题,但C#也可以同样有效,甚至更好。请尽量用示例来回答问题,而不是链接(除非你真的需要)。谢谢!

不要使用keyListeners,而是像@Hovercraft建议的那样使用keyBindings。 - kleopatra
从JavaDocs的getKeyCode()方法中可以看到:“对于KEY_TYPED事件,keyCode是VK_UNDEFINED。”自至少1.3版本以来一直如此记录。 - Jason C
3个回答

13

一种解决方案是在文本面板上添加键绑定。例如:

  JTextPane textPane = new JTextPane();

  int condition = JComponent.WHEN_FOCUSED;
  InputMap iMap = textPane.getInputMap(condition);
  ActionMap aMap = textPane.getActionMap();

  String enter = "enter";
  iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), enter);
  aMap.put(enter, new AbstractAction() {

     @Override
     public void actionPerformed(ActionEvent arg0) {
        System.out.println("enter pressed");
     }
  });

3
虽然默认的插入换行操作会丢失,但对于键绑定(key bindings)我给出+1的支持。 - trashgod
2
@trashgod 确实如此,但要求并不是完全清晰的,可能是a)替换默认行为或b)添加到默认行为。对于b),只需在自定义中包装默认和触发器即可。 - kleopatra

1
这篇回答是为了如果有人查看这个帖子,我得到了与Mohammad Adib先生相同的东西。
因此,不使用...
(evt.getKeyCode()==evt.VK_ENTER)

我使用了...

(evt.getKeyChar()=='\n')

并且解决方案奏效了。


我的评论仍然适用于这个问题:永远不要使用keyListeners。有更高抽象级别的解决方案,请参见@trashgod的答案。 - kleopatra
从JavaDocs的getKeyCode()中可以得知:对于KEY_TYPED事件,keyCode是VK_UNDEFINED。自至少1.3版本以来就已经有这样的文档记录。我认为OP没有阅读过相关文档。 - Jason C

0
我正在寻找密码文本框中的回车键,以便在按下ENTER时启动登录方法。下面的代码将在控制台中打印出按键码。运行程序并在框中输入一些内容后,我发现回车键的代码是13。
    txtPass = new Text(shlLogin, SWT.BORDER | SWT.PASSWORD);
    txtPass.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            System.out.println(e.keyCode);
            if (e.keyCode == 13) { /* ... Do your stuff ... */ }
        }
    });

如果你只是想要一个单一按键,你仍然可以有点懒,避免学习关于键绑定的新知识,通过使用这种方法。当添加CTRL+[字母]快捷键时,乐趣就开始了 - 但这是另一个讨论的话题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接