# Erklärung    getListCellRendererComponent?



## stban (16. Feb 2005)

Hallo

Kann mir jemand  bitte erklären.
Ich verstehe nicht  wer  und wann die Methode


```
public Component getListCellRendererComponent(..........)
```

im Gang setzt oder gesetzt wird.

Diese Methode ist im ListCellRenderer-Interface definiert.

Ich habe viel gelesen aber keine gute Erklärung bekommen, erscheint mir änhlich wie paint() zu funktionieren.

Für Tips oder Hinweise bin ich dankbar

stban


----------



## Mac Systems (16. Feb 2005)

Das ist recht einfach:

Du musst von dem Interface ListCellRenderer eine Klasse ableiten/implementieren:


```
public class TimePlaylistCellRenderer
	extends JLabel implements TableCellRenderer
{

  private Color backgroundColor = null;
  private Color foregroundColor = null;

  //private NumberFormat format = NumberFormat.getInstance();

  private StringBuffer numberBuffer = new StringBuffer();

  private final char DIV = ':';

  private final String LIVE = "LIVE";

  public TimePlaylistCellRenderer()
  {
	super();
	setHorizontalAlignment(JLabel.RIGHT);
	setOpaque(true);
	backgroundColor = getBackground();
	foregroundColor = getForeground();
  }


  /**
   * Returns the component used for drawing the cell.
   *
   * @param table the <code>JTable</code> that is asking the renderer to draw;
   *   can be <code>null</code>
   * @param value the value of the cell to be rendered. It is up to the specific
   *   renderer to interpret and draw the value. For example, if
   *   <code>value</code> is the string "true", it could be rendered as a string
   *   or it could be rendered as a check box that is checked. <code>null</code>
   *   is a valid value
   * @param isSelected true if the cell is to be rendered with the selection
   *   highlighted; otherwise false
   * @param hasFocus if true, render cell appropriately. For example, put a
   *   special border on the cell, if the cell can be edited, render in the
   *   color used to indicate editing
   * @param row the row index of the cell being drawn. When drawing the header,
   *   the value of <code>row</code> is -1
   * @param column the column index of the cell being drawn
   * @return Component
   */
  public Component getTableCellRendererComponent(JTable table, Object value,
												 boolean isSelected, boolean hasFocus, int row, int column)
  {

	IMediaObject mo = (IMediaObject) value;

	if (mo.isSteamed())
	{
	  setHorizontalAlignment(JLabel.CENTER);
	  setText(LIVE);
	}
	else
	{
	  setHorizontalAlignment(JLabel.RIGHT);

	  int fraction = mo.getTimeInSeconds() % 60;

	  numberBuffer.setLength(0);
	  numberBuffer.append(mo.getTimeInSeconds() / 60);
	  numberBuffer.append(DIV);
	  numberBuffer.append(fraction);

	  if (fraction < 10)
	  {
		numberBuffer.append('0');
	  }

	  setText(numberBuffer.toString());
	}

	if (isSelected)
	{
	  setBackground(table.getSelectionBackground());
	  setForeground(table.getSelectionForeground());
	}
	else
	{
	  setBackground(backgroundColor);
	  setForeground(foregroundColor);
	}

	return this;

  }

}
```


Dabei ist die letzte Zeile besonders wichtg : *return this* was ein referenz auf das JLabel oder allgemeiner auf
ein JComponent zurückgibt. Da hier von JLabel abgeleitet wird wird danach das "this" Objekt bei bedarf gezeichet.


Um einen Cell Renderer nutzen zu können musst du im JTable  o. JList den Renderer (die obrige klasse) angeben über:



```
myList.setCellRenderer (new TimePlaylistCellRenderer());
```

Leider ist es nicht ganz so einfach dies bei einem JTable zu setzten da die angabe welche spalte von welchem Renderer gezeichent wird über das TabelModel erfolgt in der Methode 



```
Class getColumnClass(int columnIndex)
```

Wo du das Class Object übergeben muss das für die Spalte zuständig ist.Das könnte z.b TimePlaylistCellRenderer.class sein


Siehe auch: http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/table/TableModel.html



Stay Tuned,
jens


----------



## stban (16. Feb 2005)

Hallo Mac Systems,

Danke für die Antwort.
Die Klasse TimePlaylistCellRenderer ist vom JLabel abgeleitet und für dieses Objekt implementiere den TableCellRender, bis hier verstehe ich.

Beim instanzieren der Klasse TimePlaylistCellRenderer  wird doch nur der Konstruktor aufgerufen aber nicht die methode getTableCellRendererComponent, genau hier liegt meine schwierigkeit. Wann tritt diese methode in action oder was löst dieser auf.
Oder sollte ich vielleicht so verstehen dass beim Instanzieren der Klasse TimePlaylistCellRenderer auch die Methode getTableCellRendererComponent ausgeführt wird?

stban


----------



## Beni (16. Feb 2005)

Die Methode wird von der JList aufgerufen, wenn sie einen Eintrag darstellen möchte (Du generierst dann sozusagen ein "dynamisches Bild" mit Hilfe einer Component, welches von der JList gezeichnet wird).


----------



## stban (16. Feb 2005)

Hallo Beni,

Danke für die Antwort, genau das ist was ich gesucht habe.
Jetzt werde ich weiter basteln.

Tschüß
stban


----------

