Warm tip: This article is reproduced from serverfault.com, please click

vaadin8-将包含文本字段的vaadin网格排序为组件列

(vaadin8 - Sort vaadin grid containing text field as component column)

发布于 2020-12-01 10:04:12

我正在使用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());
    }
);```
Questioner
Anam Qureshi
Viewed
11
Tarek Oraby 2020-12-02 14:50:44

这是一个最小的例子,

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
}