JTable repaint()

When I call the repaint() method of JTable, the row selection is vanished. I would like to restore the selection status.
Holding the selected rows indices is a bad idea, since their order might be changed after repainting (if the table is sorted, for example).
Any idea?
LVL 2
s_lavieAsked:
Who is Participating?
 
heyhey_Connect With a Mentor Commented:
> since their order might be changed after repainting

WRONG. you never need to call repaint() - all you have to do is make changes inside your models (TableModel, SelectionModel) and fire appropriate events. TableUI will handle these events and repaints itself if needed.
0
 
objectsCommented:
> When I call the repaint() method of JTable,
> the row selection is vanished.

Then the row must no longer be selected.
0
 
s_lavieAuthor Commented:
Okay, no more calling to repaint() and the selection is not vanished, but the wrong line is now selected, i.e. for example I have a table like this:

0     a
1     b
2     c
3     d

Now, suppose row index 1 is selected (1     b), when I sort the table it looks like this:

3     d
2     c
1     b
0     a

And again row index 1 is selected (2     c), whereas row number 3 is supposed to be selected ((1     b) as before).

Now, what do I miss here, and how I fix it?
0
Cloud Class® Course: Python 3 Fundamentals

This course will teach participants about installing and configuring Python, syntax, importing, statements, types, strings, booleans, files, lists, tuples, comprehensions, functions, and classes.

 
s_lavieAuthor Commented:
In row number 3 I meant row index 2
0
 
objectsCommented:
How's your sort implemented?
0
 
s_lavieAuthor Commented:
In MyTableModel (that extends DefaultTableModel) I have a sort method:

public void sortTable(JTable table, Comparator comparator)
{
     for (int i = 0; i < getColumnCount(); i++)
     {
          TableColumn column = colModel.getColumn(i);
          column.setHeaderValue(getColumnName(column.getModelIndex()));     // getColumnName() is overriding the getColumnName() in DefaultTableModel.
     }
     table.getTableHeader().repaint();

     Collections.sort(dataVector, comparator);
}
0
 
objectsCommented:
You're not firing any event informing listenerer that you have changed the model.
0
 
heyhey_Commented:
and another thing - the overall algorithm should be:

- save the selected row id
- sort
- find the new index for the row with saved id
- select this index.
0
 
objectsCommented:
I actually think the selection model listens to the table model, and updates itself. (But I could be wrong).
0
 
heyhey_Commented:
> I actually think the selection model listens to the table model

I agree, but when you sort the table the only possible event to throw is

TableModelEvent(source, 0, max, ALL_COLUMNS, UPDATE);

and SelectionModel will use the same selection index.
0
 
s_lavieAuthor Commented:
I added the line:
table.tableChanged(new TableModelEvent(this, 0, table.getRowCount() - 1, TableModelEvent.ALL_COLUMNS, TableModelEvent.UPDATE));
After the line:
Collections.sort(dataVector, comparator);

> - save the selected row id
> - sort
> - find the new index for the row with saved id
> - select this index.

That's exactly what I was afraid of:
Find the new index for the row with saved id is quiet heavy isn't it? it means for every selected row I have to run over the entire table!
0
 
heyhey_Commented:
> That's exactly what I was afraid of:

you have to find out the new index for the selected row somehow - there isn't magic solution :)
0
 
s_lavieAuthor Commented:
Do you have any intelligent solution for saving and finding those indices?
0
 
heyhey_Commented:
ok, let's define the REAL problem:

- you have collection of Objects;
- you rearrange (sort) the items in the collection;
- you want to find the new index for some item, given the old index.

I cannot think of any good solution right now, but maybe somebody else will be able to help you
0
 
heyhey_Commented:
hey, thanks for the points !
0
 
s_lavieAuthor Commented:
You earned them!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.