添加行后对 JTable 进行排序

Sorting JTable after adding rows

我必须在添加新行后对 JTable (Object[][] data, Object[] headers) 进行排序。

这是代码(不起作用)

public class Window extends JFrame {
    Window() {
        super();
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JTable table = new JTable();
        table.setModel(new DefaultTableModel(null, new String[]{"col1"}));
        TableRowSorter<TableModel> sorter = new TableRowSorter<>(table.getModel());
        sorter.setComparator(0, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });
        sorter.setSortsOnUpdates(true);
        table.setRowSorter(sorter);

        DefaultTableModel model = (DefaultTableModel)table.getModel();
        model.addRow(new String[] {"A"});
        model.addRow(new String[] {"C"});
        model.addRow(new String[] {"B"});

        this.getContentPane().add(table);
        pack();
        setVisible(true);
    }

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

输出结果:table (A, C, B),预期 (A, B, C)

模型 - 默认表模型
设备表 - Jtable

model.fireTableDataChanged();

不要直接调用 fireXXX() 方法。

TableModel 有责任调用适当的方法(在本例中为 fireTableRowsInserted)。

编辑:

摆脱创建排序器和比较器的代码。

您只需让 table 创建分类器。但是一旦你这样做了,你需要告诉排序器要排序哪一列:

table.setAutoCreateRowSorter(true);
((DefaultRowSorter)table.getRowSorter()).toggleSortOrder(0);

根据您的示例,您需要定义一个排序键,否则 table 实际上未排序...

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

以下示例(基于您的示例)对第一列进行排序。当您点击按钮时,它会添加行,然后对这些行进行排序

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
import javax.swing.SwingUtilities;
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() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                JTable table = new JTable();
                table.setModel(new DefaultTableModel(null, new String[]{"col1"}));
                TableRowSorter<TableModel> sorter = new TableRowSorter<>(table.getModel());
                sorter.setComparator(0, new Comparator<String>() {
                    @Override
                    public int compare(String o1, String o2) {
                        return o1.compareTo(o2);
                    }
                });
                sorter.setSortsOnUpdates(true);
                List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
                sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
                sorter.setSortKeys(sortKeys);
                table.setRowSorter(sorter);

                JButton btn = new JButton("...");
                btn.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        DefaultTableModel model = (DefaultTableModel) table.getModel();
                        model.addRow(new String[]{"A"});
                        model.addRow(new String[]{"C"});
                        model.addRow(new String[]{"B"});
                    }
                });

                frame.add(new JScrollPane(table));
                frame.add(btn, BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}