Java 如何在按键时锁定KeyListener

Java 如何在按键时锁定KeyListener,java,events,awt,keylistener,Java,Events,Awt,Keylistener,我在我的按钮上添加了下面的KeyListener,注意到如果我按下任何一个键,它就会持续地启动,就像我很快地按下和释放它一样。我从未释放过钥匙,但“a:released”消息仍在我的控制台中打印。为什么释放侦听器被解雇,我如何停止重复按键?我只想要一个“a:按下”,只要我按住键,然后在我松开键时一个“a:释放” button.addKeyListener(new KeyListener() { @Override public void keyTyped(KeyEvent e)

我在我的按钮上添加了下面的KeyListener,注意到如果我按下任何一个键,它就会持续地启动,就像我很快地按下和释放它一样。我从未释放过钥匙,但“a:released”消息仍在我的控制台中打印。为什么释放侦听器被解雇,我如何停止重复按键?我只想要一个“a:按下”,只要我按住键,然后在我松开键时一个“a:释放”

button.addKeyListener(new KeyListener() {
    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println(e.getKeyChar() + ": pressed");
    }

    @Override
    public void keyReleased(KeyEvent e) {
        System.out.println(e.getKeyChar() + ": released");
    }
});

即使(我假设)没有为重复事件创建新线程,是否仍然可以使方法像
同步的
方法一样工作。

您可以使用附加字段来指示按钮已按下:

button.addKeyListener(new KeyListener() {
    @Override
    public void keyTyped(KeyEvent e) {
    }

    private boolean pressed = false;

    @Override
    public void keyPressed(KeyEvent e) {
        if (!pressed) {
            System.out.println(e.getKeyChar() + ": pressed");
            pressed = true;
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        pressed = false;
        System.out.println(e.getKeyChar() + ": released");
    }
});

在keyReleased()方法中,该字段一直被设置为false,因此它仍然重复打印这两行。定义这个范围,而不是在内部类中,这正是KeyListener在Linux上的工作方式(无法确认其他操作系统),您可以使用一个标志来解决它,就像tcb所建议的答案一样。