如何以最短的方式对JTable进行排序?

19

我在寻找如何对JTable进行排序,并参考了许多文章,但是找不到最简单的方法来对表格进行排序。我知道TableRowSorter可能会有所帮助,但不知道如何使用。作为JTable的新手,我在这里提出一个新问题。

我的表格结构大致如下

| People  | Place |   Organisation    | Event    | Mentions |
_____________________________________________________________
| Ramanuj | India | Tata Consultancy  | Party'14 |  500000  |
| Prankster | USA | Microsoft Pvt Ltd | Party'14 |  900000  |
我想在这里按照第4列(“Mentions”)对我的表进行降序排序。如果计数(Mentions)相同,则应按第1列(“People”)升序排序。
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);
2个回答

41
根据如何使用表格:排序和过滤
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);

更新

你确定它会排序吗?

...是的

Table

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);
     //...
 }

这将以“视图”(或排序)顺序向您提供数据...


是的。但要注意,对表示数字的String进行排序和对实际数字进行排序会得到不同的结果... - MadProgrammer
1
不,排序仅在视图层级上完成,完全不影响模型,这就是重点,也是非常重要的一点。 - MadProgrammer
但是我想将更新后的表格导出为新的csv文件。那么怎么做呢? - Pratik
1
而且表格已经排序了...沟通的意义是由接收者定义的,如果你不能提出清晰的问题,那就不要期望得到清晰的答案... - MadProgrammer
5
恕我直言,我只能回答你所提出的问题。在我提供答案后,你才提到你想要对数据进行排序或保存数据。我很想帮助你,但你必须明白答案必须与问题相符,否则可能会给那些寻求帮助来对JTable进行排序的人提供错误的答案,因为你未能提供适当的问题背景。在你开始责备其他自愿提供帮助的人之前,请正确分配责任。 - MadProgrammer
显示剩余13条评论

2

尝试使用这个

table.setAutoCreateRowSorter(true);

3
你能稍微详细地扩展一下你的回答吗?可以加入一些引言文字、JavaDoc链接并引用相关段落。此外,格式化示例代码会更好(只需在每行代码前添加至少4个空格)。 - DJDaveMark
1
这只允许用户点击列标题以按列排序。它不会自动按照此问题的要求在第四列上进行排序。 - camickr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接