JTable: Vergleich zweier Spalten und Einfärben mit CellRenderer

stookie

Grünschnabel
Hallo zusammen,

ich habe ein JTable, bei dem ich zwei benachbarte Zeilen mit float-Werten vergleichen möchte. Wenn der Wert der 2. Spalte größer ist als der in der 1. Spalte, soll der Wert der 2. Spalte rot eingefärbt werden. (Die erste Spalte wird niemals gefärbt).

Habe daraufhin einen eigenen CellRenderer abgeleitet aus dem DefaultCellRenderer geschrieben, der mir aber alle Werte rot einfärbt.


public class VergleichRenderer extends DefaultTableCellRenderer
{
public void setValue(Object value)
{
String s = value.toString();
float ref = Float.parseFloat(s);

for (int i = 0; i < tableModel.getRowCount(); i++)
{
ref = ((Float)tableModel.getValueAt(i,2)).floatValue();
float wert = ((Float)tableModel.getValueAt(i,1)).floatValue();

if (ref > wert)
{
setForeground (Color.red);
System.out.println("true\t: "+ref+"\t"+wert);
}
else
{
setForeground (Color.black);
System.out.println("false\t: "+Float.parseFloat(s)+"\t"+wert);
}
setText (s);
}
}
}


Mein Problem ist auf jeden Fall, dass value mir die gesamte Spalte zurückgibt, ich aber Einzelwerte vergleichen muss. Daher die for-Schleife, in der die Variable ref überschrieben wird.

Mir kommt mein Werk sehr konfus vor und ich bitte um logischere Anregungen. Vielen Dank

Katrin
 
Hi,
implementiere

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

in Deinem Renderer. Den Vergleichswert kannst Du Dir einfach auslesen lassen, alle notwendigen Referenzen und Werte stehen ja zur Verfügung.
 
Hallo,

danke für die schnelle Antwort. Doch ein generelles Problem bleibt. Ich rufe den Renderer von einer Spalte mit 4 Einträgen aus auf (da nur in dieser Spalte eine Färbung vorgenommen werden soll).

In der Funktion, die Du mir genannt hast umfasst der Wert value dann auch alle 4 Einträge auf einmal. Wenn ich einen Vergleich mache, werden alle vier Zahlen mit dem ersten Eintrag der Vergleichsspalte verglichen, anschließend alle 4 Werte mit dem zweiten Eintrag der Vergleichsspalte usw.

Gibt es keine Möglichkeit, dass ich in value nur einen Wert habe und nicht die gesamte Spalte?

Danke schonmal.

Katrin
 
stookie hat gesagt.:
Hallo,
danke für die schnelle Antwort. Doch ein generelles Problem bleibt. Ich rufe den Renderer von einer Spalte mit 4 Einträgen aus auf (da nur in dieser Spalte eine Färbung vorgenommen werden soll).

In der Funktion, die Du mir genannt hast umfasst der Wert value dann auch alle 4 Einträge auf einmal. Wenn ich einen Vergleich mache, werden alle vier Zahlen mit dem ersten Eintrag der Vergleichsspalte verglichen, anschließend alle 4 Werte mit dem zweiten Eintrag der Vergleichsspalte usw.

Das ist nicht richtig. value beinhaltet den Wert bzw das Objekt, was in der Zelle mit row, column steht. Im Grunde ist value an der Stelle das ausgelesene getValueAt(row, column).
Deshalb kannst Du ja auch über table.getModel().getValueAt(row-1, column) den Vergleichswert holen.

Gibt es keine Möglichkeit, dass ich in value nur einen Wert habe und nicht die gesamte Spalte?

Danke schonmal.

Katrin

S.o.
 

Neue Beiträge

Zurück