Libgdx使用ClickListener

时间:2015-07-30 17:02:21

标签: java button libgdx

我的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;
    }
}

我希望有人知道如何解决这个问题,以便阅读/帮助!

1 个答案:

答案 0 :(得分:0)

他们都在查看您在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-loop中具有范围而不是像i那样在其外部,因此为每个侦听器创建了它的唯一版本。