Vaadin表隐藏列和容器定制

时间:2010-03-18 17:36:10

标签: hibernate vaadin

我正在使用Vaadin和Hibernate测试项目。我正在尝试使用HbnContainer类将数据显示到表中。问题是我不想在表中显示这两个类的所有属性。

例如:

@Entity
@Table(name="users")
class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String name;

@ManyToOne(cascade=CascadeType.PERSIST)
private UserRole role;

//getters and setters
}

和第二堂课:

@Entity
@Table(name="user_roles")
class UserRole {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String name;

//getters and setters
}

接下来,我使用HbnContainer检索我的数据,并将其连接到表:

HbnContainer container = new HbnContainer(User.class, app);
table.setContainerDataSource(container);

表格仅显示来自用户的列,而对于“角色”,它将显示角色ID。如何隐藏该列,并将其替换为UserRole.name?

我设法使用ColumnGenerator()来获取表中的字符串值,用于UserRole - 但是我无法使用数值删除上一列。

我错过了什么?或者,在显示表之前“自定义”数据的最佳方法是什么(如果我想在多个对象类型的表中显示数据......我该怎么办?)

如果我很快找不到简单的解决方案,我想我会“手工制作”表格。

那么,有关此事的任何建议吗?

修改:
我以前没有表达过自己。我需要知道的是如何使用嵌套的pojos和HbnContainer,并控制表中出现的属性(和“子属性”)。我试图扩展并重新实现HbnContainer的某些部分,但是......无法正常完成。

对于前面的示例,从Users表生成的表格如下所示:

Name  |Role
George| 1
Alex  | 2 

我想要类似的东西:

Name  | Role
George| admin
Alex  | user

3 个答案:

答案 0 :(得分:2)

您要做的是定义哪些属性应该在表中可见(从而排除角色ID)。这可以使用setVisibleColumns()方法实现。

答案 1 :(得分:1)

您可以覆盖Table类中的formatPropertyValue方法,而不是隐藏列/添加生成的列。

final Table table = new Table() {
    @Override
    protected String formatPropertyValue(Object rowId, Object colId, Property property) {
        if ("column".equals(colId)) {
            return "something";
        }

        return super.formatPropertyValue(rowId, colId, property);
    }
};

要获取POJO(在您的情况下是User对象),您可以使用以下结构:

User blogger = (User) ((HbnContainer.EntityItem.EntityItemProperty) property).getPojo();

答案 2 :(得分:0)

我和你有同样的问题,这有帮助(希望它对你也有帮助)

tblUsers.addGeneratedColumn("userRole", new Table.ColumnGenerator() {
            public Object generateCell(final Table source, final Object itemId, final Object columnId) {
                return new Label(userRoleService.getById(itemId.toString()).getName());
            }
        });