2010-11-11 11 views
10

Mam JTable, który ma puste wiersza 1st. Teraz, kiedy sortuję tabelę w oparciu o kolumnę, klikając tę ​​kolumnę, pusty wiersz jest u dołu. Jeśli wstawię coś do pustego wiersza i wykonam sortowanie, wiersz zostanie odpowiednio umieszczony. Jak śledzić indeks wiersza, nawet jeśli jest on sortowany. Potrzebuję dostępu do tego wiersza, ale jeśli użytkownik sortuje, tracę indeks wiersza, ponieważ nie jest to już pierwszy wiersz.Jak śledzić indeks wiersza, gdy JTable zostało posortowane przez użytkownika?

Odpowiedz

14

Zakładając, że używasz rzeczy TableRowSorter dodaną w Javie 6, myślę, że to, co trzeba spojrzeć na to sposoby convertRowIndexToModel i convertRowIndexToView w RowSorter klasy. Można by zrobić coś takiego

table.getRowSorter().convertRowIndexToView(0)

aby dowiedzieć się, który wskaźnik widoczny wiersz jest rzeczywiście indeksu rzędu 0 od modelu.

Edytuj: Jak zauważył Tulskiy w komentarzach, może to spowodować wyjątek NullPointerException, jeśli do tabeli nie zostanie przypisany żaden sorter rzędów. Lepiej używać metod bezpośrednio w JTable, np. table.convertRowIndexToView(0)

+1

Wygląda jak tulskiy wskazał, że możesz po prostu wywołać table.convertRowIndexToView, który po prostu przekazuje dalej połączenie do rowSorter, ale jest wygodniejszy. Nie znam się zbyt dobrze na tych API - jestem przyzwyczajony do pisania niestandardowego sortowania przed Java 6 ... yech: p – heavi5ide

+0

twój kod może dać NPE, jeśli nie zdefiniowano sortera ... i miałem zbyt wiele problemów z wbudowany sortujący i niestandardowy model tabeli, aby uniknąć tego w przyszłości. –

12

JTable.convertRowIndexToView() spowoduje wyświetlenie indeksu wiersza w widoku na podstawie indeksu w modelu. JTable.convertRowIndexToModel() zrobi się odwrotnie.

+0

@Krishna Kumar: bez problemu. Właśnie zdałem sobie sprawę, że podałem zły opis metody :) –

+0

Jest OK ... Właśnie zrobiłem table.getRowSorter(). ConvertRowIndexToView (0) i mój cel został rozwiązany ... :) –

0

ROZWIĄZANIE 1

Jest jakiś problem przy korzystaniu jTable1.convertRowIndexToModel(jTable1.getSelectedRow()) jeśli sortować według wartości daty lub czasu powróci niepoprawne wartości z convertRowIndexToView(0) zatem wykorzystać convertRowIndexToModel(0).

ROZWIĄZANIE 2

Pozwoli to odzyskać od nowego modelu, gdy sortowane.

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

Spowoduje to pobranie wartości zgodnej z oryginalnym indeksem, nawet po posortowaniu.

((DefaultTableModel)jTable1.getModel()).getValuAt(jTable1.getSelectedRow(), 0); 
Powiązane problemy