繁体   English   中英

KeyListener 不触发 JTextField 中的事件

[英]KeyListener not firing events in JTextField

我有一个带有KeylistenerJTextfield ,如下所示:

field.addKeyListener(new KeyAdapter() {

        @Override
        public void keyPressed(KeyEvent e) {
            log.debug("KEY PRESSED");
        }

        @Override
        public void keyTyped(KeyEvent e) {
            log.debug("KEY TYPED");
        }

        @Override
        public void keyReleased(KeyEvent e) {
            log.debug("KEY RELEASED");
        }
});

但是当我键入一些键时,我可以看到keyReleased并不总是触发。 如果它没有触发,我之后无法直接键入任何键,我必须再次单击文本字段或键入另一个键才能触发已释放的事件(键入的键未显示在文本字段中)。 我没有用 Keys 做任何其他事情,没有事件被消耗。 感觉这个事件确实是随机触发的。 KeyListener而不是KeyAdapter发生同样的情况:

field.addKeyListener(new KeyListener() {

我使用的是 Linux 64 位,但这也发生在 Win8 和 Win10 64 位上。 还尝试了不同的键盘和不同的电脑。

如何正确触发事件?

当我按下箭头键时必须发生的特殊事件。

Swing 组件使用 Key Bindings 将 Actions 与 KeyStrokes 相关联。

JTextField 已经具有与“箭头键”关联的默认操作。 如果要更改此行为,则需要为这些键创建自定义操作以替换默认操作。

查看 Key Bindings 以获取每个 Swing 组件的默认绑定列表。

您应该通过扩展TextAction来创建您的 Action

static class SelectAll extends TextAction
{
    public SelectAll()
    {
        super("Select All");
    }

    public void actionPerformed(ActionEvent e)
    {
        JTextComponent component = getFocusedComponent();
        component.selectAll();
        component.requestFocusInWindow();
    }
}

然后,您可以使用以下命令将其绑定到文本字段的左箭头键:

 Action action = new SelectAll();
 KeyStroke keyStroke = KeyStroke.getKeyStroke("LEFT");
 InputMap im = textField.getInputMap();
 textField.getActionMap().put(im.get(keyStroke), action);

暂无
暂无

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

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