基于内容的 Vaadin 10 网格样式单行
Vaadin 10 grid style individual row based on contents
我正在使用 Vaadin 网格显示传入信息并实时更新。我已经能够通过访问 DOM 来设置所有行的样式:
<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>
我想做的是根据行数据的内容为某些行设置特定的样式。基本上我有一列布尔值,如果它是真的,我希望该行有一个绿色背景,如果它是假的,我希望该行有一个红色背景。现在确定我将如何在我的 Java 代码或我的 shared-styles.html
中执行此操作。非常感谢!
我看过这个示例,它基于条件而不是行以编程方式设置列样式..
Grid<Person> grid = new Grid<>();
grid.setItems(people);
grid.addColumn(new ComponentRenderer<>(person -> {
if (person.getGender() == Gender.MALE) {
return new Icon(VaadinIcons.MALE);
} else {
return new Icon(VaadinIcons.FEMALE);
}
})).setHeader("Gender");
截至目前(Vaadin 10,vaadin-grid 5)没有 API 用于将自定义 attributes/classes 添加到网格中的 individual 行。可以在您的应用程序代码中实现此用例,但实现效率可能不高。
一种方法是为网格的每一列定义一个自定义呈现器,以将每个单元格内容包装在一个额外的 div 中,并向包装器添加 classes/属性。您可以使用 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 class(in shared-styles.html
)设置网格单元格的背景:
<custom-style>
<style>
.my-grid-cell.junior {
background-color: coral;
}
.my-grid-cell.senior {
background-color: darkmagenta;
}
</style>
</custom-style>
但是,对于 Vaadin 网格的默认 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>
我正在使用 Vaadin 网格显示传入信息并实时更新。我已经能够通过访问 DOM 来设置所有行的样式:
<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>
我想做的是根据行数据的内容为某些行设置特定的样式。基本上我有一列布尔值,如果它是真的,我希望该行有一个绿色背景,如果它是假的,我希望该行有一个红色背景。现在确定我将如何在我的 Java 代码或我的 shared-styles.html
中执行此操作。非常感谢!
我看过这个示例,它基于条件而不是行以编程方式设置列样式..
Grid<Person> grid = new Grid<>();
grid.setItems(people);
grid.addColumn(new ComponentRenderer<>(person -> {
if (person.getGender() == Gender.MALE) {
return new Icon(VaadinIcons.MALE);
} else {
return new Icon(VaadinIcons.FEMALE);
}
})).setHeader("Gender");
截至目前(Vaadin 10,vaadin-grid 5)没有 API 用于将自定义 attributes/classes 添加到网格中的 individual 行。可以在您的应用程序代码中实现此用例,但实现效率可能不高。
一种方法是为网格的每一列定义一个自定义呈现器,以将每个单元格内容包装在一个额外的 div 中,并向包装器添加 classes/属性。您可以使用 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 class(in shared-styles.html
)设置网格单元格的背景:
<custom-style>
<style>
.my-grid-cell.junior {
background-color: coral;
}
.my-grid-cell.senior {
background-color: darkmagenta;
}
</style>
</custom-style>
但是,对于 Vaadin 网格的默认 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>