将包含文本字段的 vaadin 网格排序为组件列
Sort vaadin grid containing text field as component column
我正在使用 vaadin 8。此网格包含许多列。两列将文本字段作为组件列,因为用户想要输入字符串格式的内容。因此,我们在两列中都使用了 TextField 组件。这是通过使用 grid.addComponentColumn 方法完成的。即使在启用 setSorting(true) 之后,排序似乎对这两列都不起作用。
addComponentColumn(DataGrid::getUserMessage).setId("userMessage").setSortable(true).setCaption("UserMessage");
我尝试了以下两件事,但仍然无法排序。
第一个
addComponentColumn(DataGrid::getUserMessage).setId("userMessage").setSortable(true).setCaption("UserMessage").setComparator((p1, p2) -> p1.getUserMessage().getValue().compareTo(p2.getUserMessage().getValue()));
第二
addComponentColumn(DataGrid::getUserMessage).setId("userMessage").setSortable(true).setCaption("UserMessage").setSortOrderProvider(direction -> Arrays.asList(new QuerySortOrder("userMessage", direction)).stream());
数据网格是包含列名称及其 setter/getters 的 class。
我怎样才能使这项工作?有人可以用片段来演示吗
更新以下解决方案有效!这段代码用于改进在使用 comparator
时对包含 null 值的排序
@Override
public int compare(final DataGrid a, final DataGrid b) {
if (a.getUserMessage().getIntegerValue() == null && b.getUserMessage().getIntegerValue() == null) {
return 0;
}
if (a.getUserMessage().getIntegerValue() == null) {
return -1;
}
if (b.getUserMessage().getIntegerValue() == null) {
return 1;
}
return a.getUserMessage().getIntegerValue().compareTo(b.getUserMessage().getIntegerValue());
}
);```
这是一个最小的例子,
List<Person> personList = new ArrayList<>();
personList.add(new Person("Lucas", "Lucas Message"));
personList.add(new Person("Samuel", "Samuel Message"));
personList.add(new Person("Aaron", "Aaron Message"));
Grid<Person> grid = new Grid<>();
grid.setItems(personList);
grid.addColumn(Person::getName).setCaption("Name");
grid.addComponentColumn(person -> {
TextField tf = new TextField();
tf.setValue(person.getMessage());
tf.addValueChangeListener(e -> {
person.setMessage(e.getValue());
});
return tf;
}).setId("customColumn").setComparator(
(p1, p2) -> p1.getMessage().compareTo(p2.getMessage()))
.setCaption("Message");
和那个人class
public class Person {
private String name;
private String message;
public Person(String name, String message) {
setName(name);
setMessage(message);
}
// Getters and Setters
}
我正在使用 vaadin 8。此网格包含许多列。两列将文本字段作为组件列,因为用户想要输入字符串格式的内容。因此,我们在两列中都使用了 TextField 组件。这是通过使用 grid.addComponentColumn 方法完成的。即使在启用 setSorting(true) 之后,排序似乎对这两列都不起作用。
addComponentColumn(DataGrid::getUserMessage).setId("userMessage").setSortable(true).setCaption("UserMessage");
我尝试了以下两件事,但仍然无法排序。
第一个
addComponentColumn(DataGrid::getUserMessage).setId("userMessage").setSortable(true).setCaption("UserMessage").setComparator((p1, p2) -> p1.getUserMessage().getValue().compareTo(p2.getUserMessage().getValue()));
第二
addComponentColumn(DataGrid::getUserMessage).setId("userMessage").setSortable(true).setCaption("UserMessage").setSortOrderProvider(direction -> Arrays.asList(new QuerySortOrder("userMessage", direction)).stream());
数据网格是包含列名称及其 setter/getters 的 class。 我怎样才能使这项工作?有人可以用片段来演示吗
更新以下解决方案有效!这段代码用于改进在使用 comparator
时对包含 null 值的排序 @Override
public int compare(final DataGrid a, final DataGrid b) {
if (a.getUserMessage().getIntegerValue() == null && b.getUserMessage().getIntegerValue() == null) {
return 0;
}
if (a.getUserMessage().getIntegerValue() == null) {
return -1;
}
if (b.getUserMessage().getIntegerValue() == null) {
return 1;
}
return a.getUserMessage().getIntegerValue().compareTo(b.getUserMessage().getIntegerValue());
}
);```
这是一个最小的例子,
List<Person> personList = new ArrayList<>();
personList.add(new Person("Lucas", "Lucas Message"));
personList.add(new Person("Samuel", "Samuel Message"));
personList.add(new Person("Aaron", "Aaron Message"));
Grid<Person> grid = new Grid<>();
grid.setItems(personList);
grid.addColumn(Person::getName).setCaption("Name");
grid.addComponentColumn(person -> {
TextField tf = new TextField();
tf.setValue(person.getMessage());
tf.addValueChangeListener(e -> {
person.setMessage(e.getValue());
});
return tf;
}).setId("customColumn").setComparator(
(p1, p2) -> p1.getMessage().compareTo(p2.getMessage()))
.setCaption("Message");
和那个人class
public class Person {
private String name;
private String message;
public Person(String name, String message) {
setName(name);
setMessage(message);
}
// Getters and Setters
}