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
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)
JTable.convertRowIndexToView()
restituirà un indice della riga nella vista in base all'indice nel modello. JTable.convertRowIndexToModel()
farà l'opposto.
@ Krishna Kumar: nessun problema. Ho appena realizzato di aver fornito una descrizione errata del metodo :) –
OK ... Ho appena fatto table.getRowSorter(). ConvertRowIndexToView (0) e il mio scopo è stato risolto ... :) –
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);
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
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. –