Vaadin Flow Grid - как управлять столбцами при использовании JPA Entity?
Если я использую JPA и Vaadin 10 Grid, он добавляет все столбцы в произвольном порядке на дисплей.
grid = new Grid<>(Thing.class);
add(grid);
Как мне сделать так, чтобы он добавлял только один или два столбца, и мог контролировать порядок, размеры, ширину и т. Д.
Моя "вещь" выглядит как
@Entity
public class Thing {
private static final Logger log = LoggerFactory.getLogger(Thing.class);
@Id
@GeneratedValue
@Column(unique = true)
private Long id;
@Column(nullable = false, updatable = false)
@CreationTimestamp
private Instant creationDate;
...
Есть ли аннотация, которую я должен использовать, или мне нужно скрыть столбцы, или удалить все столбцы и добавить их вручную? Я искал в Интернете и здесь на SO и не нашел ничего, что, кажется, связано.
2 ответа
Вы можете установить столбцы сетки с grid.setColumns("dataField1","dataField2","dataField3")
и так далее. Если вы хотите изменить отображаемое имя поля, вы можете использовать grid.getColumnByKey("dataField1").setHeader("Custom Text");
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.router.Route;
@Route
public class MainView extends VerticalLayout {
private static final long serialVersionUID = 3461787310452366610L;
private Grid<Student> sGrid = new Grid<>(Student.class);
private TextField filter = new TextField();
private HorizontalLayout toolbar = new HorizontalLayout();
private Button newStudent = new Button("Add");
@Autowired
StudentRepository repo;
public MainView() {
setSizeFull();
initComponents();
add(toolbar);
add(sGrid);
}
private void initComponents() {
sGrid.setColumns("firstName", "lastName", "sid", "uid");
sGrid.getColumnByKey("sid").setHeader("Student ID");
sGrid.getColumnByKey("uid").setHeader("Unique ID");
toolbar.setSizeUndefined();
toolbar.add(filter, newStudent);
filter.setPlaceholder("Search...");
}
@PostConstruct
private void init() {
sGrid.setItems(repo.findAll());
}
}
Мой ответ основан на Vaadin 8, но кроме незначительных изменений имени метода (т.е. sGrid.getColumn() -> sGrid.getColumnByKey()) я думаю, что это все еще должно работать.
private void buildGrid(){
sGrid.setColumns("propertyName1", "propertyName2");
this.defineRenderedGridColumns();
sGrid.setColumnOrder("configured", "propertyName1", "propertyName2")
// customize columns (captions, hideable, width, etc)
sGrid.getColumn("propertyName1").setWidth(100).setCaption("Property 1");
}
private void defineRenderedGridColumns(){
// when the standard presentation of the attribute is not enough (i.e. you want a numberformatter, or you want a componentColumn etc)
//example with a checkbox
sGrid.addComponentColumn(item -> {
CheckBox checkbox = new CheckBox();
checkbox.setValue(item.isConfigured());
//add clicklistener, or else this checkbox wont do anything
return checkbox;
})
.setId("configured")
.setStyleGenerator(item -> "v-align-center");
}