# Probleme mit JTable.setDefaultRenderer()



## Clip (28. Okt 2005)

Hallo,

ich habe eine Tabellle vom Typ jTable. Dieser Tabelle weise ich mittels der Funktion setDefaultRenderer() einen eigenen Renderer hinzu:


```
jTTable.setDefaultRenderer(Object.class, new ColoredTableCellRenderer());
```



```
class ColoredTableCellRenderer extends DefaultTableCellRenderer {
		public void setValue(Object value) {
			super.setValue(value);
		}

		public Component getTableCellRendererComponent(JTable table,
				Object value, boolean isSelected, boolean hasFocus, int row,
				int column) {

			super.getTableCellRendererComponent( table, value, isSelected,
	                hasFocus, row, column );			
			
			JLabel lbl_cell = new JLabel(value.toString());
			lbl_cell.setOpaque(true);
			lbl_cell.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
			lbl_cell.setFont(table.getFont());
			lbl_cell.setForeground(table.getForeground());
			lbl_cell.setBackground(table.getBackground());

			if (!isSelected && row % 2 == 0)			
				lbl_cell.setBackground(Color.lightGray);
			else if (row % 2 == 1)
				lbl_cell.setBackground(table.getBackground());
			else
				lbl_cell.setBackground(table.getSelectionBackground());
			return lbl_cell;
		}

	}
```

Der Code soll bewirken (und tut es teilweise auch), dass jede zweite Zeile grau eingefärbt wird.
Mit der Zuweisung "Obkect.class" will ich erreichen, dass der Renderer für alle (!) Zellen gelten soll!

Leider wird der Renderer anscheinend nicht benutzt, wenn die Daten in einer Zelle nicht vom String sind. Daten vom Typ Date oder Integer oder Booloean werden bei mir von meinem Renderer nicht behandelt. 

Wie kann ich erreichen, das alle Zellen mit meinem Renderer behandelt werden? Zugleich finde ich es natürlich nützlich, dass Date, Integerer, Boolean usw. anders dargestellt werden als Strings.  Im Grunde geht es mir ja nur um das Einfärben von Zeilen. 
Weiß jemand Rat ?


----------



## Sky (28. Okt 2005)

Der Renderer gilt immer für die gegehörige Klasse. Object wird nur angewendet, wenn kein anderer gefunden wird. Die Suche nach dem anzuwendenem Render läuft so ab:

Ist für die angegebene class ein Renderer definiert?
a) Ja -> er wird angegeben
b) Nein -> Wiederhole "Suche" mit der Super-Klasse und zwar bis ein Renderer gefunden wird; der Letzte, der gefunden wird ist somit Object.

Du könntest das Problem lösen, indem Du
a) Für alle Klassen Object als class zurückgeben läßt
b) (Empfohlen) Für alle Spalten explizit den gewünschten Renderer setzt.


----------



## André Uhres (28. Okt 2005)

Für diese Aufgabenstellung brauchst du keinen eigenen Renderer:

```
JTable table = new JTable( model ) {
            public Component prepareRenderer(
                    TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                if (!isRowSelected(row)) {
                    c.setBackground(row % 2 == 0 ? null : Color.LIGHT_GRAY );
                }
                return c;
            }
        };
```


----------



## Clip (28. Okt 2005)

Hm, das ist ja nicht gerade zufriedenstellend 

D.h. ich muss entweder auf die Möglichkeit verzeichten, automatisch z.B. für bool Werte eine ChackBox als Renderer zu bekommen, oder den Renderer für Boolean ableiten und die entsprechende Methode überschreiben... Das ist etwas viel Arbeit für einen so einfachen Wunsch wie Zeilen einzufärben....
Oder gibt es die Möglichkeit  beides einfacher zu erreichen? Z.B. kannich in meiner Methode getTableCellRendererComponent() die CellRendererComponent von Boolean zurückgeben lassen und die Backgroundcolor überschreiben?


----------



## Clip (28. Okt 2005)

@Andre_Uhres: Danke das wars!


----------



## Sky (28. Okt 2005)

@Andre_Uhres: :toll: Wieder was gelernt heute. War der Tag doch nicht umsonst ;-)


----------

