Java JTable: Farbe von einzelnen Zeilen setzten

FrazeColder

Lt. Commander
Dabei seit
Okt. 2013
Beiträge
1.603
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..
 

andy_m4

Commander
Dabei seit
Aug. 2015
Beiträge
2.785
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();

    }
 

Grimba

Commander
Dabei seit
Dez. 2007
Beiträge
2.050
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:

andy_m4

Commander
Dabei seit
Aug. 2015
Beiträge
2.785
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 :-)
 

FrazeColder

Lt. Commander
Ersteller dieses Themas
Dabei seit
Okt. 2013
Beiträge
1.603

Grimba

Commander
Dabei seit
Dez. 2007
Beiträge
2.050
Das war eigentlich mit verschiedene neu erzeugen gemeint, das ist doch kein Widerspruch
 

Rossie

Commodore
Dabei seit
Dez. 2010
Beiträge
4.141
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.
 
Top