private DataBinder<MarathonData> showOverviewData(final FormLayout layout) { layout.setMargin(true); final BeanFieldGroup<MarathonData> binder = new BeanFieldGroup<MarathonData>(MarathonData.class); layout.addComponent(binder.buildAndBind("Veranstaltung", "marathonName")); final BeanItemContainer<String> categoryListContainer = new BeanItemContainer<String>(String.class); final ListSelect categoryListSelect = new ListSelect("Kategorieen", categoryListContainer); categoryListSelect.setNewItemsAllowed(true); categoryListSelect.setNullSelectionAllowed(false); categoryListSelect.setMultiSelect(false); layout.addComponent(categoryListSelect); final Button removeItemButton = new Button("Kategorie löschen"); layout.addComponent(removeItemButton); removeItemButton.addClickListener( new ClickListener() { @Override public void buttonClick(final ClickEvent event) { categoryListContainer.removeItem(categoryListSelect.getValue()); } }); // final ListSelect categoryList = new ListSelect("Kategorieen"); // layout.addComponent(categoryList); final BeanItemContainer<DriverData> driverContainer = new BeanItemContainer<DriverData>(DriverData.class); final Table table = new Table("Fahrer"); table.setContainerDataSource(driverContainer); table.removeContainerProperty("smallSheets"); table.removeContainerProperty("startTimes"); table.removeContainerProperty("category"); table.addGeneratedColumn( "Kategorie", new ColumnGenerator() { @Override public Object generateCell( final Table source, final Object itemId, final Object columnId) { final ComboBox comboBox = new ComboBox(); comboBox.setContainerDataSource(categoryListContainer); final DriverData driverData = (DriverData) itemId; final String category = driverData.getCategory() == null ? "" : driverData.getCategory(); final ObjectProperty<String> property = new ObjectProperty<String>(category); comboBox.setPropertyDataSource(property); property.addValueChangeListener( new ValueChangeListener() { @Override public void valueChange(final ValueChangeEvent event) { driverData.setCategory(property.getValue()); } }); return comboBox; } }); table.addGeneratedColumn( "Generieren", new ColumnGenerator() { @Override public Object generateCell( final Table source, final Object itemId, final Object columnId) { final DriverData driverData = (DriverData) itemId; final Button button = new Button("PDF"); button.addClickListener( new ClickListener() { @Override public void buttonClick(final ClickEvent event) { // showPdfHandler.showPdf(driverData.getName()); } }); return button; } }); table.addGeneratedColumn("Phase A Zettel", createPhaseCheckbox(Phase.A)); table.addGeneratedColumn("Phase D Zettel", createPhaseCheckbox(Phase.D)); table.addGeneratedColumn("Phase E Zettel", createPhaseCheckbox(Phase.E)); final DurationFieldFactory fieldFactory = new DurationFieldFactory(); table.addGeneratedColumn("Phase A Start", createPhaseStartInput(fieldFactory, Phase.A)); table.addGeneratedColumn("Phase D Start", createPhaseStartInput(fieldFactory, Phase.D)); table.addGeneratedColumn("Phase E Start", createPhaseStartInput(fieldFactory, Phase.E)); table.addGeneratedColumn( "Fahrer Löschen", new ColumnGenerator() { @Override public Object generateCell( final Table source, final Object itemId, final Object columnId) { final Button button = new Button("-"); button.addClickListener( new ClickListener() { @Override public void buttonClick(final ClickEvent event) { driverContainer.removeItem(itemId); } }); return button; } }); table.setEditable(true); table.setSortEnabled(false); // table.setNullSelectionAllowed(true); layout.addComponent(table); final Button addDriverButton = new Button("Neuer Fahrer"); addDriverButton.addClickListener( new ClickListener() { @Override public void buttonClick(final ClickEvent event) { final DriverData driver = new DriverData(); driver.setName("Fahrer - " + driverContainer.size()); driverContainer.addBean(driver); } }); layout.addComponent(addDriverButton); return new DataBinder<MarathonData>() { private MarathonData data; @Override public void bindData(final MarathonData data) { this.data = data; binder.setItemDataSource(data); categoryListContainer.removeAllItems(); for (final String category : data.getCategories()) { categoryListContainer.addBean(category); } driverContainer.removeAllItems(); for (final DriverData driver : data.getDrivers().values()) { driverContainer.addBean(driver); } } @Override public void commitHandler() { try { binder.commit(); final List<String> categories = data.getCategories(); categories.clear(); categories.addAll(categoryListContainer.getItemIds()); final Map<String, DriverData> drivers = data.getDrivers(); drivers.clear(); for (final DriverData driver : driverContainer.getItemIds()) { drivers.put(driver.getName(), driver); } } catch (final CommitException e) { throw new RuntimeException("Cannot commit", e); } } @Override public MarathonData getCurrentData() { return data; } }; }