Java JTable分拣机不工作

Java JTable分拣机不工作,java,swing,sorting,jtable,Java,Swing,Sorting,Jtable,我有一个非常简单的JTable,我想按列0升序排序。代码非常简单。但它无法对行进行正确排序。我想不出哪里出了问题。以下是我的代码: package test; import java.util.List; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.RowSorter; import javax.swing.SortOrder;

我有一个非常简单的JTable,我想按列0升序排序。代码非常简单。但它无法对行进行正确排序。我想不出哪里出了问题。以下是我的代码:

package test;

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 TableSorter {

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

    public TableSorter() {
        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[] {"X", "Y", }, 0);

            model.addRow(new Object[]{5, 8});
            model.addRow(new Object[]{10, 5});
            model.addRow(new Object[]{50, 60});
            model.addRow(new Object[]{100, 60});

            JTable table = new JTable(model);
            TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(table.getModel());
            table.setRowSorter(sorter);


            List<RowSorter.SortKey> sortKeys = new ArrayList<>();
            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);
            }
        });
    }

   }
任何帮助都将不胜感激。结果见附件。 提前感谢。

来自以下文档:

警告:DefaultTableModel返回对象的列类。什么时候 DefaultTableModel与TableRowSorter一起使用,这将导致 toString的广泛使用,这对于非字符串数据类型是 昂贵的如果将DefaultTableModel与TableRowSorter一起使用,则 强烈建议重写getColumnClass以返回 合适的类型

您需要覆盖表模型的getColumnClass,如下所示:

DefaultTableModel model =  new DefaultTableModel(new String[] {"X", "Y", }, 0)
{
        @Override
        public Class<?> getColumnClass(int column) 
        {
              Class<?> returnValue;
              if ((column >= 0) && (column < getColumnCount())) 
              {
                  returnValue = getValueAt(0, column).getClass();
              } 
              else 
              {
                 returnValue = Object.class;
              }

              return returnValue;

       };
    };
DefaultTableModel=new DefaultTableModel(新字符串[]{“X”,“Y”,“0”)
{
@凌驾
公共类getColumnClass(int列)
{
阶级价值;
如果((列>=0)和(&(列
在您的例子中,它正在比较整数的
Integer.toString()
,因此您看到的顺序是错误的。
通过重写
getColumnClass()
以返回
Integer
类型,您将获得整数的值比较。

该图像最好粘贴为文本。行排序器将数字排序为字符串。将列声明为type
Integer
&这应该可以解决问题。
DefaultTableModel model =  new DefaultTableModel(new String[] {"X", "Y", }, 0)
{
        @Override
        public Class<?> getColumnClass(int column) 
        {
              Class<?> returnValue;
              if ((column >= 0) && (column < getColumnCount())) 
              {
                  returnValue = getValueAt(0, column).getClass();
              } 
              else 
              {
                 returnValue = Object.class;
              }

              return returnValue;

       };
    };