KeyListener未在JTextField中触发事件

时间:2015-10-06 07:45:12

标签: java swing jtextfield keylistener

我有JTextfield Keylistener,如下所示:

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 64bit,但这也出现在Win8和Win10 64bit上。还试过不同的键盘和不同的电脑。

如何正确启动事件?

1 个答案:

答案 0 :(得分:0)

  

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

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

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

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

您应该通过扩展TextAction

来创建您的操作
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);