# JTable; DefaultTableCellRenderer. Zellen farbig befüllen.



## Enfa (19. Dez 2006)

Hallo Allerseits,

hab da ein dickes Problem:

ich möchte je nach Inhalt eine Zelle, die Zelle den Hintergrund farbig markieren.

Mein JTable bekommt ein DefaultTableRenderer:


```
DefaultTableCellRenderer renderer = new ColoredTableCellRenderer();
jTable.setDefaultRenderer ( Object.class, renderer);
```

Ich benutze ein DefaultTableModel.

Mein erstes Versuch sah so aus:


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

Hier setze ich für alle Zellen den Hintergrundfarbe rot.

Jetzt mein erstes Problem: Ich möchte die Objekt-Variable mit der Methode toString() umwandeln. Und denn in einem String zuweisen. Wenn ich dannach Compiliere, geht nichts mehr. 

Als Fehlermeldung kommt das da:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException.

Was mache ich falsch? 

Object.class in setDefaultRenderer stimmt doch, oder?

Ich möchte den value in String umwandeln. In dem String steckt ein Information, das entscheidet welche Farbe die Zelle haben soll. Deswegen möchte ich den subString verwenden. 

Vielen Dank im Voraus.

Tschau


----------



## derkonstantin (19. Dez 2006)

Also ich würde das folgendermaßen machen:


```
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer()
			{
				public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
				{
					String strvalue = value == null ? "" : value.toString();
					
					setForeground(table.getForeground());
					setBackground(table.getBackground());
					setFont(table.getFont());

					setText(strvalue);
					if(strvalue.equals("Michael"))
						setBackground(Color.RED);
					return this;
				}
			});
```

Gruß
Konstantin


----------



## derkonstantin (19. Dez 2006)

Ach ja, was mir noch einfällt: In die Methode sollte vielleicht noch sowas hier, falls erwünscht:


```
if(isSelected)
						{
							setBackground(table.getSelectionBackground());
							setForeground(table.getSelectionForeground());
						}
```

Analog müsste man so was auch noch hasFocus basteln. Da hat die Zelle mit dem Focus ja i. d. R. einen andreren Border ...


----------



## derkonstantin (19. Dez 2006)

Weil ich grad durch Zuall drauf gestoßen bin:


```
if(hasFocus)
							setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
						else
							setBorder(UIManager.getBorder("Table.cellBorder"));
```


----------



## bronks (22. Jan 2007)

derkonstantin hat gesagt.:
			
		

> ```
> if(hasFocus)
> setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
> else
> ...


Das o.g. habe ich verwendet. Der Border ist bei mir hellgelb, sodaß man ihn fast garnicht sieht. Kann mir bitte jemand verraten, wie man die Farbe des Borders ändern kann?

Danke

Bronks


----------



## bronks (22. Jan 2007)

Hab die Lösung gerade gefunden. Es geht u.a. damit:


```
this.setBorder(BorderFactory.createLineBorder(super.getForeground(), 1));
```


----------

