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

   }

Here is the result when I run the program

结果:

X    y
10   5
100  60
5    8
50   60

任何帮助将不胜感激。结果附后。 提前致谢。

最佳答案

来自 DefaultTableModel 的文档:

Warning: DefaultTableModel returns a column class of Object. When DefaultTableModel is used with a TableRowSorter this will result in extensive use of toString, which for non-String data types is expensive. If you use DefaultTableModel with a TableRowSorter you are strongly encouraged to override getColumnClass to return the appropriate type.

您需要重写表模型的 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;

       };
    };

在您的情况下,它正在比较整数上的 Integer.toString() ,因此您看到的顺序是错误的。 通过重写 getColumnClass() 以返回 Integer 类型,您将按整数值进行比较。

关于java - JTable 排序器不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44030032/

相关文章:

java - 如何设置不同类的 JFrame 大小

c++ - 在 C++ 中排序不匹配 'operator+'

java - 如何在多监视器配置中部署 JFrame

java - 为什么网格不遵守约束?

java - Java中的树遍历: Iterative or recursive?

java - 在 Swing JPanel 的布局属性中获取 X 和 Y 而不是水平/垂直尺寸

java - 如何对 HashSet 进行排序?

python 3 : values of a list change when it enters a for loop

java - 按类动态检索监听器实例

java - 仅获取加载时间 >= 1 秒的请求/响应 Java 中的 BrowserMob