键盘输入在处理中显示两次

Keyboard input is displaying twice in Processing

我正在整理一个 Processing sketch,用户通过键盘输入文本,文本被保存到文本文件并打印,稍后它被处理并以 PNG 格式保存到 Tumblr 帐户。我有一个 keyPressed 事件初始化保存为文本文件等。当用户按下 CONTROL 键时,它会执行它的操作并循环到下一个屏幕。

我想将其更改为使用 RETURN 或 ENTER 键,因为我认为这会更直观。由于 RETURN 不是编码键,我取出部分来检查按下的键是否被编码,从那时起我键入的每个键都会显示两次,但 RETURN 可以保存文本文件和前进等.

如果我离开检查密钥是否已编码。文本显示正常,但按 RETURN 键不会初始化保存为文本文件等。这可能真的很简单,我已经看了太久了 - 但我真的看不出在哪里问题是。任何帮助将不胜感激。谢谢

下面的相关代码:

    void keyPressed() {
      if (keyCode == BACKSPACE) {
        if (yourText.length() > 0) {
          yourText = yourText.substring(0, yourText.length()-1);
        }
          } else if (keyCode == DELETE) {
            yourText = "";
          } else if (keyCode != SHIFT && keyCode != CONTROL && keyCode != RETURN && keyCode != ENTER && keyCode != ALT) {
            myText = "";
            yourText = yourText + key;
          }

      // If the Return key is pressed save the String and write it to text file
        //if (key == CODED) 
        //{
        if (key == RETURN || key == ENTER)  {
          savedText = yourText;
          textFile = createWriter("stories/"+timestamp()+".txt");
          textFile.println(savedText);
          textFile.flush();
          textFile.close();
          rect (0,0,width, height); //PROBLEM sometimes visible when screen is switched.
          noStroke ();
          currentScreen++;
      if (currentScreen > 2) { currentScreen = 0; } //switches to next screen

      } 

     else {
          // Otherwise, concatenate the String
          // Each character typed by the user is added to the end of the String variable.
          yourText = yourText + key;
        }
      //}
    }

对您的问题的简短回答是,您应该使用 key 变量来检查 BACKSPACETABENTERRETURNESCDELETE,而不是像您正在做的 keyCode 变量。

为了获得更长的解释,这里是您程序的简化 MCVE

void draw() {
  background(0);
}

void keyPressed() {
  if (keyCode == BACKSPACE) {
    println("1: backspace");
  } else if (keyCode == DELETE) {
    println("2: delete");
  } else if (keyCode != SHIFT && keyCode != CONTROL && keyCode != RETURN && keyCode != ENTER && keyCode != ALT) {
    println("3: " + key);
  }

  if (key == RETURN || key == ENTER) {
    println("4: return");
  } else {
    println("5: " + key);
  }
}

运行 然后你会看到一个类似的问题,你会明白为什么会这样:你为大多数键输入了两个单独的条件,因为你确定不同键的逻辑是错了。

你的前半部分逻辑是这样的:

Is the keyCode BACKSPACE? If so do something.
Otherwise, is the keyCode DELETE? If so do something.
Otherwise, is the keyCode ANYTHING ELSE other than SHIFT, CTRL, RETURN, ENTER, or ALT? If so do something.

问题是,任何未编码的密钥都会进入第 3 个 else/if 语句。

你的逻辑的后半部分然后打印出 key 变量的值,即使你已经在上面的 if 语句中处理了它。

解决方案是正确区分编码键和未编码键,然后使用 key 变量检查 ENTERRETURNBACKSPACE 等值:

void draw() {
  background(0);
}

void keyPressed() {

  if (key==CODED) {
    if (keyCode == SHIFT){println("shift");}
    else if(keyCode == CONTROL){println("ctrl");}
    else if(keyCode == ALT) {println("alt");}
  } else {
    if (key == BACKSPACE) {
      println("1: backspace");
    } else if (key == DELETE) {
      println("2: delete");
    } else if (key == RETURN || key == ENTER) {
      println("4: return");
    } else {
      println("5: " + key);
    }
  }
}

有关详细信息,请始终查看 the reference