Why does my JTable sort an integer column incorrectly?

后端 未结 4 946
情深已故
情深已故 2020-12-01 21:02

I have a JTable that uses a DefaultTableModel and I allow for sorting when the user clicks on the column headers. However, when the user clicks on a header for a column that

4条回答
  •  不知归路
    2020-12-01 21:51

    Try this little example.

    Sorted 1st column

    The better way

    As suggested by Kleopatra, defining a column class relevant for each, will be enough to get the data to be sorted correctly.

    import javax.swing.*;
    import javax.swing.table.*;
    import java.util.Comparator;
    
    class TableSorting {
        public static void main(String[] args) {
            Object[][] data = {
                {new Integer(1), "Don't Let Go", new Integer(179)},
                {new Integer(2), "Photograph", new Integer(29)},
                {new Integer(3), "Hash Pipe", new Integer(186)},
                {new Integer(4), "Island In The Sun", new Integer(200)},
                {new Integer(5), "Crab", new Integer(154)},
                {new Integer(6), "Knock-Down Drag-Out", new Integer(128)},
                {new Integer(7), "Smile", new Integer(158)},
                {new Integer(8), "Simple Pages", new Integer(176)},
                {new Integer(9), "Glorious Day", new Integer(160)},
                {new Integer(10), "O Girlfriend", new Integer(230)}
            };
            Object[] columns = {"Track #", "Title", "Length"};
            DefaultTableModel model = new DefaultTableModel(data,columns) {
                @Override
                public Class getColumnClass(int column) {
                    switch (column) {
                        case 0:
                            return Integer.class;
                        case 1:
                            return String.class;
                        case 2:
                            return Integer.class;
                        default:
                            return String.class;
                    }
                }
            };
            JTable table = new JTable(model);
            JScrollPane scroll = new JScrollPane(table);
            table.setAutoCreateRowSorter(true);
            JOptionPane.showMessageDialog(null, scroll);
        }
    }
    

    Original, using a comparator

    import javax.swing.*;
    import javax.swing.table.*;
    import java.util.Comparator;
    
    class TableSorting {
        public static void main(String[] args) {
            Object[][] data = {
                {new Integer(1), "Don't Let Go", new Integer(179)},
                {new Integer(2), "Photograph", new Integer(29)},
                {new Integer(3), "Hash Pipe", new Integer(186)},
                {new Integer(4), "Island In The Sun", new Integer(200)},
                {new Integer(5), "Crab", new Integer(154)},
                {new Integer(6), "Knock-Down Drag-Out", new Integer(128)},
                {new Integer(7), "Smile", new Integer(158)},
                {new Integer(8), "Simple Pages", new Integer(176)},
                {new Integer(9), "Glorious Day", new Integer(160)},
                {new Integer(10), "O Girlfriend", new Integer(230)}
            };
            Object[] columns = {"Track #", "Title", "Length"};
            JTable table = new JTable(data, columns);
            JScrollPane scroll = new JScrollPane(table);
            DefaultTableModel model = new DefaultTableModel(data,columns);
            TableRowSorter trs = new TableRowSorter(model);
    
            class IntComparator implements Comparator {
                public int compare(Object o1, Object o2) {
                    Integer int1 = (Integer)o1;
                    Integer int2 = (Integer)o2;
                    return int1.compareTo(int2);
                }
    
                public boolean equals(Object o2) {
                    return this.equals(o2);
                }
            }
    
            trs.setComparator(0, new IntComparator());
    
            table.setRowSorter(trs);
    
            scroll = new JScrollPane(table);
            table.setAutoCreateRowSorter(false);
            JOptionPane.showMessageDialog(null, scroll);
        }
    }
    

提交回复
热议问题