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
        }


    });

    ...