Как получить столбец ключа сортировки, используемый RowSorter JTable?
У меня есть две JTables, которые разделяют TableModel.
Это сделано для того, чтобы я мог настроить их на панели прокрутки, чтобы один из них имел несколько столбцов, показанных слева, и не прокручивался вбок, визуально "замораживая" эти столбцы, а другой содержал остальные столбцы.
Они всегда сортируются одинаково, так что строки совпадают. Это делается с помощью слушателя RowSorter, показанного ниже. (frozenTable и tableView - это имена моих JTables).
RowSorterListener rowSorterListener = new RowSorterListener() {
@Override
public void sorterChanged(RowSorterEvent e) {
if (RowSorterEvent.Type.SORT_ORDER_CHANGED == e.getType()) {
RowSorter source = e.getSource();
if (source == tableView.getRowSorter()) {
frozenTable.getRowSorter().removeRowSorterListener(this);
frozenTable.getRowSorter().setSortKeys(source.getSortKeys());
frozenTable.getRowSorter().addRowSorterListener(this);
} else {
tableView.getRowSorter().removeRowSorterListener(this);
tableView.getRowSorter().setSortKeys(source.getSortKeys());
tableView.getRowSorter().addRowSorterListener(this);
}
}
}
};
В другом месте моего кода я хочу иметь возможность получать объекты TableColumn, по которым в данный момент происходит сортировка. До того, как я добавил замороженную таблицу, я смог сделать это с помощью следующего кода:
List<? extends SortKey> sortKeys = tableView.getRowSorter().getSortKeys();
for(SortKey key : sortKeys){
TableColumn column = tableView.getColumnModel().getColumn(key.getColumn());
// other stuff in the loop
}
Кажется, что у SortKey есть только две вещи: индекс столбца и SortOrder. Это поднимает два вопроса:
- Как мой RowSorterListener даже удается сортировать таблицы на основе столбцов из одной или другой таблицы? Если все, что я передаю, когда говорю "setSortKeys" - это "сортировать по столбцу 3", а столбец 3 отличается для каждой JTable, то как это работает в первую очередь? Потому что это работает. Если у меня есть столбец Name в frozenTable и столбец Age в tableView, и я сортирую по возрасту, он сортирует обе JTables по столбцу Age.
- Как получить объект TableColumn, связанный с SortKey?
1 ответ
Посмотрите таблицу с фиксированными столбцами, которая является классом многократного использования, который позволяет вам поделиться моделью между двумя таблицами
Код для создания таблицы фиксированных столбцов:
JTable table = new JTable(...);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
JScrollPane scrollPane= new JScrollPane( table );
FixedColumnTable fct = new FixedColumnTable(2, scrollPane);
JTable fixed = fct.getFixedTable();
Я не думаю, что вам нужен слушатель сортировщика.
Вы должны просто иметь возможность поделиться RowSorter с помощью кода, например:
table.setAutoCreateRowSorter(true);
fixed.setRowSorter(table.getRowSorter());
table.setUpdateSelectionOnSort(true);
fixed.setUpdateSelectionOnSort(false);