【问题标题】:How to sort JTable in shortest way?如何以最短的方式对 JTable 进行排序?
【发布时间】:2015-05-03 14:58:45
【问题描述】:

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

我的表结构是这样的

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

我在这里想要的是根据第 4 列(“提及”)对我的表进行降序排序。如果计数(提及)相同,则应按第一列(“人物”)升序排序

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);

【问题讨论】:

    标签: java swing sorting jtable tablerowsorter


    【解决方案1】:

    根据How to Use Tables: Sorting and Filtering

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

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

    【讨论】:

    • 你确定它会排序吗?因为我只尝试了我的第 4 列,保持 DESCENDING,并检查了 TableModel。它还是一样的。我需要刷新吗?
    • 是的。但请注意,对String(表示数字)进行排序和对实际数字进行排序会产生不同的结果...
    • 不,排序只在视图级别完成,完全不影响模型,这是重点,也是非常重要的一点
    • 并且表格是排序的...交流的意义是接收者定义的,相对而言,如果你不能问一个明确的问题,那就不要期待一个明确的答案...
    • 恕我直言,我只能回答您提出的问题。您没有提到您想要对数据进行排序,或者您想要在事后保存数据,直到我提供答案之后。我很乐意为您提供帮助,但您需要了解答案必须反映问题,否则可能正在寻找帮助对JTable 进行排序的其他人可能会得到错误的答案,因为您未能提供适当的上下文这个问题。在你开始责备其他自愿提供帮助的人之前,请以正确的比例接受部分责备
    【解决方案2】:

    尝试使用这个

    table.setAutoCreateRowSorter(true);
    

    【讨论】:

    • 你能把你的答案扩大一点吗?也许添加一些介绍性文字、JavaDoc 的链接并引用相关段落。还可以格式化示例代码(只需在每行代码前添加至少 4 个空格)。
    • (1-) 这仅允许用户单击列标题以按列排序。根据本题的要求,它不会自动在第 4 列排序。
    猜你喜欢
    • 2021-10-02
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多