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