How to get the column of a sort key used by JTable's RowSorter?

444 Views Asked by At

I have two JTables which share a TableModel.

This is so that I can set them up in a scroll pane such that one of them has a few columns showing on the left and does not scroll sideways, visually 'freezing' those columns, and the other contains the rest of the columns.

They are always sorted the same so that the rows match up. This is done using a RowSorter listener, shown below. (frozenTable and tableView are the names of my 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);
            }
        }
    }
};

At another point in my code, I want to be able to get the TableColumn objects that are currently being sorted on. Before I added the frozentable, I was able to do this with the following code:

List<? extends SortKey> sortKeys = tableView.getRowSorter().getSortKeys();

for(SortKey key : sortKeys){
    TableColumn column = tableView.getColumnModel().getColumn(key.getColumn());
    // other stuff in the loop
}

It seems as though a SortKey only has two things in it, a column index and a SortOrder. This raises two questions:

  1. How is my RowSorterListener even managing to sort the tables based on columns from one or the other table? If all I'm passing when I say 'setSortKeys' is 'sort by column 3' and column 3 is different for each JTable, then how is this working in the first place? Because it does work. If I have a Name column in the frozenTable and an Age column in the tableView and I sort by Age, it does sort both JTables by the Age column.
  2. How do I get the TableColumn object associated with a SortKey?
1

There are 1 best solutions below

2
On

Check out the Fixed Column Table which is a reusable class that allows you to share a model between two tables

The code to create the fixed column table is:

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

I don't think you need the sorter listener.

You should just be able to share the RowSorter using code something like:

table.setAutoCreateRowSorter(true);
fixed.setRowSorter(table.getRowSorter());
table.setUpdateSelectionOnSort(true);
fixed.setUpdateSelectionOnSort(false);