【问题标题】:KeyListener ignores if-statementsKeyListener 忽略 if 语句
【发布时间】:2015-02-05 12:13:27
【问题描述】:

在这段代码中:

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");
    }       
  }
}

我试图让空间只打印一次“Hello world”,然后将 spacePressed 切换为 true,从那时起不再做任何事情。

使用系统打印我发现它确实在我按下它后将spacePressed 更改为true,但由于某种原因,我可以再次按下空格并再次打印出“Hello world”。

简而言之,编译器似乎忽略了 if 语句并继续阅读,这是不应该发生的。

【问题讨论】:

  • spacePressed 变量应该像您构建代码的方式一样充当局部变量,并且每次都会初始化为 false,然后设置为 true,然后因为它是本地变量而被销毁。

标签: java if-statement keylistener


【解决方案1】:

这是因为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){

【讨论】:

  • 哦,哇,你已经解释过了,我觉得我真的很愚蠢。感谢您的帮助!
【解决方案2】:

由于spacePressed 是一个局部变量,在下一次调用时,它会再次使用false 进行初始化。解决方法:移动到KeyManager类的一个字段中:

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");
            }               
        }
    }

【讨论】:

  • 我建议 OP 使用 !this.spacePressed 而不是 == false
  • 我什至建议 OP 将 if 折叠为 if(e.getKeyCode() == KeyEvent.VK_SPACE && !this.spacePressed){
  • 是的.. 提及代码改进总是好的。
猜你喜欢
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 2020-10-28
  • 2015-08-13
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多