Как получить столбец ключа сортировки, используемый 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. Это поднимает два вопроса:

  1. Как мой RowSorterListener даже удается сортировать таблицы на основе столбцов из одной или другой таблицы? Если все, что я передаю, когда говорю "setSortKeys" - это "сортировать по столбцу 3", а столбец 3 отличается для каждой JTable, то как это работает в первую очередь? Потому что это работает. Если у меня есть столбец Name в frozenTable и столбец Age в tableView, и я сортирую по возрасту, он сортирует обе JTables по столбцу Age.
  2. Как получить объект 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);
Другие вопросы по тегам