Java 带有复选框作为渲染组件的Vaadin 14栅格

Java 带有复选框作为渲染组件的Vaadin 14栅格,java,grid,vaadin,Java,Grid,Vaadin,我创建了一个有四列的网格。第一列显示名称,其他三列表示不同的角色。这三列中的每一列都用复选框填充,以便将特定角色分配给特定名称。这是我迄今为止所能做到的。 在每列和每行中,只允许有一个选中的复选框。因此,总的来说,我每个复选框列只有一个选择。如何实现这一点?编辑:我意识到我可能完全误解了这个问题。如果希望有3列,并且每列都有多个复选框,其中每列只能选择1个复选框,那么应该在每列中使用一个,并将每个列绑定到griditem类的不同枚举字段 我将以不同的方式显示,以获得关于该项目的相同信息,而不是

我创建了一个有四列的网格。第一列显示名称,其他三列表示不同的角色。这三列中的每一列都用复选框填充,以便将特定角色分配给特定名称。这是我迄今为止所能做到的。
在每列和每行中,只允许有一个选中的复选框。因此,总的来说,我每个复选框列只有一个选择。如何实现这一点?

编辑:我意识到我可能完全误解了这个问题。如果希望有3列,并且每列都有多个复选框,其中每列只能选择1个复选框,那么应该在每列中使用一个,并将每个列绑定到griditem类的不同枚举字段


我将以不同的方式显示,以获得关于该项目的相同信息,而不是显示如何在三列中各选一个复选框,而只能选择一个复选框

这是因为您想要实现的解决方案不容易实现,因为每个复选框都是在一个不知道同一项的其他复选框的范围内定义的。因此,您只需要在itemclass的setters中实现一个选定的规则,这不是最优的。我的意思是,这是可能的,但我宁愿将结构更改为更合适的结构。通常,您不希望将这种业务逻辑放入bean类中


我将如何解决手头的问题?
创建一个新的枚举,它将替换item类中的所有3个布尔字段。现在,在网格中,组合框只需一列即可选择枚举。
我选择了枚举,因为它完全符合您的需要。对于枚举,可以有多个选项,但只能选择一个(或无)

为了更好地说明我的意思,让我们为网格项使用一个示例类,
Foo
。您的版本有3个布尔值,三个网格复选框都绑定到了这些布尔值。让我们把它们叫做
isA
isB
isC

// your version of the griditem class
public class Foo {
    private boolean isA, isB, isC = false;

    // constructor, getters, setters 
}

// how the columns are added in the grid (approximately) (without editor):
Grid<Foo> grid = new Grid<>();
grid.addComponentColumn((item) -> {
    CheckBox checkBox = new CheckBox();
    checkBox.setValue(item.isA());
    checkBox.addValueChangeListener(event -> item.setA(event.getValue()); // inside setA() method you need to set isB and isC to false if the new value is true. No good!
    return checkBox;
});
grid.addComponentColumn((item) -> {
    CheckBox checkBox = new CheckBox();
    checkBox.setValue(item.isB());
    checkBox.addValueChangeListener(event -> item.setB(event.getValue()); // inside setB() method you need to set isB and isC to false if the new value is true. No good!
    return checkBox;
});
grid.addComponentColumn((item) -> {
    CheckBox checkBox = new CheckBox();
    checkBox.setValue(item.isC());
    checkBox.addValueChangeListener(event -> item.setC(event.getValue()); // inside setC() method you need to set isB and isA to false if the new value is true. No good!
    return checkBox;
});
//您的griditem类版本
公开课Foo{
私有布尔值isA,isB,isC=false;
//构造函数、getter、setter
}
//如何在网格中添加列(近似)(无编辑器):
网格=新网格();
grid.addComponentColumn((项)->{
复选框=新复选框();
checkBox.setValue(item.isA());
checkBox.addValueChangeListener(event->item.setA(event.getValue());//在setA()方法中,如果新值为true,则需要将isB和isC设置为false。不好!
返回复选框;
});
grid.addComponentColumn((项)->{
复选框=新复选框();
checkBox.setValue(item.isB());
checkBox.addValueChangeListener(event->item.setB(event.getValue());//在setB()方法中,如果新值为true,则需要将isB和isC设置为false。不好!
返回复选框;
});
grid.addComponentColumn((项)->{
复选框=新复选框();
checkBox.setValue(item.isC());
checkBox.addValueChangeListener(event->item.setC(event.getValue());//在setC()方法中,如果新值为true,则需要将isB和isA设置为false。不好!
返回复选框;
});
这是我的改变后它将如何处理的

public class Foo {
    private AbcEnum abcEnum = null;

    // constructor, getters, setters 
}

public Enum AbcEnum {
    A,
    B,
    C;
}

// how the columns are added (without editor):
Grid<Foo> grid = new Grid<>();
grid.addComponentColumn((item) -> {
    ComboBox<AbcEnum> comboBox = new ComboBox<>();
    comboBox.setValue(item.getAbcEnum());
    comboBox.addValueChangeListener(event -> item.setAbcEnum(item.getValue()));
    return comboBox;
});
公共类Foo{
私有AbcEnum AbcEnum=null;
//构造函数、getter、setter
}
公共枚举{
A.
B
C
}
//如何添加列(不带编辑器):
网格=新网格();
grid.addComponentColumn((项)->{
ComboBox,您可以将这些功能输入添加为editorComponents(并将它们绑定到编辑器绑定器,而不是使用setValue和addValueChangeListener),并且仅在普通列中显示当前值(不可编辑-因此不需要复选框或ComboBox等输入)