首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何加快JTable内置表排序的速度?

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

Stack Overflow用户
提问于 2010-09-23 18:44:02
回答 2查看 1.9K关注 0票数 3

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

代码语言:javascript
复制
table.setAutoCreateRowSorter(true);

该模型还从getColumnClass()调用中为每一列返回正确的数据类,从我所读取的信息来看,这应该可以确保进行最快的排序。

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

我怀疑内置的排序程序正在为排序算法中进行的每一次“交换”项触发许多不必要的事件,即使重绘被暂停直到它完成(内置的排序程序显然是在AWT线程中运行的,因此锁定了整个GUI/重绘)。不过,我并没有通过查看表排序中实际发生的事情来分析这一点。

我想放弃整个内置的排序器,只检测列标题的点击,并在执行fireTableDataChanged()之前自己对模型进行排序,这是内置排序器应该做的事情。

但在我这么做之前,我是不是忽略了一些可以让内置分类器变得更快的东西呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-24 01:30:12

在运行速度较慢的计算机上运行良好:

代码语言:javascript
复制
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);
    }
}

这个问题是你的自定义模型吗?

票数 0
EN

Stack Overflow用户

发布于 2010-09-23 18:47:08

你试过使用GlazedLists库吗?根据我的经验,Their support for JTable sorting运行得很好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3777527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档