Как кратчайшим образом отсортировать JTable?

Я искал "Сортировка в JTable" и сослался на множество статей, но не смог найти самый простой способ отсортировать таблицу. Я также знаю, что TableRowSorter может быть чем-то полезным, но не знаю как. Поскольку я новичок в JTable, я создаю здесь новый вопрос.

Моя структура таблицы примерно такая

| People  | Place |   Organisation    | Event    | Mentions |
_____________________________________________________________
| Ramanuj | India | Tata Consultancy  | Party'14 |  500000  |
| Prankster | USA | Microsoft Pvt Ltd | Party'14 |  900000  |

Я хочу отсортировать мою таблицу по убыванию на основе 4-го столбца («Упоминания»). Если количество (упоминаний) одинаковое, он должен отсортировать по возрастанию по 1-му столбцу («Люди»).

CSVReader reader = new CSVReader(new FileReader(file)); 

List<String[]> myEntries = reader.readAll();
String[][] rowData = myEntries.toArray(new String[0][]);

String[] columnNames = { "People", "Place", "Organisation", "Event", "Mentions" };

DefaultTableModel tableModel = new DefaultTableModel(rowData, columnNames);

person Pratik    schedule 03.03.2015    source источник


Ответы (2)


Согласно Как использовать таблицы: сортировка и фильтрация

JTable table = new JTable(tableModel);
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(table.getModel());
table.setRowSorter(sorter);

List<RowSorter.SortKey> sortKeys = new ArrayList<>(25);
sortKeys.add(new RowSorter.SortKey(4, SortOrder.ASCENDING));
sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
sorter.setSortKeys(sortKeys);

Обновлено

Вы уверены, что отсортируются?

...Да

Таблица

import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                DefaultTableModel model = new DefaultTableModel(new String[]{"People", "Place", "Organisation", "Event", "Mentions"}, 0);
                model.addRow(new Object[]{"Prankster", "USA", "Microsoft Pvt Ltd", "Party'14", 900000});
                model.addRow(new Object[]{"Ramanuj", "India", "Tata Consultancy", "Party'14", 500000});
                model.addRow(new Object[]{"Banana", "India", "Tata Consultancy", "Party'14", 500000});

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

                List<RowSorter.SortKey> sortKeys = new ArrayList<>(25);
                sortKeys.add(new RowSorter.SortKey(4, SortOrder.ASCENDING));
                sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
                sorter.setSortKeys(sortKeys);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

Обновлено

Вы можете напрямую извлекать данные из представления ...

 for (int row = 0; row < table.getRowCount(); row++) {
     String people = table.getValueAt(row, 0).toString();
     String place = table.getValueAt(row, 1).toString();
     String organisation = table.getValueAt(row, 2).toString();
     String event = table.getValueAt(row, 3).toString();
     int mentions = (int)table.getValueAt(row, 4);
     //...
 }

Это даст вам данные в «просмотре» (или отсортированном) порядке ...

person MadProgrammer    schedule 03.03.2015
comment
Вы уверены, что отсортируются? Потому что я пробовал только свой столбец 4, сохраняя DESCENDING, и проверил TableModel. Это все то же самое. Мне нужно обновить что ли? - person Pratik; 03.03.2015
comment
да. Но будьте осторожны, сортировка String (который представляет собой число) и сортировка фактического числа даст разные результаты ... - person MadProgrammer; 03.03.2015
comment
Я проверяю наведение на переменную модели. То же самое и там. Не отразится ли там? Если нет, где я могу увидеть обновленный? - person Pratik; 03.03.2015
comment
Нет, сортировка производится ТОЛЬКО на уровне представления, на модель она никак не влияет, это очень важный момент. - person MadProgrammer; 03.03.2015
comment
Но я хочу экспортировать обновленную таблицу в новый CSV. Так как? - person Pratik; 03.03.2015
comment
Создайте простой старый объект Java (POJO), который представляет собой одну строку ваших данных. Проанализируйте файл CSV, создав POJO для каждой строки, поместите их в какой-либо List и используйте Collections.sort для их сортировки, используя пользовательский Comparator. Дополнительные сведения см. В Collections Trail. - person MadProgrammer; 03.03.2015
comment
Также, с уважением, поймите, что ваш вопрос касается того, как отсортировать JTable, он не упомянул все эти другие требования ... - person MadProgrammer; 03.03.2015
comment
Арр ... Вот почему я говорю, что не могу найти самый простой способ :( Можете ли вы обновить свой ответ, чтобы он мог изменить сортировку в самой модели? - person Pratik; 03.03.2015
comment
Нет, пока вы не измените вопрос так, чтобы он задавал соответствующий вопрос, подробно описывая, чего вы пытаетесь достичь и что вы пытались ... - person MadProgrammer; 03.03.2015
comment
С уважением, я попросил отсортировать таблицу, не просил, чтобы она была отсортирована только в части просмотра. Если не можешь, пожалуйста, не надо. - person Pratik; 03.03.2015
comment
И таблица отсортирована ... Смысл общения определяет получатель, с уважением, если не можете задать четкий вопрос, то и не ждите четкого ответа ... - person MadProgrammer; 03.03.2015
comment
Я собирался поблагодарить вас, но я чувствую, что люди вроде вас не могут уважать портал stackoverflow. Спасибо за вашу помощь. Если вы здесь только для того, чтобы набрать голоса, я могу вам передать. До свидания. tc - person Pratik; 03.03.2015
comment
При всем уважении, я могу ответить только на тот вопрос, который вы задаете. Вы не упомянули, что хотите отсортировать данные или что вы хотите сохранить данные постфактум, пока ПОСЛЕ того, как я не дал ответ. Я хотел бы помочь вам, но вы должны понимать, что ответы ДОЛЖНЫ отражать вопрос, в противном случае другие люди, которые могут искать помощи в сортировке JTable, могут получить НЕПРАВИЛЬНЫЙ ответ, потому что вы не смогли предоставить соответствующий контекст для вопроса . Прежде чем вы начнете обвинять других людей, которые добровольно пытаются помочь, примите часть вины в правильном соотношении. - person MadProgrammer; 03.03.2015
comment
ps- Я просил вас обновить ЭТО вопрос, чтобы он отражал ваши потребности, а не задавал еще один;) - person MadProgrammer; 03.03.2015
comment
Спасибо, братан, но я просто скопировал данные модели в новый CSV с помощью цикла. Но большое спасибо за вашу помощь. Вы не знаете, сколько времени вы сэкономили мне. Спасибо еще раз. :) - person Pratik; 03.03.2015
comment
Если вы можете немного обновить вопрос, заявив, что хотите отсортировать данные / сохранить их на потом, я могу добавить другой способ сортировки данных ... - person MadProgrammer; 03.03.2015
comment
Спасибо, братан, за добавление дополнительных деталей :) - person Pratik; 03.03.2015
comment
Я надеюсь, что все это хоть немного поможет;) - person MadProgrammer; 03.03.2015

Попробуйте использовать это

table.setAutoCreateRowSorter(true);
person sydney almighty    schedule 14.05.2020
comment
Не могли бы вы немного расширить свой ответ, пожалуйста? Может быть, добавить вводный текст, ссылку на JavaDoc и процитировать соответствующий отрывок. Также было бы неплохо отформатировать пример кода (просто добавьте не менее 4 пробелов перед каждой строкой кода). - person DJDaveMark; 14.05.2020
comment
(1-) Это позволяет пользователю только щелкнуть заголовок столбца для сортировки по столбцу. Он не выполняет автоматическую сортировку по 4-му столбцу в соответствии с требованиями этого вопроса. - person camickr; 24.05.2021