Java Vaadin表格行内联编辑

Java Vaadin表格行内联编辑,java,vaadin,Java,Vaadin,我在vaadin中创建了一个表格,表格的每一行都有一个编辑按钮 table.setEditable(true) 但这会使整个表格可编辑。单击“编辑”按钮时,我只希望所选行可编辑,如果可以自定义某些单元格,例如复选框、下拉列表等。有什么建议吗?这是vaadin的默认行为。要更改默认行为,可以扩展/重写组件 Vaadin提供了一些基本功能,但具体功能如下: 1-搜索vaadin加载项目录: 2-如果没有结果,恐怕我们必须编写/更改部件代码。这里是一个非常简单的示例: final Table ta

我在vaadin中创建了一个表格,表格的每一行都有一个编辑按钮

table.setEditable(true) 

但这会使整个表格可编辑。单击“编辑”按钮时,我只希望所选行可编辑,如果可以自定义某些单元格,例如复选框、下拉列表等。有什么建议吗?

这是vaadin的默认行为。要更改默认行为,可以扩展/重写组件

Vaadin提供了一些基本功能,但具体功能如下:

1-搜索vaadin加载项目录:


2-如果没有结果,恐怕我们必须编写/更改部件代码。

这里是一个非常简单的示例:

final Table table = new Table();
table.setEditable(true);
table.setTableFieldFactory(new TableFieldFactory() {
    private static final long serialVersionUID = 1L;

    @Override
    public Field<?> createField(Container container, Object itemId, Object propertyId, Component uiContext) {
        if (itemId == table.getData()) {
            return DefaultFieldFactory.get().createField(container, itemId, propertyId, uiContext);
        }
        return null;
    }
});
table.addGeneratedColumn("", new ColumnGenerator() {
    private static final long serialVersionUID = 1L;

    @Override
    public Object generateCell(Table source, final Object itemId, Object columnId) {
        Button button = new Button(itemId == table.getData() ? "Save" : "Edit");
        button.addClickListener(new ClickListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void buttonClick(ClickEvent event) {
                if (table.getData() == null) {
                    // edit
                    table.setData(itemId);
                    table.refreshRowCache();
                } else if (itemId == table.getData()) {
                    // save
                    table.setData(null);
                    // ...
                    table.refreshRowCache();
                }
            }
        });
        return button;
    }
});
// ...
最终表格=新表格();
table.setEditable(true);
表.setTableFieldFactory(新的TableFieldFactory(){
私有静态最终长serialVersionUID=1L;
@凌驾
公共字段createField(容器容器、对象itemId、对象propertyId、组件uiContext){
if(itemId==table.getData()){
返回DefaultFieldFactory.get().createField(容器、itemId、propertyId、uiContext);
}
返回null;
}
});
table.addGeneratedColumn(“),new ColumnGenerator(){
私有静态最终长serialVersionUID=1L;
@凌驾
公共对象generateCell(表源、最终对象itemId、对象columnId){
Button Button=新建按钮(itemId==table.getData()?“保存”:“编辑”);
addClickListener(新建ClickListener(){
私有静态最终长serialVersionUID=1L;
@凌驾
公共作废按钮单击(单击事件){
if(table.getData()==null){
//编辑
表2.setData(itemId);
table.refreshRowCache();
}else if(itemId==table.getData()){
//拯救
表.setData(空);
// ...
table.refreshRowCache();
}
}
});
返回按钮;
}
});
// ...

与您的问题类似:我有一个有两列的表,但只有一个编辑按钮。选中一行并单击“编辑”按钮后,所选行将变为可编辑行。以下是使表格可编辑的代码,以及如何将更改的值传递到表格中并更新编辑的行:

private List fields=new ArrayList();
私有最终类EditTableClickListener实现ClickListener{
@凌驾
公共作废按钮单击(单击事件){
if(mappingTable.getSelection()!=null){
//在编辑模式下更改表格菜单
editTableBar();
makeRowEditable();
}
}
私有void makeRowEditable(){
setTableFieldFactory(新的TableFieldFactory(){
@抑制警告(“原始类型”)
@凌驾
公共字段createField(容器容器、对象itemId、对象propertyId、组件uiContext){
if(itemId.equals(mappingTable.getSelection())){
Field Field=DefaultFieldFactory.get().createField(容器、项目ID、属性ID、uiContext);
字段。setBuffered(true);
field.addAttachListener(新的AttachListener(){
私有静态最终长serialVersionUID=1L;
@凌驾
公共无效附加(附加事件){
add((Field)event.getConnector());
}
});
field.addDetachListener(新的DetachListener(){
私有静态最终长serialVersionUID=1L;
@凌驾
公共空拆离(拆离事件){
fields.remove((Field)event.getConnector());
}
});
返回字段;
}
返回null;
}
});
mappingTable.setEditable(真);
}
}
//在其中一个文本字段中单击ENTER键时保存
私有最终类SaveEditedRowShortcutListener扩展了ShortcutListener{
私有SaveEditedRowShortcutListener(字符串标题、int-keyCode、int[]modifierKeys){
super(标题,KeyCode.ENTER,null);
}
@凌驾
公共无效处理(对象发送方、对象目标){
用于(字段:字段){
field.commit();
}
String key=fields.get(0.getValue().toString();
字符串值=fields.get(1.getValue().toString();
对象选择=mappingTable.getSelection();
选择。设置键(键);
选择。设置值(值);
mappingTable.setEditable(false);
mappingTable.updateItem(选择);
//将表格菜单更改回默认模式
initialTableBar();
}
}

这是一份参考资料,谢谢,我会查一下的