我有一个关于使用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;
}