基于内容的Vaadin 10网格样式个别行

时间:2018-04-10 06:42:34

标签: java vaadin vaadin-grid

我正在使用Vaadin网格显示传入信息并实时更新。我已经能够通过访问DOM来设置所有行的样式:

- (void) passMyValueHere : (NSDictionary *) myValues{

}

我要做的是根据行数据的内容为特定行设置特定样式。基本上我有一列布尔值,如果它是真的,我希望该行有一个绿色背景,如果它是假的,我希望该行有一个红色背景。现在确定我将如何在我的Java代码或<dom-module id="my-grid" theme-for="vaadin-grid"> <template> <style> [part="row"] { height: 27px; font-size: 14px; max-height: 27px; } </style> </template> </dom-module> 中执行此操作。非常感谢你!

我见过这个例子,用于根据条件以编程方式设置列,但不是一行...

shared-styles.html

1 个答案:

答案 0 :(得分:6)

截至目前(Vaadin 10,vaadin-grid 5),没有用于向网格中的各个行添加自定义属性/类的API。可以在应用程序代码中实现此用例,但实现可能效率不高。

一种方法是为网格的每一列定义一个自定义渲染器,将每个单元格内容包装在一个额外的div中,并将类/属性添加到包装器中。您可以使用TemplateRenderer来最小化这些包装器对内存/性能的影响:

Grid<Person> grid = new Grid<>();
grid.setDataProvider(...);

ValueProvider<Person, String> cssClassProvider = (person) -> {
    String cssClass = "my-grid-cell";
    if (person.getAge() <= 16) {
        cssClass += " junior";
    } else if (person.getAge() >= 60) {
        cssClass += " senior";
    }
    return cssClass;
};

grid.addColumn(TemplateRenderer.<Person>
        of("<div class$=\"[[item.class]]\">[[item.age]]</div>")
            .withProperty("class", cssClassProvider)
            .withProperty("age", Person::getAge));
grid.addColumn(TemplateRenderer.<Person>
        of("<div class$=\"[[item.class]]\">[[item.name]]</div>")
            .withProperty("class", cssClassProvider)
            .withProperty("name", Person::getName));

然后你可以根据CSS类(shared-styles.html)设置网格单元格的背景:

<custom-style>
  <style>
    .my-grid-cell.junior {
      background-color: coral;
    }

    .my-grid-cell.senior {
      background-color: darkmagenta;
    }
  </style>
</custom-style>

然而,对于Vaadin Grid的默认Lumo主题样式,这看起来不太好。为了使您的网格看起来不错,您需要覆盖其中一些默认样式:

<dom-module id="my-grid-theme" theme-for="vaadin-grid">
  <template>
    <style>
      [part~="cell"] {
        min-height: 0;
      }

      [part~="cell"] ::slotted(vaadin-grid-cell-content) {
        padding: 0;
      }
    </style>
  </template>
</dom-module>

<custom-style>
  <style>  
    .my-grid-cell {
      min-height: calc(var(--lumo-size-m) - 2 * var(--lumo-space-xs));
      padding: var(--lumo-space-xs) var(--lumo-space-m);
    }
  </style>
</custom-style>