Vaadin 8网格单元编辑器

时间:2018-01-15 21:38:34

标签: grid vaadin8

我有一个关于使用Vaadin Grid和自定义单元格编辑器的问题。几个用例。

在第一种情况下,假设单元格值是一个日期,我想有一个单元格编辑器,它会弹出一个Calendar组件,供用户从中选择日期。

在第二种情况下,假设单元格值来自参考表,我喜欢让ListSelect包含用户可供选择的所有可能值。这些用例很常见,Java FX似乎有工作样本。

我发现一旦使用预定义的类实例化Grid,在进行以下调用的那一刻,就会填充Grid中的columnId(Map)。这意味着所有具有类中属性的列都将添加到网格中。

Grid <Person> personGrid = new Grid<>();

但页面https://vaadin.com/docs/framework/components/components-grid.html告诉我,在你用一个人列表调用setItems()之后,你仍然可以继续调用addColumn,在我的情况下遇到了一个例子,说明该列已被添加。

我的问题实际上是当用户点击要显示值的单元格时如何关联ListSelect。当我尝试使用HasValue的setEditorComponent时,它似乎不起作用。它仍然使用编辑器的默认底层TextEdit。

下面的代码示例尚未重新计算。它只是一个原型。目的是当我想站起来使用常见的参考表维护功能时,我会使用反射来填充网格。但是对于某些外键字段,我想使用新的SQL来获取所有可能的值来显示所选的值。下面的代码setEditorComponent是一个测试代码,我试图为该列的编辑器设置自定义的MyListSelect,它只是从Component扩展并实现HasValue接口。但这对我没用。

请指导!

    void populateGrid(String tableName, VerticalLayout mLayout) { 

    ArrayList<TabSheet> outList = new ArrayList<TabSheet>();
    findTabSheet((ComponentContainer) mLayout, outList); 
    setContent(mLayout);
    TabSheet sheet = outList.get(0);  
    VerticalLayout tab1 = new VerticalLayout(); 
    sheet.addTab(tab1, tableName, null); 
    tab1.setVisible(true);
    WCECDomainTable theDomainTable = domainTableHash.get(tableName);
    Class domainTableClass;
    try {
        domainTableClass = Class.forName(theDomainTable.getEntityName());
        JpaRepository repo = (JpaRepository) theDomainTable.getRepoProxy();
        ColumnToRendererAssociation [] fieldNames2 = extractProperty(domainTableClass);

        Grid theGrid = new Grid<>(domainTableClass);
        tab1.addComponent(theGrid);
        theGrid.setHeight(100, Unit.PERCENTAGE);
        theGrid.setWidth(100, Unit.PERCENTAGE);
        theGrid.setVisible(true);

        //theGrid.setColumns(fieldNames2); 

        theGrid.setItems(repo.findAll());   
        for (int i = 0; i < fieldNames2.length; i++) {
            Component editorComponent = fieldNames2[i].getEditorComponent();
            if (editorComponent != null) {
                theGrid.removeColumn(fieldNames2[i].getPropertyName());
                theGrid.addColumn(fieldNames2[i].getPropertyName()).setEditorComponent((MyListSelect) editorComponent);
            }
        }
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}

ColumnToRendererAssociation [] extractProperty(Class aClass) {
    List<Field> currentClassFields = (List) Lists.newArrayList(aClass.getDeclaredFields());
    ColumnToRendererAssociation fieldNames[] = new ColumnToRendererAssociation[currentClassFields.size()];
    int actualSize = 0;
    for (int i = 0, j = 0; i < fieldNames.length; i++) {
        if (!currentClassFields.get(i).getName().equals("serialVersionUID")) {
            MyListSelect listSelect = new MyListSelect();
            listSelect.setWidth(100, Unit.PERCENTAGE);
            listSelect.setHeight(82, Unit.PIXELS);  
            //listSelect.addValueChangeListener(this);
            Field aField = currentClassFields.get(i);

            String packageName = "";
            if (aField.getType().getPackage() != null) {
                packageName = aField.getType().getPackage().getName();
            }
            if (packageName.indexOf("org.wcec.retreat") >= 0) {
                fieldNames[j] = new ColumnToRendererAssociation(currentClassFields.get(i).getName(), (Component) listSelect);
            } else {
                fieldNames[j] = new ColumnToRendererAssociation(currentClassFields.get(i).getName(), null);
            } 

            j++;
            actualSize = j;
        }
    }
    ColumnToRendererAssociation fieldNames2[] = new ColumnToRendererAssociation[actualSize];
    for (int i = 0, j = 0; i < fieldNames.length; i++) {
        if (fieldNames[i] != null) { 
            fieldNames2[j] = fieldNames[i];
            j++;
        }
    }
    return fieldNames2;
}

0 个答案:

没有答案