Checkbox Vaadin表格:如何将布尔值显示为可编辑为false的复选框

Checkbox Vaadin表格:如何将布尔值显示为可编辑为false的复选框,checkbox,boolean,vaadin,Checkbox,Boolean,Vaadin,我希望在表格中看到复选框,而不是“真”或“假”文本。TableFieldFactory类仅为可编辑单元格生成字段。我发现只有formatProperty可以像这样返回正确的unicode字符☑, 但是看起来不太好。有没有可能在不创建计算属性的情况下生成自己的HTML元素?一种解决方案是向表中添加样式生成器,并通过css解决此问题: setCellStyleGenerator(new CellStyleGenerator() { @Override

我希望在表格中看到复选框,而不是“真”或“假”文本。TableFieldFactory类仅为可编辑单元格生成字段。我发现只有formatProperty可以像这样返回正确的unicode字符☑, 但是看起来不太好。有没有可能在不创建计算属性的情况下生成自己的HTML元素?

一种解决方案是向表中添加样式生成器,并通过css解决此问题:

  setCellStyleGenerator(new CellStyleGenerator() {
            @Override
            public String getStyle(Table source, Object itemId, Object propertyId) {
                     if("myBooleanColumn".equals(propertyId){
                        return "true".equals(itemId) ? "checked-checkbox":"unchecked-checkbox";
                     }
                     return null;
            }
        });
然后定义你的风格:

.v-table-cell-content-unchecked-checkbox .v-table-cell-wrapper,
.v-table-cell-content-checked-checkbox .v-table-cell-wrapper{
  text-indent: 100%;
  white-space: nowrap;
  overflow: hidden;
}


.v-table-cell-content-checked-checkbox .v-table-cell-wrapper{      
  background-image: url(".../checked-checkbox.png");
}
.v-table-cell-content-unchecked-checkbox .v-table-cell-wrapper{      
  background-image: url(".../unchecked-checkbox.png");
}

如果希望复选框可编辑,还可以在列中设置real Vaadin复选框。有关详细信息,请参见。

生成的列方法将默认的“toString”替换为一个组件:

table.addGeneratedColumn("propertyWithBoolean", new Table.ColumnGenerator() {

    @Override
    public Object generateCell(Table source, Object itemId,
            Object columnId) {
        Boolean checked = (Boolean) source.getItem(itemId).getItemProperty(columnId).getValue();
        CheckBox checkBox = new CheckBox();
        checkBox.setValue(checked);
        // don't allow user to change value
        checkBox.setEnabled(false);
        return checkBox;
    }
});

作为mstahv answer的补充,刷新复选框字段的方法是使用table.refreshRowCache()


或者你可以使用真正的复选框,只需禁用它是的,这是设计师喜欢的。事实上,你也可以改变禁用复选框的样式。我发现它很有用,有趣的是使用文本缩进替换原始文本:)你的是wekcome。我认为这对varios场景很有用,对状态图标也很有用。这是我不想遵循的方式。为每个布尔列创建计算(生成)属性,然后使其可见并隐藏原始属性。这是非常苛刻的,有缺点,内容不是自动刷新的价值变化。我需要由其他侦听器处理。@Hink“内容不是由valueChange自动刷新的”。。。您可以将ItemProperty绑定到CheckBox@Hink,我不知道您所说的“要求”是什么意思,但如果您对生成的列使用与原始列相同的属性id,它将被替换。无需添加其他属性并隐藏原始属性。正如Nexus所说,如果您绑定到该属性,并且在其他地方实际修改了相同的属性,则将自动更新。这在现实世界的解决方案中非常罕见,所以当您知道数据已经更改时,我只需重置整个表内容(或特定的复选框)。
table.addGeneratedColumn("propertyWithBoolean", new Table.ColumnGenerator() {

@Override
public Object generateCell(Table source, Object itemId,
        Object columnId) {
    Boolean checked = (Boolean) source.getItem(itemId).getItemProperty(columnId).getValue();
    CheckBox checkBox = new CheckBox();
    checkBox.setValue(checked);
    // don't allow user to change value
    checkBox.setEnabled(false);
    return checkBox;
}
});
void changeColumnValue(String field, String dato)
{
    item.getItemProperty(field).setValue(dato.equals("true"));
    table.refreshRowCache(); // To refresh the checkbox value in the table
}