Как ускорить JTable встроенную сортировку таблиц? - PullRequest
3 голосов
/ 23 сентября 2010

У меня есть JTable с пользовательской TableModel, которая расширяет AbstractTableModel. Я также использовал встроенную сортировку таблиц, вызвав:

table.setAutoCreateRowSorter(true);

Модель также возвращает правильный класс данных для каждого столбца из вызова getColumnClass (), который из того, что я прочитал, должен обеспечить самую быструю сортировку.

Хотя он работает нормально и действительно является очень быстрым способом сортировки в JTables, он исключительно медленный, когда число строк достигает 5000+ записей. Моя таблица из почти 10000 строк теперь занимает 6-7 секунд для сортировки на довольно мощном компьютере. Но если я сам сортирую данные перед добавлением их в модель с использованием алгоритма сортировки коллекций, это делается за несколько миллисекунд!

Я подозреваю, что встроенный сортировщик запускает много ненужных событий для каждого "обмена" элементов, происходящего в алгоритме сортировщика, даже если перерисовка останавливается до его завершения (встроенный сортировщик, очевидно, запускается в потоке AWT и, следовательно, блокирует весь графический интерфейс / перекрашивание). Я не проанализировал это, глядя на то, что на самом деле происходит в сортировке таблиц.

Я испытываю искушение отбросить весь встроенный сортировщик и просто обнаруживать щелчки заголовка столбца и просто сам сортировать модель перед выполнением fireTableDataChanged (), что и должен был сделать встроенный сортировщик.

Но прежде чем я это сделаю, я пропускаю что-то, что может сделать встроенный сортировщик быстрым?

Ответы [ 2 ]

1 голос
/ 23 сентября 2010

Вы пытались использовать библиотеку GlazedLists? Их поддержка сортировки JTable работает очень хорошо в моем опыте.

0 голосов
/ 23 сентября 2010

Работает нормально для меня на медленном компьютере:

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

Проблема в вашей пользовательской модели?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...