# TableCellRenderer und setBackground



## Unregistriert (20. Okt 2009)

hallo und guten morgen erstmal.

ihr könnt es wahrscheinlich nicht mehr hören, aber ich hab ein problem mit dem TableCellRenderer...
ich hab schon seeeeeehr viel gegoogelt hab auch immer was gefunden nur jetzt kommt ich nicht mehr weiter.

folgendes problem: ich hab ein JTable wo ich bestimmte zeilen anders färben will.
ich hab einen tablecellrenderer geschrieben und übergib diesem auch die notwendigen werte.
das blöde ist nur das jez meine komplette tabelle in der anderen hintergrund farbe ist.
ich hatte es auch schon mal so das die entsprechenden zellen anders farbig hinterlegt wurden. aba man dann
die werte nicht sehen konnten, aber wen man dann doppel klick auf eine zelle gemacht hat konnte man den hinhalt sehen...
hoffe ihr könnt mir helfen, hier mal der code:

zuweisung des tablecellrenderer:

```
table.setDefaultRenderer(Object.class, (TableCellRenderer) new MyRenderer().getTableCellRendererComponent(table, ausgabe.getArticel_name(), false, false, buff, 3));
```

tablecellrenderer:

```
public class MyRenderer extends DefaultTableCellRenderer 
{
	private Color colorSelected = new Color( 184, 207, 229 );
    private Color colorFocus = new Color( 184, 207, 229 );
    private Color colorNormal = new Color( 130, 161, 212 );

   public Component getTableCellRendererComponent(JTable table, String value, boolean isSelected, 
                                                  boolean hasFocus, int row, int column) 
   {     
      setForeground(Color.BLACK);
      
      if( hasFocus )
      {
          setBackground( colorFocus );
      }
      else if( isSelected )
      {
          setBackground( colorSelected );
      }
      else
      {
          setBackground( colorNormal );
      }

      if( value == null)
      {
    	  setBackground(Color.YELLOW);
      }
      else
      {
    	  setBackground(colorNormal);
      }
      
      setValue(value);
      return this;
   }
}
```

gruß marcel


----------



## Kaffeebohn (20. Okt 2009)

Hi Marcel,

wird die Zelle immer in der Hintegrundfarbe "colorNormal" angezeigt?

Die letzte If-Abfrage die du machst:


```
if( value == null)
      {
          setBackground(Color.YELLOW);
      }
      else
      {
          setBackground(colorNormal);
      }
```

überschreibt wenn ich das richtig sehe alles, was du vorher belegt hast an Farben.
1. überschreibt er es mit YELLOW wenn value == null, und 
2. überschreibt er es mit colorNormal, wenn value != null ist. Alternativen gibt es dazu ja gar nicht.

Wär das ne Möglichkeit?


----------



## Unregistriert (20. Okt 2009)

also die zellen sollen halt yellow hinterlegt werden wenn value == null ist.

und meine tabelle wird jetzt komplett yellow angezeigt und nicht mehr mit der colorNormal ...

meines wissen nach nimmt der renderer nämlich die letzte farbe als standart farbe. 
deswegen hab ich den else zweig gemacht für den fall das wen value != null ist er die hintergrunde farbe wieder auf den ursprung  zurück setzten soll.

marcel


----------



## Kaffeebohn (20. Okt 2009)

Was ich nur ausdrücken wollte: Die letzte If-Abfrage wird in jedem Fall aufgerufen, und dadurch werden Farben, die du vorher gesetzt hast (also z.B. colorFocus) überschrieben. Das sorgt dafür, dass du sowieso nur zwei farben sehen wirst: YELLOW und deine normale Farbe.

Würde es nicht reichen, gleich zu Begin als erste Anweisung eine Standard-Farbe zuzuweisen (um den Standard wie du sagtest zu kompensieren) und danach nur die Farben zuzuweisen, die geändert werden sollen?


----------



## Unregistriert (20. Okt 2009)

also die farbzuweisung für hasfocus und hasselected stimmt. wenn meine tabelle komplett gelb ist und ich
dan eine zeile den focus gebe ist genau die angegebene farbe zu sehen ...

wenn ich jez am anfang zb unter setforegournd() setbackground() da die standart farbe setzte , passiert nichts
die tabelle bleibt komplett gelb.

leider weiß ich nicht mehr wie ich es gestern geschafft hatte das die zellen richtig makiert waren aber der inhalt nicht zu sehen war sonst könnte das jetzt vllt helfen...


----------



## Unregistriert (20. Okt 2009)

kleine ergänzung:

hab gerade mal geguckt: also wenn value != null ist, spring er auch in den else zweig rein. nur iwie ändert er dann nicht den hintergrund...


----------



## Kaffeebohn (20. Okt 2009)

Hast du mal versucht, gleich am Anfang die Farbe colorNormal zu setzen anstatt am Ende?


----------



## Unregistriert (20. Okt 2009)

ja hab ich, trotzdem war meine ganze tabelle gelb und nicht in der colorNormale farbe :/


----------



## Kaffeebohn (20. Okt 2009)

Hm als Unterschied fällt mir jetzt nur noch auf dass du keinen super-constructor aufrufst..


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

    	super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);
```

so sieht das bei mir aus...wobei ich nicht glaube dass es daran liegt. Vielleicht wartest du bis jemand kommt der mehr Ahnung davon hat


----------



## Unregistriert (20. Okt 2009)

ja, dacht ich eben auch mal als ich so am googlen war, aber damit hat sich auch nichts geändert...

deswegen bin ich ja so verzweifelt. ich hab etliche tablecellrenderer codes mit meinem verglichen un keine wirklich großen unterschiede gefunden, un wenn ich dann die kleinen unterschiede angepasst hab, hat sich auch nichts verändert.


----------



## Kaffeebohn (20. Okt 2009)

Andere Idee..wenn du nur die Auswahl farbig ändern willst, probier es mal mit

table.setSelectionBackground(new Color(...,...,...));


----------



## Kaffeebohn (20. Okt 2009)

Mir fällt noch was auf..

Ich übergebe den Renderer immer anders als du jetzt:


```
table.setDefaultRenderer(Object.class, (TableCellRenderer) new MyRenderer().getTableCellRendererComponent(table, ausgabe.getArticel_name(), false, false, buff, 3));
```

ich mache das so:

```
table.setDefaultRenderer(Object.class, new MyRenderer());
```

Außerdem sollte die Methode getTableCellRendererComponent anstatt einem String ein Object erwarten.


----------



## Unregistriert (20. Okt 2009)

ne will ich nit, das mit dem selected hab ich nur gemacht damit die farbe , falls man ne zeile auswählt farbelich zum standartwert passt.

wie gesagt ich will NUR die zeilen farbig ändern wo value == null ist. un null kann nur in der 3. column vorkommen.


----------



## Unregistriert (20. Okt 2009)

ja ich muss dem die werte mitgeben da ich ja value überprüfe un anhand dessen die farbe ändern will.


----------



## Kaffeebohn (20. Okt 2009)

Er ruft ja jedes mal diese Methode auf wenn eine Änderung eingetreten ist, automatisch, und übergibt die Werte dann von selbst. Allerdings erwartet er bei der Methode

getTableCellRendererComponent

ein Object anstatt eines String wie du ihn übergibst. Du kannst dir das Object in einen String casten, aber die Signatur sollte glaube ich Stimmen.


----------



## Kaffeebohn (20. Okt 2009)

Ok also bei mir funktioniert dein CellRenderer jetzt. Hier meine Änderungen:

1. In der Methode aus "String value" -> "Object value" gemacht
2. Die letzte IF-Abfrage wie bereits gesagt entfernt.
Dann sieht das so aus: (Achtung ich habe die Farben geändert nicht erschrekchen  )


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

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class MyRenderer extends DefaultTableCellRenderer 
{
    private Color colorSelected = Color.black;
    private Color colorFocus = Color.blue;
    private Color colorNormal =Color.green;
 
   public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, 
                                                  boolean hasFocus, int row, int column) 
   {     
	   System.out.println("-----------------------------------------------");
      setForeground(Color.BLACK);
      
      if( hasFocus )
      {
          setBackground( colorFocus );
      }
      else if( isSelected )
      {
          setBackground( colorSelected );
      }
      else
      {
          setBackground( colorNormal );
      }
 
     
      setValue(value);
      return this;
   }
}
```


----------



## Unregistriert (20. Okt 2009)

schau mal oben in meinem code. bei mir erwartet er kein objekt sondern ein string


----------



## Kaffeebohn (20. Okt 2009)

Wenn du hier 

DefaultTableCellRenderer (Java 2 Platform SE v1.4.2)

nachschaust wirst du sehen, dass die Methode ein Object erwarten muss. Solltest du den String benötigen (bisher ist das ja nicht der Fall) kannst du das Object ja immer noch zu einem String machen. Da String vom Typ Object ist kannst du auch ein String übergeben, selbst wenn ein Object erwartet wird.


----------



## Unregistriert (20. Okt 2009)

hey,

hab jetzt auch mal String zu Object gemacht.

hab die letzte if abfrage aba da gelassen un siehe da, die zellen wo null drin steht sind jetzt gelb un die datensätze stehen diesmal auch drin 

vielen danke  

marcel


----------



## Kaffeebohn (20. Okt 2009)

Hat es jetzt also geklappt?

Prima  Dann klick bitte unten noch auf den Button "Frage offen" damit das Thema geschlossen wird!


----------



## Unregistriert (20. Okt 2009)

geht nicht der is ausgegraut bei mir ^^


----------

