【问题标题】:How to lock KeyListener while key is pressed如何在按下键时锁定 KeyListener
【发布时间】:2013-06-12 00:02:24
【问题描述】:

我将以下 KeyListener 添加到我的按钮,并注意到如果我按住任何键,它就会开始连续触发,就好像我在快速按下和释放它一样。我从不释放密钥,但“a:已释放”消息仍在我的控制台中打印。为什么释放监听器被解雇,我怎样才能停止重复按键?只要我按住键,我只想要一个“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");
    }
});

有没有办法让这些方法像synchronized 方法一样工作,即使(我假设)没有为重复事件创建新线程。

【问题讨论】:

  • 这就是 KeyListener 在 Linux 上的工作方式(无法确认其他操作系统),您可以使用 tcb 的答案所建议的标志来解决它。

标签: java events awt keylistener


【解决方案1】:

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

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,因此它仍然重复打印两行。
  • 定义这个范围,不在内部类中
猜你喜欢
  • 1970-01-01
  • 2021-07-08
  • 2021-05-07
  • 2012-05-26
  • 1970-01-01
  • 2011-02-07
  • 2021-02-15
  • 1970-01-01
相关资源
最近更新 更多