# CellRenderer einzelne zellen Hintergrund



## java66 (27. Nov 2009)

Hallo zusammen,
habe eine frage ich habe ein JTable in die ich werte aus einer DB lade, nun sollen alle Zellen in EINER SPALTE in der JTable die den inhalt notfound haben einen roten hintergrund bekommen.
irgendwie funzt das nicht bei mir habe eine eigene klasse für den cellrenderer geschrieben.
Danke für eure hilfe 



```
import java.awt.Color;
import java.awt.Component;

import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.table.TableCellRenderer;

public class MyCellRend extends JLabel implements TableCellRenderer
{
	
private static String COLUMN_STRINGTYPE="STRING";
private static String COLUMN_NUMBERTYPE="NUMBER";
String ColType="";

public MyCellRend()
{
setOpaque(false);
this.setBackground(UIManager.getColor("InputField.Required"));
}

public Component getTableCellRendererComponent(JTable table, Object value,
	boolean isSelected, boolean hasFocus, int row, int column) {
	setBorder(table.getBorder());
	setSize(getComponentCount(), getComponentCount());
	this.setPreferredSize(getSize());
	
	setHorizontalAlignment(SwingConstants.RIGHT);
	
if(row % 2==0){}
	setValue(value);

if(value.equals("notfound")){
		setBackground(Color.red);
		System.out.println(this.getText());}
	
return this;
}

private void setValue(Object value) {
	this.setText((String)value);
	
}

}
```


----------



## KrokoDiehl (27. Nov 2009)

Erbe deinen Renderer besser vom _DefaultTableCellRenderer_, dann brauchst du in der getRenderer-Methode "nur" noch den Hintergrund ändern und behälst alle ürbigen Standardeigenschaften bei. Etwa so:

```
public class MyRenderer extends DefaultTableCellRenderer
{
    //...
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component comp = super.getTableCellRendererComponent(...);
        if (value == null) // oder wie auch immer du ungültige Werte prüfst
        {    
            comp.setBackground( Color.red );
        }
        return comp;
    }
}
```


----------



## Balbes (27. Nov 2009)

wird dabei "System.out.println(this.getText());" ausgeführt?


----------



## java66 (27. Nov 2009)

ja die werte bekomme ich ausgegeben das problem ist nur wenn ich auf setbackground mache setzt alle cellen hintergründe auf die selbe farbe und der wert ist weg


----------



## Michael... (27. Nov 2009)

Würde Dir auch den Vorschlag von KrokoDiehl nahe legen. Da Du in Deinem Renderer in allen Fällen den Hintergrund aktiv setzen musst. Ausserdem fehlt in Deinem Renderer auch 
	
	
	
	





```
setText(value.toString());
```
 da die Zelle sonst leer bleibt;
Und

```
value.equals("notfound"))
```
 müsste heissen 
	
	
	
	





```
value.toString().equals("notfound"))
```


----------



## Balbes (27. Nov 2009)

java66 hat gesagt.:


> ja die werte bekomme ich ausgegeben das problem ist nur wenn ich auf setbackground mache setzt alle cellen hintergründe auf die selbe farbe und der wert ist weg



würde auch sagen, was KrokoDiehl geschreben hat:

in der Methode  public Component getTableCellRendererComponent....


```
Component comp = super.getTableCellRendererComponent(...);
        if (value == null) // oder wie auch immer du ungültige Werte prüfst
        {    
            comp.setBackground( Color.red );
        }
        return comp;
```

machen. Dann wird nur eine Zelle gefärbt und nicht die ganzen Zellen. Natürlich dann von DefaultTableCellRenderer erben


----------



## Marco13 (27. Nov 2009)

Das von KrokoDiehl gepostete ist an sich nicht _ganz_ falsch. Das "Problem" ist, dass der DefaultTableCellRenderer bei "get..Component" nicht eine neue Component liefert, sondern immer die selbe (nämlich sich selbst - der DefaultTableCellRenderer IST ein JLabel). Das ist aber kein "Problem" oder "Fehler", sondern Absicht: Die zurückgegebene Component wird immer wieder (für ALLE Zellen) verwendet - wie eine Art "Stempel". 

Es müßte also zumindest

```
if (value == null) // oder wie auch immer du ungültige Werte prüfst
        {    
            comp.setBackground( Color.red );
        }
        [b]else
        {
            comp.setBackground( Color.WHITE); // oder so...
        }[/b]
```
heißen...


----------



## Michael... (27. Nov 2009)

> ```
> Component comp = super.getTableCellRendererComponent(...);
> if (value == null) // oder wie auch immer du ungültige Werte prüfst        {
> comp.setBackground( Color.red );
> ...


Beim erben von DefaultCellRenderer ist das erzeugen von 
	
	
	
	





```
Component comp = super.getTableCellR...
```
 nicht notwendig - und wenn dann sollte man comp global deklarieren und nicht in der Methode.
folgender Code ist völlig ausreichend:

```
super.getTableCellRendererComponent(...);
if (value==null)
    this.setBackground(Color.RED);
return this;
```


----------



## Marco13 (27. Nov 2009)

Das stimmt zwar (wie ich auch angedeutet habe) - aber wenn man irgendwann mal von einem anderen *TableCellRenderer erbt, oder der DefaultTableCellRenderer irgendwann mal nicht mehr von JLabel erbt, hat man ein Problem. Wenn man die Struktur

```
Component component = super.get...Component(...);
somehowModify(component);
return component;
```
verwendet, macht man weniger Annahmen und ist in gewissen Grenzen unabhängiger und flexibler als mit

```
super.get...Component(...);
somehowModify(this);
return this;
```

Ist vielleicht in den meisten Fällen nicht soooo wichtig, aber ... ... ich erwähn's halt mal


----------



## KrokoDiehl (27. Nov 2009)

Stimmt stimmt, das hat mich auch schon oft verwirrt, dass man beim Ändern der Hintergrundfarbe auch alle Alternativen beachten muss. Man muss sogar auf die Selektion eingehen:

```
if ( wertIstUngueltig )
{
    if (isSelected)
        comp.setBackground( // Farbe wenn der Wert ungültig ist UND die Zelle selektiert ist
    else
        comp.setBackground( // Farbe wenn der Wert ungültig ist aber die Zelle NICHT selektiert ist 
}
else
{
    // Standardfarben der Tabelle
    if (isSelected)
        comp.setBackground( table.getSelectionBackground() );
    else
        comp.setBackground( table.getBackground() );
}
```
Ob man es nun so oder anders macht, jedenfalls gibt es diese vier möglichen Fälle.


----------

