TextInputListener 字符串到 Label
TextInputListener string into Label
我看了一下 https://github.com/libgdx/libgdx/wiki/Simple-text-input,我想要的是将其中一个对话框中输入的文本放入标签中。我用这种方式得到了空指针:
public class TextInputListener implements Input.TextInputListener {
public String name, year;
@Override
public void input(String text) {
name = "Enter some text.."+ text ;
}
@Override
public void canceled() {
name = "canceled by user";
}
}
然后我有一个打开对话框的按钮:
btnEdit.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
TextInputListener listener = new TextInputListener();
Gdx.input.getTextInput(listener, "Enter information", "Name:");
}
});
然后我尝试将该字符串接收到我的标签中:
Label nameLabel = new Label(listener.name, labelstyle);
正如我所说,我在最后一行说 "Attempt to read from field 'TextInputListener.name' on a null object reference" 时得到空指针。但我确保输入一些文本并按 enter/ok。
您从未在 TextInput 侦听器中设置名称字符串。
Gdx.input.getTextInput(listener, "Enter information", "Name:");
我认为这不是使用输入设置字符串,也不是在用户实际键入输入之前调用 new Label(listener.name, labelstyle);
。
尝试将 TextInputListener 更改为
public class TextInputListener implements Input.TextInputListener {
public String name = "Enter some text..";
public String year;
@Override
public void input(String text) {
name = "Enter some text.."+ text ;
}
@Override
public void canceled() {
name = "canceled by user";
}
如果这不起作用,请尝试检查用户是否输入了文本,然后调用 Label nameLabel = new Label(listener.name, labelstyle);
我觉得有两个问题
首先是当你用一个String对象创建一个Label时,当String值改变时Label不会自动改变。至少我没有让它工作。所以你必须手动调用 setText(String str)
方法。但为此,您需要访问 Label 对象。
第二个是,您使用 listener.name
创建标签,但您是在 changed(ChangeEvent event, Actor actor)
方法中创建侦听器对象,因此如果您不在该方法中创建标签,则侦听器会为空。
所以对于代码你必须设置如下:
public class TextInputListener implements Input.TextInputListener {
private Label label;
public TextInputListener(Label targetLabel) {
label = targetLabel;
}
@Override
public void input(String text) {
label.setText("Enter some text.."+ text);
}
@Override
public void canceled() {
label.setText("canceled by user");
}
}
在您的 GUI 创建方法中的某处:
private TextInputListener listener; // Class field
...
Label nameLabel = new Label("", labelstyle);
listener = new TextInputListener(nameLabel);
btnEdit.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
Gdx.input.getTextInput(listener, "Enter information", "Name:", ""); // My Gdx version needed a third parameter
}
});
...
我看了一下 https://github.com/libgdx/libgdx/wiki/Simple-text-input,我想要的是将其中一个对话框中输入的文本放入标签中。我用这种方式得到了空指针:
public class TextInputListener implements Input.TextInputListener {
public String name, year;
@Override
public void input(String text) {
name = "Enter some text.."+ text ;
}
@Override
public void canceled() {
name = "canceled by user";
}
}
然后我有一个打开对话框的按钮:
btnEdit.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
TextInputListener listener = new TextInputListener();
Gdx.input.getTextInput(listener, "Enter information", "Name:");
}
});
然后我尝试将该字符串接收到我的标签中:
Label nameLabel = new Label(listener.name, labelstyle);
正如我所说,我在最后一行说 "Attempt to read from field 'TextInputListener.name' on a null object reference" 时得到空指针。但我确保输入一些文本并按 enter/ok。
您从未在 TextInput 侦听器中设置名称字符串。
Gdx.input.getTextInput(listener, "Enter information", "Name:");
我认为这不是使用输入设置字符串,也不是在用户实际键入输入之前调用 new Label(listener.name, labelstyle);
。
尝试将 TextInputListener 更改为
public class TextInputListener implements Input.TextInputListener {
public String name = "Enter some text..";
public String year;
@Override
public void input(String text) {
name = "Enter some text.."+ text ;
}
@Override
public void canceled() {
name = "canceled by user";
}
如果这不起作用,请尝试检查用户是否输入了文本,然后调用 Label nameLabel = new Label(listener.name, labelstyle);
我觉得有两个问题
首先是当你用一个String对象创建一个Label时,当String值改变时Label不会自动改变。至少我没有让它工作。所以你必须手动调用 setText(String str)
方法。但为此,您需要访问 Label 对象。
第二个是,您使用 listener.name
创建标签,但您是在 changed(ChangeEvent event, Actor actor)
方法中创建侦听器对象,因此如果您不在该方法中创建标签,则侦听器会为空。
所以对于代码你必须设置如下:
public class TextInputListener implements Input.TextInputListener {
private Label label;
public TextInputListener(Label targetLabel) {
label = targetLabel;
}
@Override
public void input(String text) {
label.setText("Enter some text.."+ text);
}
@Override
public void canceled() {
label.setText("canceled by user");
}
}
在您的 GUI 创建方法中的某处:
private TextInputListener listener; // Class field
...
Label nameLabel = new Label("", labelstyle);
listener = new TextInputListener(nameLabel);
btnEdit.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
Gdx.input.getTextInput(listener, "Enter information", "Name:", ""); // My Gdx version needed a third parameter
}
});
...