Vaadin 8 Grid cell editors

У меня есть вопрос об использовании Vaadin Grid с настраиваемым редактором ячеек. Пара вариантов использования.

В первом случае, предположим, что значение ячейки является датой, я хотел бы иметь встроенный в ячейку редактор, который бы выскакивал компонент календаря, чтобы пользователь мог выбрать дату от / до.

Во втором случае, предположим, что значение ячейки исходит из справочной таблицы, я хотел бы иметь ListSelect, содержащий все возможные значения для выбора пользователем. Эти варианты использования очень распространены, и Java FX, кажется, имеет рабочие образцы.

Я обнаружил, что после создания экземпляра Grid с предопределенным классом, в момент выполнения следующего вызова заполняется columnId (карта) в Grid. Это означает, что все столбцы со свойствами в классах добавляются в таблицу.

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

Но страница https://vaadin.com/docs/framework/components/components-grid.html показывает мне, что после вызова setItems() со списком людей вы все равно можете пойти дальше и вызвать addColumn, что в моей ситуации натолкнулся на пример, говорящий, что столбец уже был добавлен.

Мой вопрос на самом деле, как мне связать ListSelect, когда пользователь нажимает на ячейку, где я хочу отобразить значения. Когда я попытался установить setEditorComponent с HasValue, это не сработало. Он по-прежнему использовал стандартный редактор 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 ответов

Другие вопросы по тегам