• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1673
  • Last Modified:

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?
0
s_lavie
Asked:
s_lavie
  • 6
  • 6
  • 4
1 Solution
 
heyhey_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
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 
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

Featured Post

The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

  • 6
  • 6
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now