如何通过调用其settext方法修改Lable信息的文本?
对于例如根据按下的按钮,我想适当地设置标签的文本
我尝试访问标签时收到此错误:
不能在不同的内部类中引用非final变量i
方法
Skin skin = new Skin(Gdx.files.internal("uiskin.json"));
stage = new Stage();
Gdx.input.setInputProcessor(stage);
table = new Table();
table.setFillParent(true);
stage.addActor(table);
String sentence = "One two three four five six seven eight";
String[] temp = sentence.split(" ");
ArrayList<String> words = new ArrayList<String>(Arrays.asList(temp));
info = new Label( "Welcome to Android!", skin );
for(int i=0; i<words.size();i++)
{
TextButton button = new TextButton( words.get(i), skin);
table.add(button);
button.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
Gdx.app.log("button","clicked");
//info.setText(Integer.toString(i)); How to make this work?
//also how do I know which button is pressed?
};
});
}
table.row();
table.add(info);
Gdx.input.setInputProcessor(stage);
解决方法:
William Morrison列出了许多可以创建ClickListeners的方法.我更喜欢自己的匿名类方法,我发现这是你问题中使用的方法.
您需要在匿名类final之外进行所有引用,以便您可以在其中引用它们.这就是java确保引用不会改变的方式.查看我的代码(和注释)以获得完整的解决方案,我只需要改变一些事情. (我的皮肤文件也位于’skin / uiskin.json’,所以如果你想使用这个代码,请记住这一点).
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ClickTest implements ApplicationListener {
private Stage stage;
private Skin skin;
@Override public void create() {
Gdx.app.log("CREATE", "App Opening");
this.skin = new Skin(Gdx.files.internal("skin/uiskin.json"));
stage = new Stage();
Gdx.input.setInputProcessor(stage);
Table table = new Table();
table.setFillParent(true);
stage.addActor(table);
String sentence = "One two three four five six seven eight";
String[] temp = sentence.split(" ");
List<String> words = new ArrayList<String>(Arrays.asList(temp));
final Label info = new Label("Welcome to Android!", skin);
for (int i = 0; i < words.size(); i++) {
// make i final here so you can reference it inside
// the anonymous class
final int index = i;
TextButton button = new TextButton(words.get(i), skin);
table.add(button);
button.addListener(new ClickListener() {
@Override public void clicked(InputEvent event, float x, float y) {
// When you click the button it will print this value you assign.
// That way you will know 'which' button was clicked and can perform
// the correct action based on it.
Gdx.app.log("button", "clicked " + index);
info.setText(Integer.toString(index));
};
});
}
table.row();
// Changed this so it actually centers the label.
table.add(info).colspan(words.size()).expandX();
Gdx.input.setInputProcessor(stage);
Gdx.gl20.glClearColor(0f, 0f, 0f, 1);
}
@Override public void render() {
this.stage.act();
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
Gdx.gl20.glEnable(GL20.GL_BLEND);
this.stage.draw();
}
@Override public void dispose() {
Gdx.app.log("DISPOSE", "App Closing");
}
@Override public void resize(final int width, final int height) {
Gdx.app.log("RESIZE", width + "x" + height);
Gdx.gl20.glViewport(0, 0, width, height);
this.stage.setViewport(width, height, false);
}
@Override public void pause() { }
@Override public void resume() { }
}