2013-04-22 3 views
4

Я создал таблицу в Vaadin и у меня есть кнопка редактирования для каждой строки table.I попыталсяVaadin Строка таблицы рядного редактирование

table.setEditable(true) 

но это делает всю таблицу для редактирования. Когда я нажимаю кнопку редактирования, я хочу, чтобы только выбранная строка была доступна для редактирования, и если возможно, что некоторые ячейки будут настроены, например, флажок, выпадающий список и т. Д. Любые предложения?

+1

Здесь является [соответствующий поток на Vaadin форуме] (https: // Vaadin. com/old-forum/-/message_boards/view_message/1980390), который ссылается на [полезный пример обходного пути] (http://demo.vaadin.com/book-examples/book/1_221/) –

+0

Спасибо, я проверю его –

ответ

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; 
    } 
}); 
// ... 
2

Это поведение по умолчанию vaadin. Для изменения поведения по умолчанию вы можете продлить/переписать компоненты.

Vaadin предлагает некоторые основные вещи, но для конкретных вещей:

1- Поиск по каталогу Vaadin аддона: https://vaadin.com/en_GB/directory

2- Если нет результата, я боюсь, что мы не должны писать/коды компонентов изменения.

+0

Thanx я проверю это –

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(); 
    } 
} 
Смежные вопросы