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;
}
};
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
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
@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