2012-05-31 2 views
1

Когда таблица находится в режиме сортировки (с использованием RowSorter), кажется, что большую часть времени таблица сортируется в реальном времени. Например, всякий раз, когда я добавляю новые строки, таблица сортируется автоматически (кроме редактируемой ячейки). Мне интересно, есть ли способ отключить это поведение сортировки в реальном времени.не в реальном времени/не в реальном времени сортировка JTable

Что я хочу сделать следующее: После сортировки таблицы, как по восходящей, так и по убыванию, сортировщик сохраняет текущее состояние сортировки и останавливает сортировку в реальном времени. Затем можно добавить новые строки внизу, а выбранная строка может перемещаться вверх и вниз, а таблица обновляет все изменения в модели вида.

@trashgod: спасибо за ваш ответ. Я действительно добрый, как родной метод roworter, так как я могу окружить состояние столбца в трех-состоянии (восходящем, нисходящем и несортированном). Если вы используете Collections.sort, мне придется создать переменную, чтобы сохранить исходный порядок строк, прежде чем сортировать его каждый раз.

ответ

2

Вы можете заказать строки вашего TableModel независимо от RowSorter использования Collections.sort() и пользовательские Comparator, такие, как показано here, который может принимать параметр, указывающее направление сортировки.

enum Sort { ASCENDING, DESCENDING; } 
class RecordComparator implements Comparator<Record> { 
    public RecordComparator(Sort sort, ...) { ... } 
} 
+0

благодарит за ваш ответ.Я действительно добрый, как родной метод roworter, так как я могу окружить состояние столбца в трех-состоянии (восходящем, нисходящем и несортированном). Если вы используете Collections.sort, мне придется создать переменную, чтобы сохранить исходный порядок строк, прежде чем сортировать его каждый раз. – user1429552

+0

Используйте 'setSortKeys (null)', чтобы указать, что представление должно быть несортировано; это не зависит от заказа вашей модели. – trashgod

+0

Это то, что я использую, чтобы окружить состояния порядка. Но, когда в восходящем и нисходящем режимах (несортировано отлично), переупорядочивание строк будет отменено сортировщиком. Как я уже упоминал, использование Collection.sort() изменит порядок реальной модели таблицы, тогда, если я хочу округлить до исходного порядка, мне нужно что-то, чтобы сохранить это в первую очередь. нет уверенности в том, что для этого есть лучшее решение. – user1429552

0

Похоже, что вы хотите, чтобы иметь возможность отсортировать таблицу, но затем иметь возможность добавить несколько строк без порядка сортировки таблицы изменяется. Даже если это возможно, вам придется переписать DefaultRowSorter и TableRowSorter (источник доступен для обоих). Причина в том, что текущая реализация предназначена для сохранения последовательного порядка сортировки (без учета того, когда строки были добавлены). Вероятно, вы не сможете расширить TableRowSorter, чтобы преодолеть эту проблему, поскольку у родительского класса есть много частных функций, связанных с дизайном, который я только что описал.

То, что я описал выше, является чистым способом. Вот еще один способ сделать это, сделать это каждый раз, когда вы хотите, чтобы вставить новую строку:

  1. Сохранить текущий порядок сортировки представления в карте. Я использовал hashmap (postion), чтобы сопоставить каждый объект в строке i столбца сортировки с его позицией в представлении. position.put(tableModel.getValueAt(i, column), sorter.convertRowIndexToView(i));

  2. Создайте компаратор, который будет использовать созданную выше карту для сортировки входящих данных. Установите столбец-компаратор TableRowSorter для вновь созданного компаратора. Затем вызовите sorter.sort(), что необходимо, потому что DefaultRowSorter необходимо кэшировать компаратор. Компаратор поместит существующие объекты в их текущее положение и поместит новые объекты (созданные во время вставки) в конце.

  3. Выполнить ввод строки в таблицу. В моем коде я добавляю 3 случайных значения Integer, Boolean и Double в 3 столбца в моей таблице.

  4. Удалите компаратор, добавленный в # 3, установив значение в значение null, sorter.setComparator(sortKeys.get(0).getColumn(), null); Таким образом, в следующий раз, когда сортировка переключится на столбец, он будет использовать компаратор по умолчанию вместо фиктивного.

Полный код приведен ниже. Он предназначен для добавления строки в таблицу при каждом нажатии кнопки. Обратите внимание, что я не тестировал это с помощью sortkeys> 1 или фильтров (я оставлю это вам). Дайте мне знать, что вы думаете об этом взломе.

private void insertRowButtonActionPerformed(java.awt.event.ActionEvent evt) { 
    TableRowSorter<TableModel> sorter = (TableRowSorter<TableModel>)jTable1.getRowSorter(); 
    final HashMap<Object, Integer> position = new HashMap<Object, Integer>(); 
    List<? extends SortKey> sortKeys = sorter.getSortKeys(); 

    if(!sortKeys.isEmpty()){ 
     SortKey sortKey = sortKeys.get(0); 
     int column = sortKey.getColumn(); 
     TableModel tableModel = sorter.getModel(); 
     int n = sorter.getModelRowCount(); 
     final SortOrder sortOrder = sortKey.getSortOrder(); 
     for(int i=0;i<n;i++){ 
      position.put(tableModel.getValueAt(i, column), sorter.convertRowIndexToView(i)); 
     } 
     //add dummy comparator 
     sorter.setComparator(column, new Comparator<Object>(){ 
      public int compare(Object o1, Object o2) { 
       int obj1Position = position.containsKey(o1) ? position.get(o1):position.size(); 
       int obj2Position = position.containsKey(o2) ? position.get(o2):position.size(); 
       return sortOrder == SortOrder.DESCENDING ? obj2Position - obj1Position:obj1Position - obj2Position; 
      } 
     }); 
     sorter.sort(); 
    } 

    /////////////insert row/////////////////// 
    DefaultTableModel tableModel = (DefaultTableModel)jTable1.getModel(); 
    tableModel.addRow(new Object[]{rand.nextInt(), rand.nextBoolean(), rand.nextDouble()}); 
    /////////////end insert row/////////////// 

    //remove dummy comparator 
    if(!sortKeys.isEmpty()){ 
     sorter.setComparator(sortKeys.get(0).getColumn(), null); 
    } 
}