键盘输入在Processing中显示两次

时间:2015-06-02 11:20:47

标签: keyboard processing keypress

我正在整理一个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;
        }
      //}
    }

1 个答案:

答案 0 :(得分:0)

对您的问题的简短回答是,您应该使用key变量来检查BACKSPACETABENTERRETURN,{{ 1}}和ESC,而不是您正在做的DELETE变量。

如需更长的解释,请参阅您的计划的简化MCVE

keyCode

运行它并且您会看到类似的问题,并且您会看到它发生的原因:您为大多数键输入了两个不同的条件,因为您的逻辑是确定不同的密钥是错误的。

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

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

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

然后逻辑的后半部分打印出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. 变量的值,即使您已经在上面的if语句中处理过它。

解决方案是正确区分编码密钥和未编码密钥,然后使用key变量检查keyENTERRETURN等值: / p>

BACKSPACE

有关详情,请务必查看the reference