Сортировка строк JTable без изменения столбца Sl No

В моем JTable, среди других столбцов, у меня есть столбец «Серийный номер», который просто нумерует записи в таблице. Я хочу, чтобы этот столбец был зафиксирован, пока я сортирую строки, щелкая заголовки столбцов JTable. Сортировка идет нормально, но "Серийный номер" путается в процессе. Могу ли я как-то сохранить "Серийный номер"? исправлен столбец, пока я сортирую строки?

Спасибо за вашу помощь в этом.

Пример:

SlNo Имя
1 Иоанн
2 Петр
3 Алек

После сортировки (нажав на столбец «Имя») я получаю следующее:

SlNo Имя
3 Алек
1 Иоанн
2 Петр

Тем не менее, я хотел бы, чтобы результаты были такими:

SlNo Имя
1 Алек
2 Иоанн
3 Петр


person user1639485    schedule 24.09.2012    source источник
comment
конечно, почти все возможно, но понятия не имею, что делать...., для лучшей помощи скорее опубликуйте SSCCE продемонстрировал вашу проблему со смешанными выводами от RowSorter   -  person mKorbel    schedule 24.09.2012
comment
не совсем понял: даны строки с si == 0, 1, 2... после сортировки еще одного столбца вы хотите, чтобы произошло что? Оставить это (например, простой подсчет сверху вниз) как есть или заставить его переходить к уже отсортированным строкам (например, идентификатору строки)? Последнее по умолчанию, первое немного необычно..   -  person kleopatra    schedule 24.09.2012
comment
спасибо за разъяснение :-) Вы можете взглянуть на tip4java.wordpress.com/2008/11/18/номер-строки-таблица   -  person kleopatra    schedule 24.09.2012


Ответы (2)


Пробовали ли вы реализовать собственный TableRowSorter ?

Ознакомьтесь с разделом Сортировка и фильтрация.

ОБНОВЛЕНИЕ

Я копался в коде, проверяя это. Это выполнимо, но вам придется изобретать велосипед, чтобы заставить его работать.

Реализация по умолчанию просто сравнивает значения строки/столбца вместе (getValueAt(row, column)), что хорошо, но не предоставляет вам никакого контекста для принятия необходимых решений (например, какая строка была отсортирована, какое значение строки может быть быть и т. д.), на самом деле фильтр дает гораздо более ценную информацию :P...

Метод, который вы действительно хотите переопределить, является закрытым... (DefaultRowSorter.compare), но я не уверен, что он будет делать то, что вы хотите, в любом случае...

Единственное решение, которое у вас осталось, - это реализовать ваше решение с нуля (начиная с RowSorter), которое способно предоставить вам ВСЮ информацию, необходимую для выполнения сортировки подгрупп. Такие вещи, как модель таблицы, строки и столбцы, сравниваются...

person MadProgrammer    schedule 24.09.2012
comment
хм... это немного похоже на комментарий, не так ли :-) - person kleopatra; 24.09.2012
comment
@kleopatra это может быть, если хотите, не было времени посмотреть демо - person MadProgrammer; 24.09.2012
comment
@MadProgrammer (даже я проголосовал), посмотрите здесь (первые два пункта) - person mKorbel; 26.09.2012
comment
@mKorbel Мне нравится мультисортный пример в ссылке!! Будет использовать это - person MadProgrammer; 26.09.2012
comment
рад, если помог вам, но количество столбцов уменьшено, нужно прочитать описание Даррира, я думаю, что нет способов (прямо без написания сводки) управлять более чем 5-6 столбцами, другой проблемой может быть производительность - person mKorbel; 26.09.2012

Действительно простой реализацией этого будет

public class siNo implements RowSorterListener {
    JTable table;
    public siNo(JTable table) {
        this.table = table;
    }

    @Override
    public void sorterChanged(RowSorterEvent e)
    {
        for (int i = 0; i < table.getRowCount(); i++) {
            table.setValueAt(Integer.toString(i+1), i, 0);
        }
    }
}

Ваш класс, содержащий таблицу

sorter.setSortable(0, false);
sorter.addRowSorterListener(new siNo());
person Dan    schedule 15.01.2016