4

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

table.setEditable(true) 

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

4

3 回答 3

7

这是一个非常简单的例子:

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;
    }
});
// ...
于 2014-10-31T12:34:13.217 回答
2

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

Vaadin 提供了一些基本的东西,但针对特定的东西:

1- 搜索 vaadin 插件目录:https ://vaadin.com/en_GB/directory

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

于 2013-04-29T13:36:04.153 回答
1

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

private List<Field> fields = new ArrayList<>();

private final class EditTableClickListener implements ClickListener {

    @Override
    public void buttonClick(ClickEvent event) {
        if (mappingTable.getSelection() != null) {
            // change table menu when in Edit-Mode
            editTableBar();
            makeRowEditable();
        }
    }

    private void makeRowEditable() {
        mappingTable.setTableFieldFactory(new TableFieldFactory() {

            @SuppressWarnings("rawtypes")
            @Override
            public Field<?> createField(Container container, Object itemId, Object propertyId, Component uiContext) {
                if(itemId.equals(mappingTable.getSelection())) {
                    Field field = DefaultFieldFactory.get().createField(container, itemId, propertyId, uiContext);
                    field.setBuffered(true);
                    field.addAttachListener(new AttachListener() {
                        private static final long serialVersionUID = 1L;

                        @Override
                        public void attach(AttachEvent event) {
                            fields.add((Field)event.getConnector());
                        }
                    });

                    field.addDetachListener(new DetachListener() {
                        private static final long serialVersionUID = 1L;

                        @Override
                        public void detach(DetachEvent event) {
                            fields.remove((Field)event.getConnector());
                        }
                    });

                    return field;
                }
                return null;
            }
        });

        mappingTable.setEditable(true);
    }
}

// save when ENTER key is clicked in one of the TextFields
private final class SaveEditedRowShortcutListener extends ShortcutListener {

    private SaveEditedRowShortcutListener(String caption, int keyCode, int[] modifierKeys) {
        super(caption, KeyCode.ENTER, null);
    }

    @Override
    public void handleAction(Object sender, Object target) {
        for(Field field : fields) {
             field.commit();
         }

         String key = fields.get(0).getValue().toString();
         String value = fields.get(1).getValue().toString();

         Object selection = mappingTable.getSelection();
         selection.setKey(key);
         selection.setValue(value);

          mappingTable.setEditable(false);
          mappingTable.updateItem(selection);
          // change table menu back to Default-Mode
          initialTableBar();
    }
}
于 2016-02-10T08:48:07.520 回答