Сортировка сетки vaadin, содержащей текстовое поле, как столбец компонента

Я использую 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());

Сетка данных - это класс, который содержит имена столбцов и их установщики / получатели. Как я могу заставить это работать? Может кто-нибудь продемонстрировать это отрывком

Обновление ниже, решение работает! Этот фрагмент кода предназначен для улучшения сортировки, содержащей нулевые значения, при использовании компаратора.

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

person Anam Qureshi    schedule 01.12.2020    source источник


Ответы (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
}
person Tarek Oraby    schedule 02.12.2020
comment
Привет, тарек, я сделал то же самое (см. Первый пример), но он работает не так, как ожидалось - person Anam Qureshi; 03.12.2020
comment
Здравствуйте, этот пример работает для меня в том смысле, что столбец сортируется на основе значения текстовых полей. Не могли бы вы объяснить, что это не работает? Вы хотите, чтобы столбец автоматически пересортировывался после изменения значения текстового поля? - person Tarek Oraby; 03.12.2020
comment
только что я обнаружил, что он работает правильно для текстового поля vaadin, но в моем коде есть один настраиваемый класс (расширяет текстовое поле vaadin), который проверяется связывателем vaadin (если введено что-либо, кроме целочисленного значения, это не должно быть разрешено) и это может быть причиной того, что компаратор не сортирует данные в этом поле. - person Anam Qureshi; 03.12.2020
comment
Это может быть ошибкой, если сортировка не происходит, даже если проверка проходит - person Tarek Oraby; 03.12.2020
comment
Нет проблем из-за связующего! Обнаружено, что если число (целое число) вводится в текстовое поле vaadin, оно не сортируется должным образом даже после вызова setComparator. Есть ли обходной путь? - person Anam Qureshi; 03.12.2020
comment
Проблема решена !! Также работает с setComparator :) обнаружил, что для получения целочисленного значения из текстового поля мне нужно использовать getValue().getIntegerValue(), тогда сортировка работает правильно - person Anam Qureshi; 03.12.2020
comment
Ага, удачный улов! - person Tarek Oraby; 03.12.2020
comment
Вы можете сделать это, заменив это выражение в моем примере кода: p1.getMessage().compareTo(p2.getMessage() блоком кода (который заключен в фигурные скобки: {code block}). В этом блоке кода вы можете делать все, что хотите, а затем возвращать отрицательное число, если p1<p2, положительное число, если p1>p2, или 0, если p1==p2 - person Tarek Oraby; 07.12.2020
comment
Я уже пробовал это, но проблема в том, что некоторые строки сетки имеют значение столбца сообщения как null, из-за чего пустые строки присутствуют между ними после сортировки. Как мы можем избежать или подтолкнуть строки сетки, в которых значения столбцов сообщений равны нулю, вниз? В случае строки это может сработать, но если кто-то поместит целое число, между ними будут нулевые строки. - person Anam Qureshi; 07.12.2020
comment
Это работает, но единственная проблема заключается в том, что при сортировке по возрастанию перед любым числом помещаются нулевые значения. При сортировке по убыванию после чисел ставится нулевое значение (я обновил вопрос. Пожалуйста, обратитесь). - person Anam Qureshi; 07.12.2020