jTable Zeileneinfärben unter Bedingung

Myar

Mitglied
Hallöchen!

Tut mir leid, wenn diese Frage schon zu doof ist, aber ich stehe total aufm Schlauch...

Ich habe folgenden CellRenderer:
Code:
import java.awt.Color;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class MyTableCellRenderer extends DefaultTableCellRenderer{   
    
    @Override  
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)  {   
       JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
       
       label.setBackground( Color.RED );
      

      return this;
    }  
}

Im Moment werden alle Zellen rot eingefärbt. Ich möchte aber gerne, dass der Wert unter Value für die ersten vier Spalten in jeder Reihe (die letzte Spalte ist ne ComboBox) verglichen wird und dann, wenn die nicht gleich sind, die Zeile rot eingefärbt wird.

Also Value in Spalte 0 Zeile Null ist gleich dem Value in Spalte 2 Zeile 0
Value Spalte 1 Zeile 0 ist nicht gleich dem Value in Spalte 3 Zeile 0 = Zeile rot

Habe mal nen Screen meiner Tabelle angehängt zut Veranschaulichung...

Wär toll, wenn jemand grad Rat wüsste...

gruß
Myar
 

Anhänge

  • tablerot.jpg
    tablerot.jpg
    20,4 KB · Aufrufe: 24
Du kannst doch einfach mit label.getText() den Wert aus der Zelle holen und dann einfach mit einer If-Anweisung entsprechen das Label einfärgen lassen.

Klar soweit?
 
Danke für die Antwort!

Ja soweit war ich schon, es hapert eher daran, dass ich nicht drauf komme, wie ich dann den Wert aus der Zelle in der selben Zeile mit dem Wert in der übernächsten Spalte vergleiche...

Also sowas wie "Wenn Nicht (getValue aus Spalte 0.equals(getValue aus Spalte 2) Dann färbe rot"

Wahrscheinlich seh ich den Wald vor lauter Bäumen nicht... :/

Gruß
Myar
 
Ok, dass wir nicht ganz so leicht denke ich. Gemacht hab ichs noch nicht, aber hier mal meine Idee:
In der selben Methode hast du ja als Parameter auch die aktuelle row und column. Jetzt kannst du ja anhand denen auch die beispielsweise übernächste Zelle bestimmen.
Wenn du ein eigenes TableModel verwendest, kannst du ja über dass ganz einfach den Inhalt der entsprechenden Zelle auslesen. Ansonsten musst du dir halt temporär das Model aus der Tabelle mit dataModel() holen und darüber auf die Daten zugreifen.
Klar soweit? ;)
 
Ja der Ansatz war gut, damit kam ich weiter.
Nur ein Problem gibt es noch...

Der Wert für row und column, den ich ja hier bekomme:
Code:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)  {   
       JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
der ändert sich nie. Also bleibt immer 0 und somit bekomme ich auch immer nur den Wert aus Spalte 0 Zeile 0...

Aufgerufen wird es so:
Code:
UI.jTable2.setDefaultRenderer(Object.class, new MyTableCellRenderer());

Und dann will ich die einzelden werte in ArrayLists packen und diese dann vergleichen:
Code:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)  {   
       JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
       
          switch (column){
           case 0: spalte0.add((String)table.getValueAt(row, column));
           case 1: spalte1.add((String)table.getValueAt(row, column));
           case 2: spalte2.add((String)table.getValueAt(row, column));
           case 3: spalte3.add((String)table.getValueAt(row, column));
          }
       
       for(int x = 0; x <= table.getRowCount(); x++){
           if(!spalte0.get(x).equalsIgnoreCase(spalte2.get(x)))
             label.setBackground( Color.RED );
           
           if(!spalte1.get(x).equalsIgnoreCase(spalte3.get(x)))
             label.setBackground( Color.RED );
       }
          
       return this;
}

Was nix bringt, da der INhalt sich immer gleicht -.-

Gruß
Myar
 
Okay, funktioniert!

Für alle, die mal hierauf stoßen, so läufts nun:

Code:
import java.awt.Color;
import java.awt.Component;
import java.util.ArrayList;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class MyTableCellRenderer extends DefaultTableCellRenderer{   
    
    private ArrayList<String> spalte0 = new ArrayList<String>();
    private ArrayList<String> spalte1 = new ArrayList<String>();
    private ArrayList<String> spalte2 = new ArrayList<String>();
    private ArrayList<String> spalte3 = new ArrayList<String>();
    
    @Override  
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)  {   
        setBackground( null );

        super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);
        
        for(int i = 0; i < table.getRowCount(); i++){ 
          
           spalte0.add((String)table.getValueAt(i, 0));
           spalte1.add((String)table.getValueAt(i, 1));
           spalte2.add((String)table.getValueAt(i, 2));
           spalte3.add((String)table.getValueAt(i, 3));
          
        }
        
       if(!spalte0.get(row).equalsIgnoreCase(spalte2.get(row)))
                setBackground(Color.red);
        
       if(!spalte1.get(row).equalsIgnoreCase(spalte3.get(row)))
                setBackground(Color.red);
      
      return this; 
}  
}

Gruß
Myar
 
Zuletzt bearbeitet:
Zurück