Сортировка JTable по нескольким критериям

Чтобы отсортировать JTable, я использую TableRowSorter с разными ключами, которые отлично работают. Но теперь я хотел бы применить этот сортировщик и к тому случаю, когда пользователь меняет направление сортировки. Возможно, мне нужно сделать это в toggleSortOrder, но что мне делать здесь?

sorter = new TableRowSorter<TableModel>(model) {

    @Override
    public void toggleSortOrder(int column) {

        List<SortKey> keys = new ArrayList<SortKey>(sorter.getSortKeys());

        //use sorter

        super.toggleSortOrder(column);
    }
};

List<SortKey> keys = new ArrayList<SortKey>();
SortKey sortKey, sortKey2, sortKey3;


if(sortType == 0) {

    if(sortDirection == 0) {
        sortKey = new SortKey(1, SortOrder.ASCENDING);
        sortKey2 = new SortKey(0, SortOrder.ASCENDING);
        keys.add(sortKey);
        keys.add(sortKey2);
    } else {
        sortKey = new SortKey(1, SortOrder.DESCENDING);
        sortKey2 = new SortKey(0, SortOrder.DESCENDING);
        keys.add(sortKey);
        keys.add(sortKey2);
    }

} else { 

   if(sortDirection == 0) {
       sortKey = new SortKey(2, SortOrder.ASCENDING);
       sortKey2 = new SortKey(1, SortOrder.ASCENDING);
       sortKey3 = new SortKey(0, SortOrder.ASCENDING);
       keys.add(sortKey);
       keys.add(sortKey2);
       keys.add(sortKey3);
   } else {
       sortKey = new SortKey(2, SortOrder.DESCENDING);
       sortKey2 = new SortKey(1, SortOrder.DESCENDING);
       sortKey3 = new SortKey(0, SortOrder.DESCENDING);
       keys.add(sortKey);
       keys.add(sortKey2);
       keys.add(sortKey3);
   }
}

sorter.setRowFilter(null);
sorter.setSortKeys(keys);
sorter.sort();

sorter.setSortsOnUpdates(true);

table.setRowSorter(sorter);

person user1703554    schedule 30.06.2013    source источник
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 30.06.2013


Ответы (2)


Я не уверен, почему весь этот код для простого переключения порядка сортировки JTable.

Смотри ниже:

При запуске:

введите здесь описание изображения

После двойного щелчка заголовка столбца Foo — один раз для фокуса (появится треугольник, показывающий направление), второй — для изменения порядка сортировки:

введите здесь описание изображения

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class Test {

    public Test() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

                Object rows[][] = {{"A", 1}, {"A", 2}, {"B", 1}, {"B", 2}, {"C", 1}, {"C", 2}, {"D", 4}, {"E", 5},
                    {"F", 6}};
                String columns[] = {"Foo", "Bar"};

                TableModel model = new DefaultTableModel(rows, columns) {
                    @Override
                    public Class getColumnClass(int column) {
                        Class returnValue;
                        if ((column >= 0) && (column < getColumnCount())) {
                            returnValue = getValueAt(0, column).getClass();
                        } else {
                            returnValue = Object.class;
                        }
                        return returnValue;
                    }
                };

                JTable table = new JTable(model);

                RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
                table.setRowSorter(sorter);

                table.setPreferredScrollableViewportSize(table.getPreferredSize());
                JScrollPane pane = new JScrollPane(table);

                frame.add(pane);

                frame.pack();
                frame.setVisible(true);

            }
        });
    }

    public static void main(String[] args) {
        new Test();
    }
}

Ссылки:

person David Kroukamp    schedule 30.06.2013
comment
Спасибо, но это был не мой вопрос. Я сортирую таблицу по разным критериям, если первый критерий одинаков в нескольких строках. Но когда я щелкаю заголовок таблицы столбца, он сортируется только по этому единственному столбцу. - person user1703554; 30.06.2013
comment
@user1703554 user1703554 Я тебя не понимаю. Вы хотите отсортировать данные таблицы, используя 2 столбца, а не только 1, как в моем примере выше? - person David Kroukamp; 30.06.2013
comment
@user1703554 user1703554 Как это вообще возможно? потому что строки будут иметь несовпадающие данные, поскольку все столбцы сортируются независимо? Например, возьмите приведенный выше код, если я отсортировал Foo в порядке возрастания, а Bar в порядке убывания, их пары будут смешаны как Foo - A равно Bar - 1, но теперь это Foo - A Bar - 6 - person David Kroukamp; 30.06.2013
comment
Нет, сначала он сортируется по Foo, и если есть, например. несколько записей A, затем они сортируются по Bar: A1 A2 B1 B2 C1 -> A2 A1 B2 B1 C1 в вашем примере. - person user1703554; 30.06.2013
comment
@user1703554 user1703554 Понятно, но код, который у меня есть, будет делать это по умолчанию, проверьте мой обновленный пост и снимки экрана. - person David Kroukamp; 30.06.2013
comment
Спасибо, я приму это. Я нашел другое решение и опубликовал его. - person user1703554; 30.06.2013
comment
@user1703554 например ответ на ваш вопрос - person mKorbel; 01.07.2013

Просто для полноты мое решение:

            @Override
            public void toggleSortOrder(int column) {

                List<? extends SortKey> sortKeys = getSortKeys();
                List<SortKey> newKeys = new ArrayList<SortKey>();
                if (sortKeys.size() > 0) {
                    if(column == 2) {

                        if (sortKeys.get(0).getSortOrder() == SortOrder.DESCENDING) {

                            newKeys.add(new SortKey(2, SortOrder.ASCENDING));
                            newKeys.add(new SortKey(1, SortOrder.ASCENDING));
                            newKeys.add(new SortKey(0, SortOrder.ASCENDING));

                            table.getRowSorter().setSortKeys(sortKeys);
                        } else {
                            newKeys.add(new SortKey(2, SortOrder.DESCENDING));
                            newKeys.add(new SortKey(1, SortOrder.DESCENDING));
                            newKeys.add(new SortKey(0, SortOrder.DESCENDING));

                            table.getRowSorter().setSortKeys(sortKeys);
                        }

                    } else if(column == 1) {
                        if (sortKeys.get(0).getSortOrder() == SortOrder.DESCENDING) {

                            newKeys.add(new SortKey(1, SortOrder.ASCENDING));
                            newKeys.add(new SortKey(0, SortOrder.ASCENDING));

                            table.getRowSorter().setSortKeys(sortKeys);
                        } else {
                            newKeys.add(new SortKey(1, SortOrder.DESCENDING));
                            newKeys.add(new SortKey(0, SortOrder.DESCENDING));

                            table.getRowSorter().setSortKeys(sortKeys);
                        }

                    }
                }


                sorter.setSortKeys(newKeys);
                    sorter.sort();
          }
person user1703554    schedule 30.06.2013