【问题标题】:Sort vaadin grid containing text field as component column将包含文本字段的 vaadin 网格排序为组件列
【发布时间】:2025-07-28 03:05:02
【问题描述】:

我正在使用 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());

数据网格是包含列名及其设置器/获取器的类。 我怎样才能使这项工作?有人可以通过sn-p演示吗

更新以下解决方案有效!这段代码是为了改进在使用比较器时对包含空值的排序

    @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());
    }
);```

【问题讨论】:

    标签: grid vaadin8 vaadin-flow columnsorting vaadin-grid


    【解决方案1】:

    这是一个最小的例子,

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


    还有 Person 类

    public class Person {
    
        private String name;
        private String message;
    
        public Person(String name, String message) {
            setName(name);
            setMessage(message);
        }
    
        // Getters and Setters
    }
    

    【讨论】:

    • 嗨 tarek 我做了同样的事情(见第一个例子),但它没有按预期工作
    • 您好,这个示例适用于我,因为列是根据文本字段的值进行排序的。您能否详细说明它不起作用的感觉?您是否希望在文本字段值更改后自动重新排序列?
    • 就在我发现它适用于 vaadin 文本字段但在我的代码中有一个自定义类(扩展 vaadin 文本字段)由 vaadin binder 验证(如果输入的不是整数值)那么它不应该被允许),这可能是比较器没有对该字段中的数据进行排序的原因。
    • 即使验证通过也没有发生排序,这可能是一个错误
    • 由于活页夹没有问题!发现如果在 vaadin 文本字段中输入了一个数字(整数),那么即使在调用 setComparator 之后它也没有按预期排序。有没有可用的解决方法
    最近更新 更多