package com.vaadin.tests.components.grid; import java.util.HashMap; import java.util.Map; import java.util.stream.IntStream; import com.vaadin.annotations.Widgetset; import com.vaadin.server.VaadinRequest; import com.vaadin.shared.ui.ValueChangeMode; import com.vaadin.tests.components.AbstractTestUIWithLog; import com.vaadin.ui.Button; import com.vaadin.ui.Grid; import com.vaadin.ui.Label; import com.vaadin.ui.Notification; import com.vaadin.ui.Notification.Type; import com.vaadin.ui.TextField; import com.vaadin.ui.renderers.ComponentRenderer; @Widgetset("com.vaadin.DefaultWidgetSet") public class GridComponents extends AbstractTestUIWithLog { private Map<String, TextField> textFields = new HashMap<>(); private int counter = 0; @Override protected void setup(VaadinRequest request) { Grid<String> grid = new Grid<String>(); grid.addColumn(string -> new Label(string), new ComponentRenderer()); grid.addColumn(string -> { if (textFields.containsKey(string)) { log("Reusing old text field for: " + string); return textFields.get(string); } TextField textField = new TextField(); textField.setValue(string); // Make sure all changes are sent immediately textField.setValueChangeMode(ValueChangeMode.EAGER); textField.addValueChangeListener(e -> { // Value of text field edited by user, store textFields.put(string, textField); }); return textField; }, new ComponentRenderer()); grid.addColumn(string -> { Button button = new Button("Click Me!", e -> Notification.show( "Clicked button on row for: " + string, Type.WARNING_MESSAGE)); button.setId(string.replace(' ', '_').toLowerCase()); return button; }, new ComponentRenderer()); // make sure the buttons and focus outlines fit completely in a row grid.setRowHeight(40); addComponent(grid); grid.setSizeFull(); Button resetData = new Button("Reset data", e -> { grid.setItems(IntStream.range(0, 1000).boxed() .map(i -> "Row " + (i + (counter * 1000)))); textFields.clear(); ++counter; }); resetData.click(); addComponent(resetData); } }