Processing keyTyped()在处理GUI中工作,但在浏览器中不工作

Processing keyTyped()在处理GUI中工作,但在浏览器中不工作,processing,Processing,我在做的程序有问题。当我使用Processing GUI运行它时,它可以正常工作,但由于某些原因,当我使用Processing.js将它添加到网页时,它将无法工作。我的问题是永远不会调用keyTyped。我试过摆弄它,但唯一有效的方法是将它添加到绘图中: if(keyPressed) { <code to add key to string> } 然而,这几乎不起作用,更不用说效果了。一定有更好的办法。这是我的整个计划: String[] chat = new String[0

我在做的程序有问题。当我使用Processing GUI运行它时,它可以正常工作,但由于某些原因,当我使用Processing.js将它添加到网页时,它将无法工作。我的问题是永远不会调用keyTyped。我试过摆弄它,但唯一有效的方法是将它添加到绘图中:

if(keyPressed) {
  <code to add key to string>
}
然而,这几乎不起作用,更不用说效果了。一定有更好的办法。这是我的整个计划:

String[] chat = new String[0];
boolean loggedIn = false;
String username = "";
String query = "";
int t = 0;
String timeStamp() {
  String hr, mn, se;
  if (hour() < 10) {
    hr = "0" + hour();
  } else {
    hr = hour() + "";
  }
  if (minute() < 10) {
    mn = "0" + minute();
  } else {
    mn = minute() + "";
  }
  if (second() < 10) {
    se = "0" + second();
  } else {
    se = second() + "";
  }
  return "[" + hr + ":" + mn + ":" + se + " ";
}
void addLocalMessage(String msg, String file) {
  if (!file.equals("")) {
    String[] file_temp = append(loadStrings(file), timeStamp() + msg);
    saveStrings(file, file_temp);
  } else {
    String[] chat_temp = append(chat, timeStamp() + msg);
    chat = chat_temp;
  }
}
void addGlobalMessage(String msg) {
  String[] users = loadStrings("users.txt");
  for (int i = 0; i < users.length; i++) {
    addLocalMessage(msg, users[i].split(" ")[0] + ".txt");
  }
}
void attempt(String q) {
  if (!q.substring(0, min(1, q.length())).equals(".")) {
    if (loggedIn) {
      if (q.length() > 0) {
        addGlobalMessage("CHAT] " + username + ": " + q);
      } else {
        addLocalMessage("ERROR] Message length must be greater than 0.", username + ".txt");
      }
    } else {
      addLocalMessage("ERROR] Access denied.", "");
    }
  } else if (q.substring(0, min(6, q.length())).equals(".login")) {
    if (!loggedIn) {
      String[] users = loadStrings("users.txt");
      String[][] UPCombos = new String[users.length][2];
      for (int i = 0; i < users.length; i++) {
        UPCombos[i][0] = split(users[i], " ")[0];
        UPCombos[i][1] = split(users[i], " ")[1];
      }
      String[] withArgs = q.split(" ");
      if (withArgs.length == 3) {
        for (int i = 0; i < users.length; i++) {
          if (UPCombos[i][0].equals(withArgs[1]) && UPCombos[i][1].equals(withArgs[2])) {
            loggedIn = true;
            username = withArgs[1];
            addLocalMessage("SERVER] Logged in successfully as " + username, username + ".txt");
          }
        } 
        if (!loggedIn) {
          addLocalMessage("ERROR] Password is invalid.", "");
        }
      } else {
        addLocalMessage("ERROR] Arguments count is incorrect. Please enter as: .login <username> <password>.", "");
      }
    } else {
      addLocalMessage("ERROR] You are already logged in.", username + ".txt");
    }
  } else {
    addLocalMessage("ERROR] Not supported", "");
  }
}
void setup() {
  size(1200, 600);
  chat = new String[0];
  frameRate(10);
  addLocalMessage("SERVER] Running MSG123 v0.0.9", "");
  addLocalMessage("ERROR] You are not logged in. Please log in with .login <username> <password>.", "");
}
void draw() {
  if(keyPressed) {
    addLocalMessage("You typed something", "");
    if(key == ENTER) {
      attempt(query);
      query = "";
    } else if(key == BACKSPACE) {
      query = query.substring(0, max(0, query.length() - 1));
    } else {
      query += key;
    }
  }
  background(127, 127, 255);
  textSize(10);
  fill(0, 0, 0);
  if (loggedIn) {
    chat = loadStrings(username + ".txt");
  }
  if (chat.length < 40) {
    for (int i = 0; i < chat.length; i++) {
      text(chat[i], 5, i*15 + 15);
    }
  } else {
    int pos = 0;
    for (int i = chat.length - 39; i < chat.length; i++) {
      text(chat[i], 5, pos*15 + 15);
      pos++;
    }
  }
  text(query, 5, 595);
}
void keyTyped() {
  if(key == ENTER) {
    attempt(query);
    query = "";
  } else if(key == BACKSPACE) {
    query = query.substring(0, max(0, query.length() - 1));
  } else {
    query = query + key;
  }
}

我希望有人能帮助我。我没有为处理JS编写太多的代码,所以我真的不知道我在做什么:P magic

如果你想做密钥处理,你需要非常小心。在这种情况下,对于enter检查,您可能需要执行以下操作:

if (int(key) == 13) {
  ...
}
对于退格键或您正在测试的任何其他键,使用类似的方法。有一些技术限制阻止JS和Java做完全相同的事情,上面的链接将解释所有这些限制

此外,由于JavaScript的工作方式,Pjs不能使用相同的名称来执行变量和函数,请参见。对于按键Pjs,Pjs提供了事件处理函数,但没有相同的命名布尔值

解决此问题的一个简单方法是使用您自己的:

boolean flipScreen = false;

void setup() {
  size(500,500);
  // no need to waste cpu cycles:
  noLoop();
}

void draw() {
  background(flipScreen? 255 : 0);
  // gets retriggered based on user events
}

void keyPressed() {
  flipScreen= true;
  redraw();
}

void keyReleased() {
  flipScreen= false;
  redraw();
}

这还有一个好处,就是根据实际使用的变量来命名变量,这在编程中几乎是通用的惯例。

您是否测试过按键或按键释放?“keyTyped”一开始甚至没有被调用。我使用几个我知道在该方法中工作的函数来测试它。这让我发疯了…如果你在里面放了一个println或什么东西,你应该看到它在打印;它存在并且在技术上运行良好,但特别是对于您遇到的按键操作-我添加了更多的代码来演示如何在这种情况下绕过它。keyTyped只是没有被调用。我试着在里面放一个PrintLString,但它没有出现在控制台上。这很奇怪-一个快速的jsbin显示它在-哪个版本的Pjs被用于你的草图上-我不知道我在使用哪个版本,但我知道我可以去下载最新的版本,看看是否有帮助。。。