Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
方法内的JavaFX EventHandler-不返回更新的字符串_Java_Javafx_Keyboard Events - Fatal编程技术网

方法内的JavaFX EventHandler-不返回更新的字符串

方法内的JavaFX EventHandler-不返回更新的字符串,java,javafx,keyboard-events,Java,Javafx,Keyboard Events,我正在JavaFXGUI中创建一个文本冒险游戏。我在文本对象中显示询问用户姓名的问题,然后在其下方显示一个文本字段,供用户键入姓名。这些对象位于Vbox中。当用户按enter键时,我使用事件处理程序从TextField获取文本。一旦给出了名字和姓氏,文本对象应该是这样的,下面是清除的文本字段 你的名字是什么? 乔 你姓什么? 布洛格斯 欢迎 在用户输入他们的姓氏之前,此操作一直正常。它不会像在名字下面那样在下面添加姓氏,而是将姓氏更改为姓氏,并且不会添加姓氏或下一行(欢迎…: 你的名字是什么?

我正在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);