将布尔值显示为Icon时,Vaadin Grid vs. Persistence

时间:2017-11-06 09:02:40

标签: java jpa vaadin vaadin8

我有一个持久化的实体,它为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;
    }
}

1 个答案:

答案 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;
}