我有一个简单的POJO课程,希望以表格形式显示/更新 使用BeanItem类和组件数据的绑定,我能够快速显示may数据类的第一个属性。然而,我已经找到了拖延相关属性的墙:
我的班级拥有一组可用状态,作为对象'AppStatus'的列表。它还具有当前状态,即“可用”列表中的状态之一。
我想将表单中的列表显示为组合框,并选择当前状态。
我设法将'available'属性与组合框相关联,但在设置数据源(方法setItemDataSource)时,我似乎无法填充此组合框。如何从我的项目中获取可用状态列表和当前状态?
除了BeanItem之外,我总是可以使用变通方法并在方法中添加一个参数来获取源对象,但如果Item属性可以为我提供属性,我宁愿避免这种情况。
此致
编辑:缩短的例子,使用Eric R的代码。
class Status {
String id;
Sting label
+ setter /getter
}
class App {
String AppId;
String AppLabel
ArrayList<Status> availablestatus;
Status currentStatus
+setter/getter
}
在表单扩展中,在fieldfactory的createField中添加了以下行
if ("status".equals(propertyId)) {
// create the combobox
ComboBox status = new ComboBox(
texts.getString("application.label.status"));
status.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY);
status.setItemCaptionPropertyId("label");
status.setImmediate(true);
status.setNullSelectionAllowed(false);
IndexedContainer container = new IndexedContainer(
(Collection<ApplicationStatus>) item.getItemProperty(
"availableStatus").getValue());
status.setContainerDataSource(container);
status.setPropertyDataSource(item.getItemProperty("currentStatus"));
return status;
} else...
这不起作用,我确实得到了一个组合框,线条数量正确,但是所有的空洞。
我尝试使用beanContainer而不是IndexedContainer
BeanContainer<String, ApplicationStatus> container =
new BeanContainer<String, ApplicationStatus>(ApplicationStatus.class);
container.addAll((Collection<ApplicationStatus>) item
.getItemProperty("availableStatus").
container.setBeanIdProperty("id");
结果稍好一些,因为我在组合框中有可用的值。 只选择了currentValue ...
我还尝试使用nestedbean属性来获取currentstatus的id,但结果仍然无效...我得到一个组合框,选择了正确的值,但我再也看不到其他值了,因为组合框是只读的吗?(即使使用setReadOnly(false);)
答案 0 :(得分:1)
我建议我解决这个问题。我不认为这是最好的方式,但它确实有用。
beanItem类包含您需要的所有内容。
我在一个简单的项目中做了以下工作,并且工作得非常好:
ComboBox status = new ComboBox("ComboBox");
status.setImmediate(true);
status.setNullSelectionAllowed(false);
for(Status st : (Collection<Status>)item.getItemProperty("availableStatus").getValue()) {
status.addItem(st);
status.setItemCaption(st, st.getLabel());
}
status.setPropertyDataSource(item.getItemProperty("currentStatus"));
希望它有效。
关心Éric
答案 1 :(得分:0)
从vaadin demo site您可以获得此示例,其中显示了如何使用国家/地区填充组合框。你可以做同样的猜测(不确定我100%理解你的问题):
myForm.setFormFieldFactory(new MyFormFieldFactory ());
private class MyFormFieldFactory extends DefaultFieldFactory {
final ComboBox countries = new ComboBox("Country");
public MyFormFieldFactory () {
countries.setWidth(COMMON_FIELD_WIDTH);
countries.setContainerDataSource(ExampleUtil.getISO3166Container());
countries
.setItemCaptionPropertyId(ExampleUtil.iso3166_PROPERTY_NAME);
countries.setItemIconPropertyId(ExampleUtil.iso3166_PROPERTY_FLAG);
countries.setFilteringMode(ComboBox.FILTERINGMODE_STARTSWITH);
}
@Override
public Field createField(Item item, Object propertyId,
Component uiContext) {
Field f = (Field)item;
if ("countryCode".equals(propertyId)) {
// filtering ComboBox w/ country names
return countries;
}
return f;
}
}