# JTable: Zugriff auf einzelne Zellen



## Vater Frost (10. Jul 2012)

Hallo,

Ich habe das Gefühl, dass sich mein Problem nicht so richtig mit dem Erstellen eines eigenen Zellen-Renderers lösen lässt.

Meine Tabelle (data_model) wird durch das Lesen einer externen Datei befüllt. Jeder Zellen-Eintrag enthält ein String. Die Anzahl der Zeilen und Spalten wird zur Laufzeit geändert. Das Programm soll nun erkennen, ob Strings in den Spalten einer Zeile unterschiedlich sind. Wenn sich die Strings nicht ähneln soll die Zeile eingefärbt werden. Implementation siehe unten.


```
//loop through each row and check if values are different
      if (data_table.getModel().getColumnCount() > 1){
         for (int i=0;i<data_table.getModel().getRowCount();++i){
            String s1 = data_table.getModel().getValueAt(i, 0).toString();

            boolean found = false;
            for (int j=1;j<data_table.getModel().getColumnCount();++j){
               String s2 = data_table.getModel().getValueAt(i, j).toString();
               
               if (!s1.equals(s2)){
                  found = true;
               }
            }
            if (found){
               data_table.getCellRenderer(i, 0).getTableCellRendererComponent(data_table, null, false, false, i, 0).setBackground(Color.red);
            }
         }
      }
```

Der Aufruf im "if (found)" Block färbt allerdings nicht die Zeile rot, sondern die ganze Tabelle. Ich habe die Befürchtung, dass jede Zelle mit dem gleichen Zeiger bedient wird, so dass ich gar keine Möglichkeit habe eine einzelne Zelle zu ändern.

Des weiteren habe ich keine Idee, wie ich über CellRenderer auf die Nachbar-Elemente zugreifen kann. Ich kann ja immer nur Konditionale Abfragen innerhalb der Component durchführen.

Hat jemand eine Lösung?

Gruß
Frost.


----------



## SlaterB (10. Jul 2012)

du musst die Information irgendwo hinterlegen, den Renderer überschreiben 
und genau beim passenden Feld den Backgroud setzen, aber wahrscheinlich auch darauf achten,
dass es danach wieder zurückgestellt wird

dass der CellRenderer alle Zellen malt scheint dir ja bekannt zu sein, sonst ein Thema zum Kennenlernen für sich,

-----

was meinst du mit 'Nachbar-Elemente'? auf die Darstellung derselben kannst du kaum zugreifen,
im TableModel kannst du aber auf alle festen Daten zugreifen, 
mit den Indexen des aktuellen Elements natürlich dann auch auf die direkten Nachbarn


----------



## Vater Frost (10. Jul 2012)

Danke für die schnelle Antwort. Aber im Grunde muss ich diese Information...


```
if (!s1.equals(s2)){
   found = true;
}
```

...im eigenen CellRenderer auswerten. Und dazu müsste ich im CellRenderer alle Zellen einer Zeile auswerten, was irgendwie nicht geht.Vielleicht verstehe ich aber auch eine grundlegende Sache nicht.


----------



## SlaterB (10. Jul 2012)

wenn das Thema nicht als beendet gelten soll, muss du schon irgendwas anderes formulieren

> was irgendwie nicht geht.
hilft niemanden


----------



## Michael... (10. Jul 2012)

Vater Frost hat gesagt.:


> Danke für die schnelle Antwort. Aber im Grunde muss ich diese Information...
> 
> 
> ```
> ...


Diese Auswertung im CellRenderer ist ungeeignet und ineffizient. Die "Auswertung" muss bei Befülllung der Tabelle bzw. bei Einfügen einer Zeile oder Änderung von Zeileninhalten passieren.
Das Zellenobjekt muss das "Ergebnis" speichern (können) und der CellRenderer wertet dann diese Information aus und stellt die Zelle entsprechend dar.
Strings im TableModel zu halten reicht daher nicht aus. Entweder man hält passende Objekte (z.B. mit einem String und boolean Attribut) im TableModel oder man hält sich parallel ein zweites "VergleichsergebnisModel" welches der CellRenderer auswerten kann. Ich würde erstere Variante empfehlen.


----------

