方法内的JavaFX EventHandler-不返回更新的字符串
我正在JavaFXGUI中创建一个文本冒险游戏。我在文本对象中显示询问用户姓名的问题,然后在其下方显示一个文本字段,供用户键入姓名。这些对象位于Vbox中。当用户按enter键时,我使用事件处理程序从TextField获取文本。一旦给出了名字和姓氏,文本对象应该是这样的,下面是清除的文本字段 你的名字是什么?方法内的JavaFX EventHandler-不返回更新的字符串,java,javafx,keyboard-events,Java,Javafx,Keyboard Events,我正在JavaFXGUI中创建一个文本冒险游戏。我在文本对象中显示询问用户姓名的问题,然后在其下方显示一个文本字段,供用户键入姓名。这些对象位于Vbox中。当用户按enter键时,我使用事件处理程序从TextField获取文本。一旦给出了名字和姓氏,文本对象应该是这样的,下面是清除的文本字段 你的名字是什么? 乔 你姓什么? 布洛格斯 欢迎 在用户输入他们的姓氏之前,此操作一直正常。它不会像在名字下面那样在下面添加姓氏,而是将姓氏更改为姓氏,并且不会添加姓氏或下一行(欢迎…: 你的名字是什么?
乔 你姓什么?
布洛格斯 欢迎 在用户输入他们的姓氏之前,此操作一直正常。它不会像在名字下面那样在下面添加姓氏,而是将姓氏更改为姓氏,并且不会添加姓氏或下一行(欢迎…: 你的名字是什么?
布洛格斯 你姓什么?
我在start()方法中创建TextField和Text对象,并将它们作为参数传递给一个新类,该类启动游戏:
game = new Game();
game.play(textField, text, vbox);
public class Game {
private String firstname;
private String surname;
private TextProcessing textProcessing;
private String currentText;
private String nextText;
public Game() {
firstname = "";
surname = "";
textProcessing = new TextProcessing();
currentText = "";
nextText = "";
}
public void play(TextField textField, Text text, VBox vbox) {
//Get the user's first name.
text.setText("What is your first name?");
currentText = text.getText();
nextText = "\nWhat is your surname?";
firstname = textProcessing.processText(textField, text,
currentText, nextText, vbox);
//Get the user's last name.
if(!firstname.equals("")) {
currentText = text.getText();
nextText = "\nWelcome!";
surname = textProcessing.processText(textField, text,
currentText, nextText, vbox);
}
}
}
public class TextProcessing {
private String userInput;
private String textToDisplay;
public TextProcessing() {
userInput = "";
textToDisplay = "";
}
public String processText(TextField textField, Text text, String
currentText, String nextText, VBox vbox) {
textField.setOnKeyPressed(new EventHandler<KeyEvent>() {
public void handle(KeyEvent key) {
if (key.getCode() == KeyCode.ENTER) {
vbox.getChildren().remove(text);
userInput = textField.getText();
textToDisplay = currentText + "\n" + userInput + "\n" +
nextText;
textField.clear();
text.setText(textToDisplay);
vbox.getChildren().add(text);
vbox.getChildren().remove(textField);
vbox.getChildren().add(textField);
}
}
});
return userInput;
}
game=新游戏();
game.play(文本字段、文本、vbox);
公开课游戏{
私有字符串名;
私家姓;
私有文本处理;
私有字符串文本;
私有字符串nextText;
公共游戏(){
firstname=“”;
姓氏=”;
textProcessing=新的textProcessing();
currentText=“”;
nextText=“”;
}
公共无效播放(文本字段文本字段,文本文本,VBox VBox){
//获取用户的名字。
setText(“你的名字是什么?”);
currentText=text.getText();
nextText=“\n您姓什么?”;
firstname=textProcessing.processText(textField,text,
currentText、nextText、vbox);
//获取用户的姓氏。
如果(!firstname.equals(“”){
currentText=text.getText();
nextText=“\n欢迎!”;
姓氏=textProcessing.processText(textField,text,
currentText、nextText、vbox);
}
}
}
公共类文本处理{
私有字符串用户输入;
私有字符串文本显示;
公共文本处理(){
用户输入=”;
textToDisplay=“”;
}
公共字符串processText(TextField TextField,Text Text,String
当前文本、字符串nextText、VBox VBox){
setOnKeyPressed(新的EventHandler(){
公共无效句柄(KeyEvent密钥){
if(key.getCode()==KeyCode.ENTER){
vbox.getChildren().remove(文本);
userInput=textField.getText();
textToDisplay=currentText+“\n”+用户输入+“\n”+
nextText;
textField.clear();
text.setText(textToDisplay);
vbox.getChildren().add(文本);
vbox.getChildren().remove(textField);
vbox.getChildren().add(textField);
}
}
});
返回用户输入;
}
游戏类中的firstname字段未被
firstname=textProcessing.processText(textField,text,currentText,nextText,vbox);语句,因此if语句从来都不是真的。我认为我可能无法理解EventHandler的工作原理-我希望它执行一次并返回更新后的值,然后在调用姓氏=textProcessing.processText时再次执行它(textField,text,currentText,nextText,vbox);我花了好几个小时在这个问题上,并尝试搜索可能对我有帮助的问题,但我就是不知道如何使它起作用。如果能在这方面提供任何帮助,我将不胜感激。什么是
textProcessing.processText()
做的?我已经包括了processText()方法,它位于我代码底部的TextProcessing类中。谢谢。我确信,当您调用姓氏=TextProcessing.processText(textField,text,currentText,nextText,vbox)时;
您传递了对姓氏文本的引用,而不是对名字文本的引用。我没有这样做。如果到目前为止一切正常,它应该传递姓氏=textProcessing.processText(textField,text,“您的名字是什么?\nJoe\n您的姓氏是什么?”,“\nWelcome”,vbox);