| 

.NET C# Java Javascript Exception

1
Ich habe einen eigenen TableCellRenderer programmiert, der aus einer JTable Spalte einen String ausliest und diesen mit einer Vorgabe (Bezeichnung) vergleicht. Bei übereinstimmung der Strings markiert er die entsprechende Zelle der Tabelle. Ich suche jetzt einen einfachen Weg auch alle horizontalen Nachbarzellen - also die ganze Zeile der JTable ebenso mit comp.setForeground(color) einzufärben.

Muss ich da für jeden Spaltentyp meiner JTable einen eigenen Renderer programmieren, oder gibt es da einen einfachen Weg?

Hier mein Renderer der nur eine Zelle markiert statt wie gewünscht die ganze Zeile.
/**
* Konstruktor
*/
public class ColorRenderer implements TableCellRenderer
{
/**
* Default Renderer
*/
private final TableCellRenderer renderer;

/**
* Bezeichnung aus Liste
*/
private final String bezeichnung;

/**
* Markierungsfarbe
*/
private final Color color;


/**
* Konstruktor
* @param renderer
* @param bezeichnung
* @param color
*/
public ColorRenderer(TableCellRenderer renderer, String bezeichnung, Color color)
{
this.renderer = renderer;
this.bezeichnung = bezeichnung;
this.color = color;
}


/**
* Standard CellRenderer
*
* @param table - the JTable that is asking the renderer to draw; can be null
* @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 value is the string "true", it could be rendered as a string or it could be rendered as a check box that is checked. null 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 row is -1
* @param column - the column index of the cell being drawn
* @return
*/
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column)
{

//Componente aus Table ziehen
Component comp = table.prepareRenderer(renderer,row,column);

//VERGLEICH
if((String)value == bezeichnung)
{
comp.setForeground(color);
//comp.setBackground(color);
}
return comp;
}
}


Der Aufruf des Renderers erfolgt mit der Spalte 7 in der der Vergleichs-String steht:
//Hole aus tableJournal Spalte 7 ColumnModel 
//und setze einen modifizierten Color-Renderer ein
tableJournal.getColumnModel().getColumn(7).setCellRenderer(
new ColorRenderer(tableJournal.getDefaultRenderer(Object.class),sourceTyp,Color.RED));
24.10.2012
mobidat 63 1 7
1 Antwort
2
Hm, ist ewig her, dass ich mal Swing programmiert habe - aber schau Dir doch mal dieses Beispiel an. Die zwei wesentlichen Punkte sind (wenn ich das richtig verstanden habe): man weist allen Spalten der Tabelle den selben CellRenderer zu, und dieser CellRenderer schaut nicht auf den in getTableCellRendererComponent() übergebenen value, sondern er holt sich selbst den Wert aus der richtigen Spalte (d.h. er weiß dank Konfiguration im Konstruktor, in welche Spalte er schauen soll).
25.10.2012
Matthias Hlawatsch 13,2k 4 9
Ja super - genau so funktioniert es! Vielen Dank!!
mobidat 26.10.2012

Stelle deine Java-Frage jetzt!