Java 向表格单元格LibGDX添加加号/减号按钮

Java 向表格单元格LibGDX添加加号/减号按钮,java,layout,libgdx,scene2d,Java,Layout,Libgdx,Scene2d,我正在寻找一种在LibGDX中向表格单元格添加加号和减号按钮的方法。 我试着做一些像这样的事情: 我注意到我正在使用的uiskin文件包含加号和减号按钮(就在复选框旁边),这些按钮可以正常工作() 关于如何将它们添加到表中并使其增加/减少该表单元格中的整数值,有什么提示吗 我添加了一个基本的示例代码,说明了我要做的事情: @Override public void create() { Stage stage = new Stage(); Skin skin = new Ski

我正在寻找一种在LibGDX中向表格单元格添加加号和减号按钮的方法。 我试着做一些像这样的事情:

我注意到我正在使用的uiskin文件包含加号和减号按钮(就在复选框旁边),这些按钮可以正常工作()

关于如何将它们添加到表中并使其增加/减少该表单元格中的整数值,有什么提示吗

我添加了一个基本的示例代码,说明了我要做的事情:

@Override
public void create() {
    Stage stage = new Stage();
    Skin skin = new Skin(Gdx.files.internal("skins/uiskin.json"));

    Table table = new Table(skin);
    table.setPosition(Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 2);
    for(int i = 0; i < 10; i++){
        table.add(Integer.toString(i)); //Somehow add plus/minus buttons left 
                                        //and right that increase/decrease the integer value
        table.row();
    }

    stage.addActor(table);

    Gdx.input.setInputProcessor(stage);
}


@Override
public void render() {
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    stage.act(Gdx.graphics.getDeltaTime());
    stage.draw();
}
@覆盖
公共void create(){
阶段=新阶段();
皮肤=新皮肤(Gdx.files.internal(“skins/uiskin.json”);
表=新表(皮肤);
table.setPosition(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2);
对于(int i=0;i<10;i++){
table.add(Integer.toString(i));//以某种方式在左侧添加加号/减号按钮
//右键,增加/减少整数值
table.row();
}
阶段。加法器(表);
Gdx.input.setInputProcessor(阶段);
}
@凌驾
公共无效呈现(){
glClearColor(0,0,0,1);
Gdx.gl.glClear(GL20.gl\u颜色\u缓冲\u位);
stage.act(Gdx.graphics.getDeltaTime());
stage.draw();
}
这只是一些示例代码,但如果它在这里起作用,我肯定能够理解它


谢谢

首先,您需要一个数组来存储数值。使用视图(表格单元格)存储模型(数值)不是一种好的做法,此外,标签单元格存储的是字符串,而不是整数,因此不方便

private int[] tableData = new int[10];
现在,您需要一个可以与数据中的行关联的按钮。下面是创建ImageButton子类的一种方法,该子类可以采用行号和模式(减法或加法)

您正在使用的uiskin地图集中的加号和减号图像称为“树减号”和“树加号”。对于使用其中一个作为
imageUp
属性的每个按钮,都需要一个ImageButton样式。(
imageUp
是默认值,如果您没有为其他状态定义图像,例如
imageDown
),您可以将这些添加到uiskin.json:

com.badlogic.gdx.scenes.scene2d.ui.ImageButton$ImageButtonStyle:{
plus:{down:default round down,up:default round,imageUp:tree plus},
减号:{向下:默认向下取整,向上:默认向下取整,图像向上:树减号}
},
现在您可以为这些按钮创建一个ChangeListener,它将修改数据中的数字并相应地更新表。然后把一切都安排好:

Stage stage = new Stage();
Skin skin = new Skin(Gdx.files.internal("skins/uiskin.json"));

final Table table = new Table(skin);
final Label[] labels = new Label[tableData.length]; //keep references to the labels for updating them.

final ChangeListener incrementListner = new ChangeListener() {
    @Override
    public void changed(ChangeEvent event, Actor actor) {
        IncrementButton incrementButton = (IncrementButton)actor;
        int row = incrementButton.rowNumber;
        tableData[row] += incrementButton.decrement ? -1 : 1;
        labels[row].setText(Integer.toString(tableData[row]));
    }
};

table.setPosition(Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 2);
for(int i = 0; i < tableData.length; i++){
    IncrementButton decrementButton = new IncrementButton(skin, "minus", i, true);
    decrementButton.addListener(incrementListner);
    IncrementButton incrementButton = new IncrementButton(skin, "plus", i, false);
    incrementButton.addListener(incrementListner);

    table.add(decrementButton);
    labels[i] = table.add(Integer.toString(i)).getActor();//Add number label and keep reference to it in labels array for the change listener to look up
    table.add(incrementButton);
    table.row();
}

stage.addActor(table);

Gdx.input.setInputProcessor(stage);
Stage阶段=新阶段();
皮肤=新皮肤(Gdx.files.internal(“skins/uiskin.json”);
最终表格=新表格(皮肤);
最终标签[]标签=新标签[tableData.length]//保留对标签的引用以进行更新。
final ChangeListener incrementListner=新的ChangeListener(){
@凌驾
公共无效已更改(ChangeEvent事件、参与者){
IncrementButton IncrementButton=(IncrementButton)参与者;
int行=incrementButton.rowNumber;
tableData[行]+=递增按钮。递减?-1:1;
labels[row].setText(Integer.toString(tableData[row]);
}
};
table.setPosition(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2);
对于(int i=0;i

如果要为数据设置最小值和最大值,则需要一些加号按钮和减号按钮的数组(类似于
标签
数组),以便更改侦听器可以在达到限制时查找并相应地禁用/启用按钮。

首先,需要创建2个
ImageButton
,比如说
minusButton
plusbbutton
。只需看看这些图片,看看如何从你的皮肤中创建它们。然后,您只需要将这些按钮添加到表中:
table.add(plusButton)
表格。添加(减号按钮)
@vdlmrc我已经试过了,但有两个问题:1)uiskin似乎没有检索这些按钮的方法(例如,您可以调用复选框来获取复选框,但我在文件描述中找不到任何加号/减号按钮的引用),以及2)如果我创建自己的按钮并将其添加到表中,然后我找不到一种方法来引用它旁边的单元格。。。
Stage stage = new Stage();
Skin skin = new Skin(Gdx.files.internal("skins/uiskin.json"));

final Table table = new Table(skin);
final Label[] labels = new Label[tableData.length]; //keep references to the labels for updating them.

final ChangeListener incrementListner = new ChangeListener() {
    @Override
    public void changed(ChangeEvent event, Actor actor) {
        IncrementButton incrementButton = (IncrementButton)actor;
        int row = incrementButton.rowNumber;
        tableData[row] += incrementButton.decrement ? -1 : 1;
        labels[row].setText(Integer.toString(tableData[row]));
    }
};

table.setPosition(Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 2);
for(int i = 0; i < tableData.length; i++){
    IncrementButton decrementButton = new IncrementButton(skin, "minus", i, true);
    decrementButton.addListener(incrementListner);
    IncrementButton incrementButton = new IncrementButton(skin, "plus", i, false);
    incrementButton.addListener(incrementListner);

    table.add(decrementButton);
    labels[i] = table.add(Integer.toString(i)).getActor();//Add number label and keep reference to it in labels array for the change listener to look up
    table.add(incrementButton);
    table.row();
}

stage.addActor(table);

Gdx.input.setInputProcessor(stage);