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