我有一个带有自定义TableModel的JTable,它扩展了AbstractTableModel。我还通过调用以下命令使用了内置的表排序:
table.setAutoCreateRowSorter(true);该模型还从getColumnClass()调用中为每一列返回正确的数据类,从我所读取的信息来看,这应该可以确保进行最快的排序。
虽然它工作得很好,而且确实是在JTables中进行排序的一种非常快速的方法,但当行数达到5000+条目时,它会异常缓慢。我的表有近10000行,现在在一台功能相当强大的计算机上排序需要6-7秒。但是,如果在使用集合排序算法将数据添加到模型之前,我自己对数据进行排序,那么只需要几毫秒就可以完成!
我怀疑内置的排序程序正在为排序算法中进行的每一次“交换”项触发许多不必要的事件,即使重绘被暂停直到它完成(内置的排序程序显然是在AWT线程中运行的,因此锁定了整个GUI/重绘)。不过,我并没有通过查看表排序中实际发生的事情来分析这一点。
我想放弃整个内置的排序器,只检测列标题的点击,并在执行fireTableDataChanged()之前自己对模型进行排序,这是内置排序器应该做的事情。
但在我这么做之前,我是不是忽略了一些可以让内置分类器变得更快的东西呢?
发布于 2010-09-24 01:30:12
在运行速度较慢的计算机上运行良好:
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);
}
}这个问题是你的自定义模型吗?
发布于 2010-09-23 18:47:08
你试过使用GlazedLists库吗?根据我的经验,Their support for JTable sorting运行得很好。
https://stackoverflow.com/questions/3777527
复制相似问题