Java Lanterna - 如何从文本框中获取输入?

时间:2014-04-13 13:41:11

标签: java string user-interface textbox lanterna

我是相对较新的Java程序员(大约两个月的经验),我无法弄清楚如何将数据输入Lanterna(用于创建终端用户界面的库)文本框变成一个字符串供以后使用。

这是我的代码:

//Variables (that I can't seem to populate)
final String usernameIn = null;
final String passwordIn = null;

//Username panel, contains Label and TextBox
Panel username = new Panel(new Border.Invisible(), Panel.Orientation.HORISONTAL);
username.addComponent(new Label("Username: "));
username.addComponent(new TextBox(null, 15));
addComponent(username);

//Password panel, contains label and PasswordBox
Panel password = new Panel(new Border.Invisible(), Panel.Orientation.HORISONTAL);
password.addComponent(new Label("Password: "));
password.addComponent(new PasswordBox(null, 15));
addComponent(password);

//Controls panel, contains Button w/ action
Panel controls = new Panel(new Border.Invisible(), Panel.Orientation.HORISONTAL);
controls.addComponent(new Button("Login", new Action()
{
    public void doAction() {
        MessageBox.showMessageBox(getOwner(), "Alert", "You entered the username " + usernameIn + " and password " + passwordIn + ".");
    }
}));
addComponent(controls);

任何帮助都会非常感激。我已经查看了所有信息,但Lanterna上确实没有多少,而且它是我能找到的唯一允许我制作终端应用程序的最新Java库。 请注意:我知道上面的代码中没有任何内容可以处理输入的数据,我遗漏了所有的尝试,因为它们会导致错误页面上的页面(这是使用错误功能时的预期。

2 个答案:

答案 0 :(得分:2)

我查看了Lanterna代码:TextBox有一个getText()方法。

作为一个想法:

Panel username = new Panel(new Border.Invisible(), Panel.Orientation.HORISONTAL);
username.addComponent(new Label("Username: "));
TextBox userBox = new TextBox(null, 15);
username.addComponent(userBox);
addComponent(username);
// ... and later elsewhere 
usernameIn = userBox.getText();

Shure,您需要对userBox的引用,以便稍后在代码中的其他位置获取内容。

如果值发生了变化,Lanterna还有一个ComponentListener接口来响应:

Panel username = new Panel(new Border.Invisible(), Panel.Orientation.HORISONTAL);
username.addComponent(new Label("Username: "));
TextBox userBox = new TextBox(null, 15);
userBox.addComponentListener(new ComponentListener() {
    void onComponentValueChanged(InteractableComponent component) {
         usernameIn = ((TextBox)component).getText();
    }
});

username.addComponent(userBox);
addComponent(username);

这似乎更清晰。

答案 1 :(得分:0)

addComponent()课程中没有TextBox方法, Lanterna ver3.0.0-beta2 因此,请在readInput()中使用Screen。 下面的示例表示用户按Enter键时,从TextBox获取文本。

private Screen screen;
private TextBox textBox; 
private final String emptyString = "";
...
public String getText() throws IOException {
    String result = null;
    KeyStroke key = null;
    while ((key = screen.readInput()).getKeyType() != KeyType.Enter) {
        textBox.handleKeyStroke(key);
       // use only one of handleInput() or handleKeyStroke() 
        textBox.setText(textBox.getText()); 
    }
    result = textBox.getText();
    textBox.setText(emptyString);
    return result;