Сортировка с помощью пользовательского AbstractTableModel - PullRequest
1 голос
/ 06 ноября 2010

Я создал свой собственный класс, который расширяет AbstractTableModel. Идея состоит в том, чтобы иметь возможность хранить скрытый столбец «id». Следующий код хорошо работает для этой цели:

public class GuiTableModel extends AbstractTableModel {


List<Object[]> rowlist = new ArrayList<Object[]>();
List<String> colNames = new ArrayList<String>();

public void addRow(Object[] data) {
    rowlist.add(data);
}
public void addColumn(String name) {
    colNames.add(name);
}

public int getColumnCount() { 
    return colNames.size();
}

public int getRowCount() { 
    return rowlist.size();
}

public Object getValueAt(int row, int col) {
   return rowlist.get(row)[col];
}

@Override
public String getColumnName(int column) {
    return colNames.get(column);
}

@Override
public boolean isCellEditable(int rowIndex, int mColIndex) {
    return false;
}

Как вы можете видеть выше, это очень простая реализация. Проблема в том, что когда кто-то сортирует по столбцу, щелкая заголовок столбца в JTable, списки в AbstractTableModel не обновляются. Мне нужно, чтобы списки были синхронизированы с визуальным макетом.

Есть идеи, как мне это сделать?

Большое спасибо

Ответы [ 4 ]

1 голос
/ 06 ноября 2010

Я думаю, что вы ищете JTable.convertRowIndexToModel, как указано на Индексы строк JTable и DefaultTableModel теряют свою синхронизацию после сортировки JTable

Также, для более сложной сортировки и фильтрации попробуйте http://publicobject.com/glazedlists/

0 голосов
/ 06 ноября 2010

Проблема в том, что когда кто-то сортирует по столбцу, щелкая заголовок столбца в JTable, списки в AbstractTableModel не обновляются

И это именно такон должен работать.Данные в модели никогда не должны изменяться при сортировке или переупорядочении столбцов.Это только мнение, которое меняется.

Если вы хотите получить данные из таблицы, вам следует использовать:

table.getValueAt(row, column) 

, и вы получите правильное значение.Если вам нужно получить данные из модели напрямую, вам нужно использовать:

table.getModel().getValueAt(table.convertRowIndexToModel(row), column);

Идея состоит в том, чтобы иметь возможность хранить скрытый столбец "id".

Нет причин для создания собственной модели для этого.Просто сохраните все данные в DefaultTableModel.Затем вы можете удалить столбец «ID» из представления таблицы.

table.getColumnModel().removeColumn( table.getColumn("ID") );

В этом случае данные не отображаются, поэтому вы не можете использовать table.getValueAt (...).Вместо этого вы должны использовать table.getModel (). GetValueAt (...);

0 голосов
/ 06 ноября 2010

Почему бы не использовать JXTable ?Вы можете найти его здесь

0 голосов
/ 06 ноября 2010

, на мой взгляд, хорошим решением вашей проблемы является шаблон наблюдателя http://en.wikipedia.org/wiki/Observer_pattern

ваш класс должен реализовать интерфейс наблюдателя, чтобы отслеживать события, которые пользователь генерирует, нажимая на заголовок столбца

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