Java 用于从JTextField获取文本的键绑定

Java 用于从JTextField获取文本的键绑定,java,input,key-bindings,Java,Input,Key Bindings,我有一个JTextField,它将在用户提交输入之前保存用户的输入(如控制台Scanner对象)。我的主类有一个从用户获取输入的方法。使用扫描仪对象,这很容易做到:scannerObject.nextLine()。有了这个JTextField,我决定使用键绑定来确定按下Enter键的时间,以便“提交”JTextField的内容。我设置键绑定没有问题,但是我不知道如何让主程序等待,直到按下Enter键来查找文本。如果我使用循环,程序就会卡住,无法注册按键 下面是一个尝试从JTextField获取输

我有一个
JTextField
,它将在用户提交输入之前保存用户的输入(如控制台
Scanner
对象)。我的主类有一个从用户获取输入的方法。使用
扫描仪
对象,这很容易做到:
scannerObject.nextLine()
。有了这个
JTextField
,我决定使用键绑定来确定按下Enter键的时间,以便“提交”
JTextField
的内容。我设置键绑定没有问题,但是我不知道如何让主程序等待,直到按下Enter键来查找文本。如果我使用循环,程序就会卡住,无法注册按键

下面是一个尝试从
JTextField
获取输入的方法:

public static String getStrInput() {
    // Request input
    display.print(">> ");
    needInput = true;
    nextInput = "";

    // Wait until a string is input from the text field
    while (nextInput.isEmpty());    // Wait

    needInput = false;

    return nextInput;
}
下面是在我的键绑定类中按下Enter键时的事件处理程序:

private class SubmitAction extends AbstractAction implements ActionListener {
    /**
     * Makes Java happy.
     */
    private static final long serialVersionUID = 1L;

    /* -- Constructor -- */
    public SubmitAction() {
    }

    /* -- Method -- */

    @Override
    public void actionPerformed(ActionEvent e) {
        if (Game.needInput())
            Game.submitTextField();
    }
}
注意:
submitTextField()
方法只调用
textField.getText()
方法,并将
nextInput
字段(请参见我的第一个方法)设置为返回的字符串

应该发生的是注册输入请求(这是
needInput=true
行),然后按键绑定类应该在按下Enter键时提交文本字段(因为
Game.needInput()
条件现在返回true)。但是,在我的
getStrInput()
方法中,程序在
while(nextInput.isEmpty())中卡住循环。我认为这会发生,但我不知道如何让主程序等待,直到键绑定的事件处理程序让文本字段提交其内容

如果这毫无意义,或者我需要透露更多的代码,我会很高兴地详细说明。我花了一整天的时间来解决这个小问题,只是为了找到挫折感

对于这个JTextField,我决定使用键绑定来确定何时按下Enter键以“提交”JTextField的内容

实际上,您应该向文本字段添加一个ActionListener。按下Enter键时将调用ActionListener


如果您想提示并等待输入文本,那么您应该使用
作业窗格

游戏不应该主动等待其他动作侦听器告诉它有输入;游戏应该设置自己的动作侦听器,并被动地等待调用该侦听器。@KevinAnderson这听起来是个好主意。你能提供一些关于如何做到这一点的见解吗?我对事件处理程序和动作侦听器非常缺乏经验。我不敢相信我没有想到
JOptionPane
。对于我正在制作的这个简单的程序来说,这可能就足够了。不过,在将来,您会如何建议等待输入文本?
但是,在将来,您会如何建议等待输入文本?
-您让它变得太复杂了。这是正确的解决办法。JOptionPane就是为此而设计的。@elektrikpulse61,很高兴这个建议有帮助。别忘了点击复选标记“接受”答案,这样人们就知道问题已经解决了。好的。我想这是有道理的,但我仍然想知道如何等待文本输入。我认为,与弹出窗口相比,内置输入框可以让程序看起来更好,但我非常感谢您的回复。我一定要检查那个箭头。@elektrikpulse61,
我认为它通过自己的内置输入框而不是弹出窗口来让程序看起来更漂亮
——这不是GUI的工作方式。想象一下有登录名的应用程序,因此需要输入用户ID/密码。用户通过单击按钮指示他们已完成数据输入。你不需要一个“弹出窗口”,但你需要一个按钮。然后将ActionListener添加到按钮(以及我已经说过的文本字段)。然后,当用户完成后,他们单击按钮,您的过程继续。这就是事件驱动处理的方式。