Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vaadin 组合框和原始值作为数组_Vaadin_Vaadin7 - Fatal编程技术网

Vaadin 组合框和原始值作为数组

Vaadin 组合框和原始值作为数组,vaadin,vaadin7,Vaadin,Vaadin7,我有一个遗留MongoDB数据库(集合),其中有一个值存储为数组列表。但它只有一个必须的值,在用ComboBox选择的UI中。所以我有一个模型豆 class Project { List<Company> companies; } …'公司的组合框附加到BeanItemContainer,它是列表。。。因此,selection是唯一的一个公司bean,但出于兼容性原因,应该存储为只包含一个项的列表。因此,基本上ComboBox应该能够以单个公司的形式读取现有列表值,允许选择并

我有一个遗留MongoDB数据库(集合),其中有一个值存储为数组列表。但它只有一个必须的值,在用ComboBox选择的UI中。所以我有一个模型豆

class Project {
   List<Company> companies;
}
…'公司的组合框附加到BeanItemContainer,它是列表。。。因此,selection是唯一的一个公司bean,但出于兼容性原因,应该存储为只包含一个项的列表。因此,基本上ComboBox应该能够以单个公司的形式读取现有列表值,允许选择并将其存储为与此selecten Company一起的列表。

在最后一个问题更新后,下面的答案可能不正确。等待OP提供详细信息,以便更正答案。
您可以使用一种使用
ProjectDelegator
包装器的方法。这将允许您将表单绑定到
项目
名称(使用项目字段)以及
公司
名称(使用getCompany()getter)

1。UI类

@preserveonfresh
@斯普林吉
公共类MyVaadinUI扩展UI{
@凌驾
受保护的void init(VaadinRequest请求){
最终垂直布局=新建垂直布局();
布局。设置页边距(真);
设置内容(布局);
//将表单添加到UI
layout.addComponent(新MyForm(新项目授权人)(新项目(“myProject”),新公司(“myCompany”));
}
}
2。表格

/“包装”自定义组件中的表单。不是真的需要,只是一个很好的触摸
公共类MyForm扩展了CustomComponent{
公共MyForm(ProjectDelegator ProjectDelegator){
FormLayout布局=新建FormLayout();
//使用绑定器创建字段,并使用反射绑定成员
BeanFieldGroup绑定器=新BeanFieldGroup(ProjectDelegator.class);
//使用“项目”字段绑定项目名称
layout.addComponent(binder.buildAndBind(“Project”,“Project.name”));
//使用“getCompany”方法绑定公司名称
layout.addComponent(binder.buildAndBind(“公司”、“公司名称”));
//添加一个“保存”按钮
layout.addComponent(新建按钮(“保存”),新建按钮.ClickListener(){
@凌驾
公共作废按钮单击(Button.ClickEvent ClickEvent){
试一试{
//提交更改
binder.commit();
}catch(FieldGroup.committee){
//没想到会这样!什么事?!
System.out.println(“无法保存数据:[“+e.getMessage()+”]”);
}
}
}));
//将委托人设置为绑定数据源
binder.setItemDataSource(projectDelegator);
setCompositionRoot(布局);
}
}
3。“授权人”

//delegator类仅使用1项调整自/到列表
公共类项目委托人{
//尽可能清晰地表达意图
私有静态最终int MY_ONLY_COMPANY=0;
//我们的代表
私人项目;
公共项目授权人(项目){
this.project=项目;
}
//BeanFieldGroup将使用反射绑定“company.name”字段
上市公司{
//授权访问origina产品
return project.getcompanys().get(仅限我的公司);
}
//访问者;如果以后不需要,可以
公共项目getProject(){
返回项目;
}
}
4。传统车型类别

//我们的问题类
公共类项目{
私有字符串名称;
私有上市公司=新ArrayList();
公共项目(字符串名称,公司){
this.name=名称;
公司。添加(公司);
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
上市公司(){
返回公司;
}
上市公司(上市公司){
这是指公司;
}
}
//间接问题:)
公营公司{
私有字符串名称;
上市公司(字符串名称){
this.name=名称;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
System.out.println(“将实际公司名称设置为[“+name+”]”);
this.name=名称;
}
}
5。结果用户界面

6。按保存按钮

将实际公司名称设置为[MyNewComCompany]

您需要为一个可编辑值使用组合的具体原因是什么?因为文本字段更适合此用途。。。无论如何,除非我遗漏了什么,否则您应该能够在您的模型和希望在UI中显示的内容之间创建一个适配器。然后在提交更改时,您会自动更新您的模型beanCombo,因为值是从Bean列表中选择的(类公司)。从瓦丁的角度来看,适配器是什么?我认为你需要清楚地解释你想要做什么。选择一个项目?选择一家公司?编辑一家公司?编辑第一家公司?编辑公司名单?ComboBox无法“编辑”列表中的值。抱歉,我想的更多的是一个委托,而不是一个适配器。请看下面我的答案。在阅读您的更新后,我觉得@Sebgyman是正确的,需要更多的上下文。您是否试图编辑
项目
项,同时将
公司
显示为只读?添加一些代码也可能有帮助。。
 class Project {
       List<Company> companies;
    }
ComboBox companies;