2010-11-11 6 views
10

Ho una tabella J che ha una prima riga vuota. Ora, quando ordino la tabella in base a una colonna, facendo clic su quella colonna, la riga vuota va in basso. Se inserisco qualcosa nella riga vuota e faccio l'ordinamento, la riga viene posizionata di conseguenza. Come faccio a tenere traccia del suo indice di riga anche quando è ordinato. Ho bisogno di accedere a quella riga, ma se l'utente fa l'ordinamento, quindi perdere l'indice di riga in quanto non è più la prima riga.Come tenere traccia dell'indice di riga quando JTable è stato ordinato dall'utente?

risposta

14

Supponendo che si sta utilizzando il TableRowSorter roba aggiunto in Java 6, penso che quello che avete bisogno di guardare sono i metodi convertRowIndexToModel e convertRowIndexToView nel RowSorter classe. Faresti fare qualcosa di simile

table.getRowSorter().convertRowIndexToView(0)

per scoprire quale indice di riga visibile è in realtà riga di indice 0 dal modello.

Modifica: come indicato da Tulskiy nei commenti, ciò potrebbe causare una NullPointerException se alla tabella non è assegnato alcun ordinatore di righe. Meglio utilizzare i metodi direttamente su JTable, ad es. table.convertRowIndexToView(0)

+1

Sembra che tulskiy abbia sottolineato che puoi semplicemente chiamare table.convertRowIndexToView, che inoltrerà comunque la chiamata al rowSorter, ma è più conveniente. Non ho molta familiarità con queste API - Sono abituato a scrivere l'ordinamento personalizzato prima di Java 6 ... yech: p – heavi5ide

+0

il tuo codice può dare un NPE se non è stato definito alcun sorter ... e ho avuto troppi problemi con ordinamento integrato e modello di tabella personalizzato per evitarlo in futuro. –

12

JTable.convertRowIndexToView() restituirà un indice della riga nella vista in base all'indice nel modello. JTable.convertRowIndexToModel() farà l'opposto.

+0

@ Krishna Kumar: nessun problema. Ho appena realizzato di aver fornito una descrizione errata del metodo :) –

+0

OK ... Ho appena fatto table.getRowSorter(). ConvertRowIndexToView (0) e il mio scopo è stato risolto ... :) –

0

SOLUZIONE 1

C'è qualche problema quando si utilizza jTable1.convertRowIndexToModel(jTable1.getSelectedRow()) se si ordinano i valori in base alla data o l'ora restituirà valori errati dal convertRowIndexToView(0) quindi utilizzare convertRowIndexToModel(0).

SOLUZIONE 2

Questo recupererà dal nuovo modello quando ordinate.

jTable1.getValueAt(jTable1.getSelectedRow(), 0); 

Questo recupererà il valore in base all'indice originale anche se ordinato.

((DefaultTableModel)jTable1.getModel()).getValuAt(jTable1.getSelectedRow(), 0); 
Problemi correlati