2012-04-25 11 views
13

Ich habe eine sortierbare JTable eingerichtet, um eine benutzerdefinierte Erweiterung der AbstractTableModel zu verwenden. Allerdings ist ein gewisses Verhalten dieser Tabelle das, was ich erwartet habe, und ich würde gerne einen Ratschlag bekommen, wie ich das herausfinden kann.JTable Klickbare Spaltensortierung: Sortierung sortiert den Inhalt von Zellen, aktualisiert aber nicht die Zellenformatierung?

Ich habe die JTable einrichten sortierbar sein mit:

thisJTable.setAutoCreateRowSorter(true); 

Dies ermöglicht es mir, die Tabelle zu sortieren, indem Sie wie erwartet auf die Spaltenüberschriften klicken.

Ich finde jedoch, dass wenn ich die Tabelle durch Klicken auf die Spaltenüberschriften sortiere, die Formatierung (Hintergrund und Vordergrundfarbe) meiner Zeilen nicht so gut sortiert sind.

Ich hatte diese Zeilen so eingerichtet, dass sie basierend auf den darin enthaltenen Werten farbkodiert wurden. Wenn ich nach Spaltenüberschriften sortiere, bleibt die Formatierung bei einer gegebenen Zeilennummer gleich (obwohl der Inhalt, der zuvor in dieser Zeile war, verschoben wurde).

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

Gibt es eine bessere/andere Art und Weise zu nähern:

Die Farbe der Reihe wird durch das Überschreiben des Standard prepareRenderer Aufruf für die JTable eingestellt?

Sollte ich eine andere Methode verwenden, um mein Rendering zu tun, eine Methode, die das Rendern der JTable auf eine Sortierung aktualisieren würde?

Oder möchte ich meine eigene Sortiermethode schreiben?

Lösung (Danke mKorbel!)

Ich dachte, ich würde meine Lösung zu veröffentlichen, da ich mit diesem ein wenig zu spielen hatte, da ich nicht sicher war, ob der neue Index auf die prepareRenderer weitergegeben würden als Gut.

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

ich auch brauchen Stellen Sie sicher, dass die content-basierte Formatierung auf Zeilen angewendet wird, nachdem der Inhalt aktualisiert wurde, aber ich habe das noch nicht angepackt . Ich überschreibe bereits custTableModel.setValueAt (Object, int, int) und dachte, ich hätte dort viele Optionen, dachte aber, ich sollte das auch erwähnen. – Panky

+1

Ihr prepareRenderer nichts tun und mit CustTableModel compilieren thisModel = (CustTableModel) getModel();, entfernen Sie das, [Renderer ist nur über Formatierung, Farbe ändern, etc] (http://stackoverflow.com/search?q=user%3A714968 + prepareRenderer), nicht für create JComponent, tu das nicht – mKorbel

+0

@kKorbel Ich bin mir nicht sicher, ob ich deinem Kommentar folge. getRowForeColor und getRowBackgroundColor fügen basierend auf dem Inhalt der Zeile eine bedingte Färbung für die Zeile hinzu (daher wird rowIdx übergeben). Ich verwende die Super-Methode, um die Komponente zu erstellen und dann einfach die richtige Hintergrund- und Vordergrundfarbe für diese Komponente festzulegen. Ich muss das TableModel abrufen und es in mein CustTableModel umwandeln, da getRow [Fore | Background] Color keine definierte Methode für andere Tabellenmodelle ist. – Panky

Antwort

13

Sie müssen convert row index from View to the Model

int modelRow = convertRowIndexToModel(row); 
+2

verdammt, du schlägst mich (immer noch kämpfen meine neue Tastatur :-) +1, natürlich – kleopatra

+0

Awesome! Danke für den Tipp, ich hatte eine Weile auf den Javadoc nach JTable geschaut, bin aber nicht darauf gestoßen. – Panky

+2

@Panky: "Wenn Sie einen Sortierer verwenden, denken Sie immer daran, die Zellkoordinaten zu übersetzen." - [Sortieren und Filtern] (http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#sorting); Leider musste ich mehr als einmal nachsehen. :-) – trashgod

Verwandte Themen