Java 如何加快JTable内置表排序?

Java 如何加快JTable内置表排序?,java,sorting,performance,jtable,Java,Sorting,Performance,Jtable,我有一个带有自定义TableModel的JTable,它扩展了AbstractTableModel。我还通过调用以下命令使用了内置表排序: table.setAutoCreateRowSorter(true); 该模型还通过getColumnClass()调用为每一列返回正确的数据类,从我读取的数据中可以确保进行最快的排序 虽然它工作得很好,而且确实是在JTables中进行排序的一种非常快速的方法,但当行数达到5000+个条目时,它的速度异常缓慢。我的表有近10000行,现在需要6-7秒在一台

我有一个带有自定义TableModel的JTable,它扩展了AbstractTableModel。我还通过调用以下命令使用了内置表排序:

table.setAutoCreateRowSorter(true);
该模型还通过getColumnClass()调用为每一列返回正确的数据类,从我读取的数据中可以确保进行最快的排序

虽然它工作得很好,而且确实是在JTables中进行排序的一种非常快速的方法,但当行数达到5000+个条目时,它的速度异常缓慢。我的表有近10000行,现在需要6-7秒在一台功能相当强大的计算机上排序。但是,如果在使用集合排序算法将数据添加到模型之前,我自己对数据进行排序,则只需几毫秒

我怀疑内置分拣机正在为分拣机算法中进行的每一项“交换”触发大量不必要的事件,即使重新绘制在完成之前停止(内置分拣机显然在AWT线程中运行,因此锁定了整个GUI/重新绘制)。不过,我并没有通过查看表排序中的实际情况来分析这一点

我很想放下整个内置的分类器,只检测列标题的点击,然后自己对模型进行排序,然后再执行fireTableDataChanged(),这是内置分类器应该做的


但是在我这么做之前,我是否忽略了一些可以使内置分拣机快速的东西?

您是否尝试过使用GlazedList库?根据我的经验,这项技术非常有效。

在速度较慢的计算机上也适用:

import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableSort extends JFrame
{
    JTable table;
    DefaultTableModel model;

    public TableSort()
    {
        Random random = new Random();
        model = new DefaultTableModel(0, 2)
        {
            public Class getColumnClass(int column)
            {
                return Integer.class;
            }
        };

        for (int i = 0; i < 10000; i++)
        {
            Integer[] row = new Integer[2];
            row[0] = random.nextInt(100000);
            row[1] = random.nextInt(100000);
            model.addRow( row );
        }

        table = new JTable( model );
        table.setAutoCreateRowSorter(true);
        JScrollPane scrollPane = new JScrollPane( table );
        add( scrollPane );
        System.out.println(table.getRowCount());
    }

    public static void main(String[] args)
    {
        TableSort frame = new TableSort();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible(true);
    }
}
import java.awt.*;
导入java.util.*;
导入javax.swing.*;
导入javax.swing.table.*;
公共类表端口扩展了JFrame
{
JTable表;
默认表格模型;
公共表排序()
{
随机=新随机();
模型=新的DefaultTableModel(0,2)
{
公共类getColumnClass(int列)
{
返回Integer.class;
}
};
对于(int i=0;i<10000;i++)
{
整数[]行=新整数[2];
行[0]=random.nextInt(100000);
行[1]=random.nextInt(100000);
model.addRow(row);
}
表=新JTable(型号);
表.setAutoCreateRowSorter(真);
JScrollPane scrollPane=新的JScrollPane(表);
添加(滚动窗格);
System.out.println(table.getRowCount());
}
公共静态void main(字符串[]args)
{
TableSort frame=新TableSort();
frame.setDefaultCloseOperation(关闭时退出);
frame.pack();
frame.setVisible(true);
}
}

问题是您的自定义模型吗?

我想我可能已经找到了问题的原因是的,您是对的,很有可能是我的自定义模型。由于默认的表模型没有任何内置的过滤器,我已经实现了自己的过滤器,从可见行到实际行的映射似乎异常缓慢。我想我必须重建模型来维护两组行,这样我就不必进行这种映射。