如何在Vaadin网格中显示复选框而不是布尔值?

7
我正在尝试在Vaadin Grid中将布尔值显示为复选框。我不能使用多选模式,因为我需要两列带有复选框的数据。复选框的列具有标题,但复选框本身不应该有标题。请问有什么方法吗?
3个回答

6
我建议使用这个仓库 https://github.com/vaadin/grid-renderers-collection-addon. 这个项目是由Vaadin开发人员开发的,它提供CheckboxRenderer类。您可以在演示中看到它,但使用它非常简单。
首先,您需要将存储库和依赖项添加到项目中。在Maven中,它看起来像这样:
...
<repositories>
    ...
    <repository>
        <id>vaadin-addons</id>
        <url>http://maven.vaadin.com/vaadin-addons</url>
    </repository>
</repositories>
...
<dependencies>
    ...
    <dependency>
        <groupId>com.vaadin</groupId>
        <artifactId>grid-renderers-collection-addon</artifactId>
        <version>0.94</version>
    </dependency>
</dependencies>
...

然后你可以像这样使用它:

grid.getColumn(columnName).setRenderer(new CheckboxRenderer());

您还可以轻松添加监听器:

CheckboxRenderer renderer = new CheckboxRenderer();
grid.getColumn(columnName).setRenderer(renderer);
grid.getColumn(columnName).setHeaderCaption("");
renderer.addClickListener(e -> System.out.println("Hello listener!"));

很遗憾,复选框旁边总是有一个标签,这不适用于我的实现。 - julianspaeth
我相信你可以忽略这个。我可以在家里检查它。 - Piotrowy
你找到解决方案了吗? - julianspaeth
我知道那个类方法,但我想要列的标题。我不想在复选框旁边只有一个标签。但还是谢谢你的努力! - julianspaeth

5

如果您只需要一个只读的复选框,可以使用以下方法:

grid.getColumn("columnId").setRenderer(new HtmlRenderer(), new BooleanConverter());

HtmlRenderer由Vaadin框架提供,布尔转换器如下:

public class BooleanConverter implements Converter<String, Boolean>
{   
  @Override
  public Boolean convertToModel(String value, Class<? extends Boolean> targetType, Locale locale) throws ConversionException
  {
    return null;
  }

  @Override
  public String convertToPresentation(Boolean value, Class<? extends String> targetType, Locale locale) throws ConversionException
  {
    return "<input type='checkbox' disabled='disabled'" + (value.booleanValue() ? " checked" : "") + " />";
  }

  @Override
  public Class<Boolean> getModelType()
  {
    return Boolean.class;
  }

  @Override
  public Class<String> getPresentationType()
  {
    return String.class;
  }
}

这将为您提供本机浏览器复选框,但不是Vaadin复选框。

谢谢,但我还需要检查和取消选中框。 - julianspaeth
1
@spaethju,以下是符合您要求的答案。 - Piotrowy
当我尝试上述操作时,出现了错误:“转换模型类型类java.lang.Boolean与属性类型类java.lang.String(在Column [propertyId:role1]中)不兼容”。是否有人曾经让它工作过? - Tony B
@user3329922 你提供了一个字符串,但转换器期望一个布尔值。 - Reto Höhener
啊,也许是因为我们有一个名为“getRole1”的Bean方法,它返回字符串,还有一个名为“isRole1”的Bean方法,它返回布尔值,转换器会感到困惑。它们都指向相同的基础数据(实际上都是字符串)。通常情况下,使用isRole1就可以解决问题,但也许我需要尝试一下更改Bean方法的命名,看看能否解决这个问题。 - Tony B
显示剩余3条评论

2
您需要为复选框添加生成的列。
    GeneratedPropertyContainer gpcontainer = new GeneratedPropertyContainer(container);
    gpcontainer.addGeneratedProperty("columnName",
        new PropertyValueGenerator<CheckBox>() {
        @Override
        public CheckBox getValue(Item item, Object itemId,
                                Object propertyId) {

            // set checkBox listener etc. in here
            return new CheckBox();
        }

        @Override
        public Class<CheckBox> getType() {
            return CheckBox.class;
        }
    });

Grid grid = new Grid(gpcontainer);

你可以在“GeneratedPropertyContainer”部分中找到更详细的示例。

https://vaadin.com/docs/-/part/framework/datamodel/datamodel-container.html#datamodel.container.gpc

编辑:还需为您的列设置“ComponentRenderer”

mainGrid.addColumn(COLUMN).setRenderer(new ComponentRenderer())

这个解决方案总是显示 com.vaadin.ui.CheckBox@4cdcd0e8 而不是一个真正的 CheckBox。 - julianspaeth
我已经更新了我的回答。为您的列设置“ComponentRenderer”。 - Krzysztof Majewski
1
谢谢,但是这是一个插件吗?Vaadin 找不到 ComponentRenderer()。 - julianspaeth
Vaadin中没有ComponentRenderer()这样的东西。 - Piotrowy
抱歉,我犯了个错误。这是一个插件,可以在https://vaadin.com/directory#!addon/componentrenderer找到。 - Krzysztof Majewski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接