2012-04-25 12 views
13

Mam sortowalny zestaw JTable skonfigurowany do używania niestandardowego rozszerzenia AbstractTableModel. Jednak pewne zachowanie tego stołu jest tym, czego się spodziewałem, i bardzo chciałbym poradzić się, jak to obliczyć.Sortowanie z kolumną klikalną JTable: Sortowanie sortuje zawartość komórek, ale nie aktualizuje formatowania komórek?

mam JTable skonfigurować być sortable przy użyciu:

thisJTable.setAutoCreateRowSorter(true); 

To pozwala mi posortować tabelę klikając na nagłówki kolumn, jak oczekiwano.

Jednakże, kiedy sortuję tabelę, klikając nagłówki kolumn, formatowanie (tło i kolor pierwszego planu) moich wierszy również nie jest sortowane.

Ustawiłem te wiersze, aby były oznaczone kolorami w oparciu o wartości, które zawierają. Kiedy sortuję według nagłówka kolumny, formatowanie w danym wierszu NUMBER pozostaje takie samo (chociaż zawartość, która była wcześniej w tym wierszu, została przeniesiona).

Kolor rzędzie jest ustawiony poprzez nadpisanie domyślnego prepareRenderer wezwanie do JTable:

thisTable = new JTable(thisModel){ 

    //Set up custom rendering - Sets background color of row to correct value 
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
     Component c = super.prepareRenderer(renderer, row, column); 
     CustTableModel thisModel = (CustTableModel) getModel(); 
     c.setBackground(thisModel.getRowBackgroundColor(row)); 
     c.setForeground(thisModel.getRowForeColor(row)); 
     return c; 
    } 
}; 

czy istnieje lepszy/inny sposób podejść do tego?

Czy powinienem używać innej metody do renderowania, metody, która aktualizowałaby renderowanie JTable w sortowaniu?

Czy chcę zajrzeć do pisania mojej własnej metody sortowania?

Solution (Dzięki mKorbel!)

Myślałam, że będę pisać moje rozwiązanie, ponieważ miałem grać z tym trochę, ponieważ nie byłem pewien, czy nowy indeks zostanie przekazany do prepareRenderer jako dobrze.

thisTable = new JTable(thisModel){ 

    //Set up custom rendering - Sets background color of row to correct value 
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 

     int viewIdx = row; 
     int modelIdx = convertRowIndexToModel(viewIdx); 
     Component c = super.prepareRenderer(renderer, row, column); 
     CustTableModel thisModel = (CustTableModel) getModel(); 
     c.setBackground(thisModel.getRowBackgroundColor(modelIdx)); 
     c.setForeground(thisModel.getRowForeColor(modelIdx)); 
     return c; 
    } 
}; 
+0

ja również mogą wymagać upewnij się, że formatowanie oparte na treści jest stosowane do wierszy po aktualizacji treści, ale jeszcze tego nie rozwiązałem . Nadpisuję już custTableModel.setValueAt (Object, int, int), więc myślałem, że mam tam wiele opcji, ale pomyślałem, że powinienem o tym wspomnieć. – Panky

+1

Twój readyRenderer nic nie rób i complitating z CustTableModel thisModel = (CustTableModel) getModel() ;, usuń to, [Renderer to tylko formowanie, zmiana koloru, itp.] (Http://stackoverflow.com/search?q=user%3A714968 + prepareRenderer), a nie tworzenia JComponent, nie rób tego – mKorbel

+0

@kKorbel Nie jestem pewien, czy śledzę Twój komentarz. getRowForeColor i getRowBackgroundColor dodają kolorowanie warunkowe dla wiersza, w oparciu o zawartość wiersza (stąd przekazywanie rowIdx). Używam metody super, aby utworzyć komponent, a następnie po prostu ustawić poprawne tło i kolor pierwszego planu na tym komponencie. Potrzebuję pobrać TableModel i rzucić go do mojego CustTableModel ponieważ getRow [Fore | Background] Kolor nie jest zdefiniowaną metodą dla innych modeli tabel. – Panky

Odpowiedz

13

trzeba convert row index from View to the Model

int modelRow = convertRowIndexToModel(row); 
+2

darn, pokonałeś mnie (wciąż walcząc z moją nową klawiaturą :-) +1, oczywiście – kleopatra

+0

Awesome! Dzięki za cynk, od pewnego czasu spoglądałem na Javadoc dla JTable, ale nie natknąłem się na to w jakiś sposób. – Panky

+2

@Panky: "Podczas korzystania z sortera zawsze pamiętaj o przetłumaczeniu współrzędnych komórki." - [Sortowanie i filtrowanie] (http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#sorting); Niestety, musiałem to sprawdzić więcej niż jeden raz. :-) – trashgod

Powiązane problemy