在 JTable 中对 int 进行排序

Sort int in JTable

我想在 JTable 中对包含 int 的列进行排序。我使用 TableRowSorter 和排序顺序 SortOrder.ASCENDING。但不知何故,它并不是我真正想要的那样。

我想要的:

我得到的:

问题是什么?我该如何解决?

这是 SSCCE:

ResultGUI.java

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.*;
import javax.swing.table.*;

public class ResultGUI {

    protected static JTable ranglisteTable = new JTable();

    public static void main(String[] args){

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(100, 100, 368, 316);
        frame.setLayout(null);

        //MODEL
        Vector<Object> data = new Vector<Object>();     
        Vector<Object> row = new Vector<Object>();
        row.addElement(3);      
        data.addElement(row);
        Vector<Object> row2 = new Vector<Object>();
        row2.addElement(2);     
        data.addElement(row2);
        Vector<Object> row3 = new Vector<Object>();
        row3.addElement(1);     
        data.addElement(row3);
        Vector<Object> row4 = new Vector<Object>();
        row4.addElement(22);        
        data.addElement(row4);
        Vector<Object> row5 = new Vector<Object>();
        row5.addElement(13);        
        data.addElement(row5);              
        Vector<String> columnNames = new Vector<String>();
        columnNames.addElement("Points");   
        TableModel model = new DefaultTableModel(data, columnNames);        
        for(int i = 0; i < 10; i++){
            ranglisteTable.setRowHeight(i, 30);
        }

        ranglisteTable.setBounds(109, 0, 128, 277);
        ranglisteTable.setModel(model);

        //SORTING
        TableRowSorter<TableModel> sorter = new TableRowSorter<>(ranglisteTable.getModel());        
        ranglisteTable.setRowSorter(sorter);
        List<RowSorter.SortKey> sortKeys = new ArrayList<>();
        sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
        sorter.setSortKeys(sortKeys);
        sorter.sort();

        frame.add(ranglisteTable);

        frame.setVisible(true);
    }
}

你试试这个代码

import java.util.ArrayList;
import java.util.Date;
import javax.swing.DefaultRowSorter;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.SortOrder;

public class ResultGUI extends JFrame
{
    public ResultGUI()
    {
        String[] columnNames = {"points"};
        Object[][] data =
        {{ new Long(1)}, { new Long(2)},{ new Long(9) },{ new Long(4)}
        };

        final JTable table = new JTable(data, columnNames)
        {

            public Class getColumnClass(int column)
            {
                // Lookup first non-null data on column
                for (int row = 0; row < getRowCount(); row++) 
                {
                    Object o = getValueAt(row, column);

                    if (o != null)
                        return o.getClass();
                }

                return Object.class;
            }
        };
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        table.setAutoCreateRowSorter(true);
        // DefaultRowSorter has the sort() method
        DefaultRowSorter sorter = ((DefaultRowSorter)table.getRowSorter()); 
        ArrayList list = new ArrayList();
        list.add( new RowSorter.SortKey(0, SortOrder.ASCENDING) );
        sorter.setSortKeys(list);
        sorter.sort();
        JScrollPane scrollPane = new JScrollPane( table );
        getContentPane().add( scrollPane );
    }

    public static void main(String[] args)
    {
        ResultGUI frame = new ResultGUI();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }
}

您的 table 根本不知道您的数据包含数字,并且 DefaultTableModel 将每个列类型报告为 Object。但最终,您对 DefaultTableModel 的使用并不比实现您自己的 table 模型简单。只需将 //MODELTableModel model = new DefaultTableModel(data, columnNames); 之间的所有内容替换为:

    //MODEL
    final int[] data={ 3, 2, 1, 22, 13, };
    TableModel model = new AbstractTableModel() {
        public int getRowCount() {
            return data.length;
        }
        public int getColumnCount() {
            return 1;
        }
        public Object getValueAt(int rowIndex, int columnIndex) {
            if(columnIndex!=0) throw new IndexOutOfBoundsException();
            return data[rowIndex];
        }
        public String getColumnName(int column) {
            if(column!=0) throw new IndexOutOfBoundsException();
            return "Points";
        }
        public Class<?> getColumnClass(int columnIndex) {
            return Integer.class;
        }
    };

现在 getColumnClass 为您的唯一列报告 Integer.class 而不是 Object.class,它将正确排序。

尝试覆盖 DefaultTableModel 中的 getColumnClass 方法:

TableModel model = new DefaultTableModel(data, columnNames) {
        @Override
        public Class<?> getColumnClass(int columnIndex) {
            if (columnIndex == 0) return Integer.class;
            return super.getColumnClass(columnIndex);
        }
    };

如果不覆盖,JTable 会将第一列视为对象而不是整数。现在,它应该根据整数值排序。