我有一个持久化的实体,它为Vaadin网格中的行提供数据。这部分有效。
我现在想要将布尔值显示为图像。为此我向实体添加了一个getter。这部分仅在记录最近持久保存到数据库时起作用,我认为这意味着getter是持久的,这是不希望的。对于在引入getter之前持久保存到数据库的行,由于enabledIcon属性返回空值,该字段在vaadin网格中保持空白。
我尝试通过添加@Transient注释来禁用此行为,但由于某种原因,eureka客户端出现错误,并且它也无法帮助处理空字段。
我正在考虑通过合成而不是继承创建一个新的包装类,但是我必须手动创建所有这些getter和setter,这在我看来是糟糕的设计。
任何答案都是受欢迎的,即使是那些告诉我按照作文的方式使用包装类的答案。
package com.xxx.bpspkpibpcheck.model;
import javax.persistence.Entity;
//import javax.persistence.Transient;
import com.xxx.common.model.KPI;
import com.vaadin.server.ThemeResource;
@Entity
public class KPIBusiness extends KPI {
private static final String IMAGES = "images/";
private static final String IMAGE_STATUS_RED = IMAGES + "LED_red_24.png";
private static final String IMAGE_STATUS_GREEN = IMAGES + "LED_green_24.png";
private static final String IMAGE_STATUS_GRAY = IMAGES + "LED_gray_24.png";
private ThemeResource redStatus = new ThemeResource(IMAGE_STATUS_RED);
private ThemeResource greenStatus = new ThemeResource(IMAGE_STATUS_GREEN);
private ThemeResource grayStatus = new ThemeResource(IMAGE_STATUS_GRAY);
//@Transient
//ThemeResource enabledIcon = greenStatus;
//@Transient
public ThemeResource getEnabledIcon()
{
return getEnabled() != 0 ? greenStatus : grayStatus;
}
}
答案 0 :(得分:2)
我可能错过了一些重要的事情,但这是我对这个问题的看法。
对我来说,问题似乎是在这种情况下模型 - 你的实体 - 和视图/演示者的东西已经混合在你的实体类中。而且你通常不想坚持视图相关的东西。
您应该将此图像内容从实体中分离出来,并将图像列作为生成的列添加到网格中。
以此为例:How to add a generated column to Vaadin 8 Grid?
更新:提供的示例链接不是关于此处所需的组件列,例如:
添加组件列:
grid.addComponentColumn(statusProvider).setCaption("Status").setId("status");
statusProvider
就像:
ValueProvider<GridEntity, Layout> statusProvider = gridEntity -> {
AbsoluteLayout al = new AbsoluteLayout();
al.setSizeUndefined();
al.addStyleName("status");
String styleName = (gridEntity.isStatusOk()) ? "green" : "red";
al.addStyleName(styleName);
return al;
};
所以在我的版本中,&#34;交通信号灯&#34;通过使用addStyleName(...)
级联css内容来实现(使用默认的mytheme.scss),但当然LED图像也可以在css中使用,也可以按照您最初的计划使用。
.status {
width: 30px;
height: 30px;
border-radius: 15px;
margin: 0;
padding: 0;
}
.green {
background-color: green;
}
.red {
background-color: red;
}