Processing 未检测到正在处理按键退格

Processing 未检测到正在处理按键退格,processing,backspace,Processing,Backspace,我正在创建一个具有处理功能的游戏,并希望输入用户名。我知道这不是完美的(第一次处理),我可以写每封信,但是退格不起作用。 这是我的代码: void keyTyped() { if(status("getUsername")) { if(((key >= 'a' && key <= 'z') || (key >= 'A' && key <= 'Z') || (key >= '0' && k

我正在创建一个具有处理功能的游戏,并希望输入用户名。我知道这不是完美的(第一次处理),我可以写每封信,但是
退格
不起作用。
这是我的代码:

void keyTyped() {
  if(status("getUsername")) {
    if(((key >= 'a' && key <= 'z') || (key >= 'A' && key <= 'Z') || (key >= '0' && key <= '9') || key == ' ') && (key != CODED && keyCode != ENTER)) {
      user.addLetter(key);
    } else if(key == CODED && keyCode == BACKSPACE) {
      user.remLetter();
    }
    System.out.println(user.getName());
  }
}
输入

Jon[BACKSPACE]
J
Jo
Jon
Ouptut

Jon[BACKSPACE]
J
Jo
Jon
有人知道我如何解决这个问题吗?或者如何改进我的代码?


我试着使用George Profenza的演示代码,它工作得很好,但当我试着在代码中使用它时,不知什么原因它不起作用。。。



完整的代码:

您可能错过了使用以下工具时的一些小技巧:

对于非ASCII键,请使用keyCode变量。ASCII规范中包含的键(退格、制表符、回车、回车、ESC和删除)无需检查以查看键是否编码,您应该简单地使用
key
变量,而不是
keyCode
如果您正在进行跨平台项目,请注意,在PC和Unix上通常使用ENTER键,而在Macintosh上则使用RETURN键

简单更改:

} else if(key == CODED && keyCode == BACKSPACE) {

此外,您可能希望删除一个字符,而不是两个:

name = name.substring(0, name.length()-2);
只需将其更改为:

name = name.substring(0, name.length() - 1);
下面是一个基本的演示草图,主要基于您的代码:

User user = new User();

void setup(){}

void draw(){
  background(0);
  text(user.name,5,15);
}

boolean status(String s){
  return true;
}

void keyTyped() {
  println(key == CODED, key, BACKSPACE, key == BACKSPACE);
  if(status("getUsername")) {
    if(((key >= 'a' && key <= 'z') || (key >= 'A' && key <= 'Z') || (key >= '0' && key <= '9') || key == ' ') && (key != CODED && keyCode != ENTER)) {
      user.addLetter(key);
    } else if(key == BACKSPACE) {
      user.remLetter();
    }
    System.out.println(user.getName());
  }
}

class User {
  String name = "";

  void addLetter(char letter) {
    this.name = this.name + letter;
  }

  void remLetter() {
    if(name.length() > 0) {
      System.out.println("rem");
      name = name.substring(0, name.length() - 1);
    }
  }
  
  String getName(){
    return name;
  }
}
User User=新用户();
void setup(){}
作废提款(){
背景(0);
文本(用户名,5,15);
}
布尔状态(字符串s){
返回true;
}
void键类型化(){
println(key==CODED,key,BACKSPACE,key==BACKSPACE);
如果(状态(“getUsername”)){
如果((键>='a'&&key='a'&&key='0'&&key 0){
系统输出打印项次(“rem”);
name=name.substring(0,name.length()-1);
}
}
字符串getName(){
返回名称;
}
}
(将来,通过发布可编译的代码片段,让其他人更容易支持您)

更新我尝试了上面发布的github repo,但基于OpenGL的渲染器似乎存在缺陷(
P2D
P3D
):

  • 使用
    P2D
    P3D
    编码键似乎不会触发
    keyTyped()
    ,但是
    keyPressed()
    keyreased()
  • 使用其他渲染:
    JAVA2D
    FX2D
    按预期工作
这似乎是一个问题,但看起来它不会在不久的将来得到解决

就我个人而言,这是我第一次听说
keyTyped()
玩了这么多年的处理:)我习惯于
keyPressed()
/
keyreased()

同时,您至少有两种选择:

  • 如果您真的想使用
    keyTyped()
    请使用
    size(600600,JAVA2D);
    而不是
    size(600600,P2D);
    (希望性能/渲染仍然足够好)
  • 使用
    P2D
    ,但只需将当前在
    keyTyped()
    中的逻辑移到
    keyreased()

  • 您的演示草图可以工作,但当我只按backspace按钮时,什么也没有发生,它甚至没有将键注册为我的草图工作的TypedRange。如果您在
    KeyType()函数中添加
    println(key,keyCode);
    ,它会打印任何内容吗?另外,我假设您的代码中有一个
    draw()
    函数,对吗?(否则将不会有键/鼠标事件)我只是使用了一个
    println(“键入的”)
    当我按下
    BACKSPACE
    时它不会打印“键入的”。你可以在Github上查看我的代码(在我的问题中添加了链接)如果你想帮忙me@BeeTheKay回购协议中的代码大多组织得很好,格式也很好:做得很好!幸运的是:您似乎在
    keyTyped()
    P2D
    :)中遇到了一个bug。请参见上面更新的答案。