将包含文本字段的 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
}