Grid 对包含文本字段作为组件列的vaadin网格进行排序

Grid 对包含文本字段作为组件列的vaadin网格进行排序,grid,vaadin8,vaadin-flow,columnsorting,vaadin-grid,Grid,Vaadin8,Vaadin Flow,Columnsorting,Vaadin Grid,我用的是瓦丁8。此网格包含许多列。两列将textfield作为组件列,因为用户希望以字符串格式输入内容。因此,我们在两列中都使用TextField组件。这是通过使用grid.addComponentColumn方法完成的。即使在启用setSorting(true)之后,排序似乎对这两列都不起作用 addComponentColumn(DataGrid::getUserMessage).setId("userMessage").setSortable(true).set

我用的是瓦丁8。此网格包含许多列。两列将textfield作为组件列,因为用户希望以字符串格式输入内容。因此,我们在两列中都使用TextField组件。这是通过使用grid.addComponentColumn方法完成的。即使在启用setSorting(true)之后,排序似乎对这两列都不起作用

    addComponentColumn(DataGrid::getUserMessage).setId("userMessage").setSortable(true).setCaption("UserMessage");
我试过以下两件事,但仍然没有排序

首先

第二

addComponentColumn(DataGrid::getUserMessage).setId("userMessage").setSortable(true).setCaption("UserMessage").setSortOrderProvider(direction -> Arrays.asList(new QuerySortOrder("userMessage", direction)).stream());
数据网格是包含列名及其setter/getter的类。 我怎样才能做到这一点?有人能用一个片段来演示吗

更新下面的解决方案工程!这段代码用于改进在使用comparator时对containin空值进行排序

    @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");

Hi tarek我也做了同样的事情(参见第一个示例),但它并没有像预期的那样工作。您好,这个示例对我来说很有用,因为列是根据textfields的值排序的。你能解释一下它不起作用的感觉吗?您希望在textfield值更改后自动重新排序列吗?就在年,我发现它对vaadin textfield起到了正确的作用,但在我的代码中有一个自定义类(扩展vaadin textfield),该类由vaadin binder验证(如果输入的不是整数值,则不应允许该类)这可能是comparator没有对该字段中的数据进行排序的原因。如果排序没有发生,那么可能是一个错误,即使验证通过也没有问题,因为binder!发现如果在vaadin文本字段中输入了一个数字(整数),则即使在调用setComparator后,它也不会按预期排序。有什么解决办法吗
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
}