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添加到按钮(以及我已经说过的文本字段)。然后,当用户完成后,他们单击按钮,您的过程继续。这就是事件驱动处理的方式。