KeyListener 忽略 if 语句
KeyListener ignores if-statements
在此代码中:
public class KeyManager implements KeyListener{
public void keyPressed(KeyEvent e) {
boolean spacePressed = false;
if(e.getKeyCode() == KeyEvent.VK_SPACE){
if(spacePressed == false){
spacePressed = true;
System.out.println("Hello world");
}
}
}
我试图让 space 只打印一次 "Hello world",然后将 spacePressed
切换为 true,并且从那时起不再做任何事情。
使用系统打印我已经设法发现它在我按下它后确实将 spacePressed
更改为 true
,但由于某种原因我可以再次按下 space并再次打印出 "Hello world".
简而言之,编译器似乎忽略了 if 语句并继续阅读,这是不应该发生的。
这是因为在方法内部声明了spacePressed
。每次执行该方法时,它都会重新声明并初始化为 false
.
在外面声明:
public class KeyManager implements KeyListener{
boolean spacePressed = false;
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_SPACE){
if(spacePressed == false){
spacePressed = true;
System.out.println("Hello world");
}
}
}
请注意spacePressed == false
可以写成!spacePressed
:
if(!spacePressed){
由于 spacePressed
是一个局部变量,在下一次调用时它会再次用 false
初始化。解决方法:移动到KeyManager
class:
的一个字段
public class KeyManager implements KeyListener{
private boolean spacePressed = false;
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_SPACE){
if(this.spacePressed == false){
this.spacePressed = true;
System.out.println("Hello world");
}
}
}
在此代码中:
public class KeyManager implements KeyListener{
public void keyPressed(KeyEvent e) {
boolean spacePressed = false;
if(e.getKeyCode() == KeyEvent.VK_SPACE){
if(spacePressed == false){
spacePressed = true;
System.out.println("Hello world");
}
}
}
我试图让 space 只打印一次 "Hello world",然后将 spacePressed
切换为 true,并且从那时起不再做任何事情。
使用系统打印我已经设法发现它在我按下它后确实将 spacePressed
更改为 true
,但由于某种原因我可以再次按下 space并再次打印出 "Hello world".
简而言之,编译器似乎忽略了 if 语句并继续阅读,这是不应该发生的。
这是因为在方法内部声明了spacePressed
。每次执行该方法时,它都会重新声明并初始化为 false
.
在外面声明:
public class KeyManager implements KeyListener{
boolean spacePressed = false;
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_SPACE){
if(spacePressed == false){
spacePressed = true;
System.out.println("Hello world");
}
}
}
请注意spacePressed == false
可以写成!spacePressed
:
if(!spacePressed){
由于 spacePressed
是一个局部变量,在下一次调用时它会再次用 false
初始化。解决方法:移动到KeyManager
class:
public class KeyManager implements KeyListener{
private boolean spacePressed = false;
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_SPACE){
if(this.spacePressed == false){
this.spacePressed = true;
System.out.println("Hello world");
}
}
}