Libgdx 使用 ClickListener 记录错误的整数

Libgdx logging wrong integer with ClickListener

我的 libgdx ClickListener 有问题。

当我初始化我的按钮并在 forloop 中为每个按钮添加一个新的 ClickListener 时,所有按钮都会记录 forloop 中的最后一个 Int 而不是我创建它们时使用的数字。

为什么会发生这种情况,解决此问题的最佳方法是什么?

for(i = 0; i<data.getLevelData().size(); i++){
    buttonstyle = new ImageButtonStyle();
    buttonstyle.up = skin.getDrawable("pause-up");
    buttonstyle.down = skin.getDrawable("pause-down");
    buttonstyle.pressedOffsetX = 1; 
    buttonstyle.pressedOffsetY = -1;

        button.add(new ImageButton(buttonstyle));

    button.get(i).addListener(new ClickListener(){
        @Override 
        public void clicked(InputEvent event, float x, float y){
            Gdx.app.log( "test", "" + i);
        }
    });
    table.add(button.get(i)).expandX().pad(3).height(64).width(64);

    rowcounter++;

    if(rowcounter>5){
        table.row();
        rowcounter = 0;
    }
}

我希望有人知道如何解决这个问题,谢谢 reading/helping!

它们都在查看您在 for 循环中初始化的同一个 i。像这样为每个听众制作一份唯一的副本:

final int iCopy = i;
button.get(i).addListener(new ClickListener(){
    @Override 
    public void clicked(InputEvent event, float x, float y){
        Gdx.app.log( "test", "" + iCopy);
    }
});

final 限定符确保值不会从您初始化的值改变。由于 iCopy 的范围在 for 循环内部,而不是像 i 那样在其外部,因此会为每个侦听器创建一个独特的版本。