Java JTable: Farbe von einzelnen Zeilen setzten

FrazeColder

Lt. Commander
Registriert
Okt. 2013
Beiträge
1.718
Moin zusammen,

ich würde gerne für jede meiner Zeilen die Farbe ändern, sobald ein bestimmter prozentualer Wert unterschritten ist. Dann wird meine eigene Methode setRowColor() aufgerufen, die die Row ID und die Farbe der Methode übergibt.

Soweit so gut, nur wird die ganze Tabelle immer in der Farbe des letzten Elementes eingefärbt. Heißt, ist die letzte Zeile Rot, werden alle Zeilen Rot. Und das, obwohl ich die richtige Farbe der entsprechenden Farbe übergebe. Das sehe ich, da ich mir pro Zeile die Farbe ausgeben lasse. Das hier ist mein aktuelles Beispiel:

Code:
Row 0: White
Row (0) & Cell (0) to java.awt.Color[r=255,g=255,b=255]
Row (0) & Cell (1) to java.awt.Color[r=255,g=255,b=255]
Row (0) & Cell (2) to java.awt.Color[r=255,g=255,b=255]


Row 1: Orange
Row (1) & Cell (0) to java.awt.Color[r=255,g=200,b=0]
Row (1) & Cell (1) to java.awt.Color[r=255,g=200,b=0]
Row (1) & Cell (2) to java.awt.Color[r=255,g=200,b=0]

Heißt, meine erste Zeile sollte eigtl. Weiß sein und meine zweite Zeile Orange. Aber wie bereits beschrieben, werden beide Zeilen Orange... Hier mein Code der setRowColor Methode:

sellTable: meine JTable

Java:
    private void setRowColor(int row, Color color){

        for (int i = 0; i < 3; i++) {
            TableCellRenderer tableCellRenderer = sellTable.getCellRenderer(row, i);
            Component c = sellTable.prepareRenderer(tableCellRenderer, row, i);
            c.setBackground(color);

            System.out.println("Row (" + row + ") & Cell (" + i + ") to " + color.toString());
        }

        System.out.println();
        System.out.println();

    }

Habt ihr eine Idee, wie ich das lösen kann oder wo mein Problem liegt?
Anscheinend ja an der Tabelle..
 
Wenns der DefaultTreeCellRenderer ist (wovon ich ausgehe), dann bietet der direkt eine Methode setBackgroundNonSelectionColor usw.
Damit würde ich es machen, statt mir die component zurück geben zu lassen und dort Attribute zu ändern.

https://docs.oracle.com/javase/10/docs/api/javax/swing/tree/DefaultTreeCellRenderer.html

Java:
    private void setRowColor(int row, Color color){

        for (int i = 0; i < 3; i++) {
            TableCellRenderer tableCellRenderer = sellTable.getCellRenderer(row, i);
            //Component c = sellTable.prepareRenderer(tableCellRenderer, row, i);
            //c.setBackground(color);
            tableCellRenderer.setBackgroundNonSelectionColor(color);

            System.out.println("Row (" + row + ") & Cell (" + i + ") to " + color.toString());
        }

        System.out.println();
        System.out.println();

    }
 
Hilft dir das hier weiter?
https://stackoverflow.com/questions/15071668/cell-renderer-for-jtable-coloured-rows

So wie ich das verstehe, setzt du die ganze Zeit den gleichen CellRenderer ein. Mit der Zeit bekommt so jede Zelle, Reihe für Reihe, Spalte für Spalte, den gleichen CellRenderer zugewiesen (bzw. hatte sie ihn schon, du holst ihn ja vorher mit einem getter ab. Ist wohl der Default CellRenderer). Änderst du desse Farbe, ändern sich alle Zellen, denen dieser bereits zugewiesen wurde. Bei der letzten Farbe sind das halt alle vorherigen.
Du musst wohl verschiedene neu erzeugen.

(Irrtum nicht ausgeschlossen, meine Java Zeit ist etwas her... ;) )
 
Zuletzt bearbeitet:
Grimba schrieb:
So wie ich das verstehe, setzt du die ganze Zeit den gleichen CellRenderer ein. Mit der Zeit bekommt so jede Zelle, Reihe für Reihe, Spalte für Spalte, den gleichen CellRenderer zugewiesen. Änderst du desse Farbe, ändern sich alle Zellen, denen dieser bereits zugewiesen wurde.
Du hast recht. Damit ist meine Lösung ähm ... nicht ganz passend :-)
 
Das war eigentlich mit verschiedene neu erzeugen gemeint, das ist doch kein Widerspruch
 
Grimba schrieb:
Das war eigentlich mit verschiedene neu erzeugen gemeint, das ist doch kein Widerspruch

So wie ich das verstehe, setzt du die ganze Zeit den gleichen CellRenderer ein [...] Du musst wohl verschiedene neu erzeugen.

Ich habe daraus gelesen, dass der Ansatz mit lediglich einem Renderer falsch ist. Das "verschiedene" im letzten Absatz bezieht sich aber wohl auf Farben. Trotzdem würde ich vermeiden im Renderer Objekte zu erzeugen. Für Farben Konstanten verwenden.
 
Zurück
Oben