繁体   English   中英

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

[英]How do I speed up JTable built in table sorting?

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

table.setAutoCreateRowSorter(true);

该模型还从getColumnClass()调用返回每列的正确数据类,从我读取的内容应该确保完成最快的排序。

虽然它工作正常,并且确实是一种非常快速的方法来获取JTables中的排序,当行数达到5000多个条目时,它非常慢。 我的几乎10000行的表现在需要6-7秒才能在相当强大的计算机上排序。 但是,如果我在使用集合排序算法将数据添加到模型之前自己对数据进行排序,那么它将在几毫秒内完成!

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

我很想放弃整个内置分拣机,只是检测列标题点击,然后在执行fireTableDataChanged()之前自己对模型进行排序,这是内置分拣机应该完成的。

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

您是否尝试过使用GlazedLists库? 根据我的经验, 他们对JTable排序的支持非常有效。

在慢速计算机上正常工作:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM