我正在使用vaadin8。此网格包含许多列。两列具有文本字段作为组件列,因为用户希望以字符串格式输入内容。因此,我们在两列中都使用了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());
数据网格是包含列名称及其设置器/获取器的类。我该如何进行这项工作?有人可以通过片段演示它吗
更新以下解决方案!这段代码是为了改进,以便在使用比较器时对包含的空值进行排序
@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");
和人类
public class Person {
private String name;
private String message;
public Person(String name, String message) {
setName(name);
setMessage(message);
}
// Getters and Setters
}
嗨,塔雷克,我做过同样的事情(请参阅第一个示例),但是它没有按预期工作
您好,此示例在某种意义上对我有用,因为该列是根据文本字段的值进行排序的。您能详细说明一下它不起作用吗?您是否希望在文本字段值更改后自动对列进行重新排序?
只是在我发现它对vaadin文本字段起作用,但是在我的代码中有一个自定义类(扩展了vaadin文本字段),该类已通过vaadin绑定程序进行了验证(如果输入的不是整数值,则不允许这样做),并且这可能是比较器未对该字段中的数据进行排序的原因。
如果即使通过验证也没有进行排序,则可能是一个错误
由于粘合剂没有问题!发现如果在vaadin文本字段中输入了一个数字(Integer),则即使调用setComparator后也无法按预期对它进行排序。是否有任何解决方法