CellReender Zellenfarbe int abhängigkeit einer anderen Zelle

max514

Bekanntes Mitglied
Hey Leute, folgendes Problem ich möchte die Farbe einer Zelle rot färben wenn diese unter den wert einer anderen zelle fällt ? ich hab leider nichts ähnliches im Internet gefunden ?
Bisheriger code
Java:
public class CellReender implements TableCellRenderer{
    private static final TableCellRenderer re = new DefaultTableCellRenderer();
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component c = re.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        int wert;
        if(column == 3){
            Object ergebnis = table.getModel().getValueAt(row, column);
            wert = Integer.parseInt(ergebnis.toString());
            Color farbe = null;
            
        }
        
        return c;
    }
 

mihe7

Top Contributor
Java:
import java.awt.Color;
import java.awt.Component;
import javax.swing.*;
import javax.swing.table.*;

public class Test {

    public void run() {
        Double[][] values = new Double[500][2];
        for (int i = 0; i < values.length; i++) {
            Double[] row = values[i];
            for (int k = 0; k < row.length; k++) {
                row[k] = 100 * Math.random();
            }
        }

        JTable table = new JTable(new DefaultTableModel(values, new Object[]{"A","B"}));        
        table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, 
                    boolean isSelected, boolean hasFocus, int row, int column) {
                Component c = super.getTableCellRendererComponent(table, value, 
                        isSelected, hasFocus, row, column);
                if (column == 0) {
                    Comparable value1 = (Comparable) table.getModel().getValueAt(row, column);
                    Comparable value2 = (Comparable) table.getModel().getValueAt(row, column+1);
                    if (value1.compareTo(value2) < 0) {
                        c.setBackground(Color.RED);
                        c.setForeground(Color.WHITE);
                    }
                } else {          
                    c.setBackground(Color.WHITE);
                    c.setForeground(Color.BLACK);
                }
                return c;
            }        
        });
        
                
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(new JScrollPane(table));
        frame.setSize(800, 600);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 

max514

Bekanntes Mitglied
Vielen dank ich versuch grade die ganze reender Geschichte zu verstehen und lese mich glaub ich erst mal richtig ein =) aber danke das beisspiel hat mir sehr geholfen ich habe vorher gedacht ich muss den wie ne Methode aufrufen :rolleyes:
 

mihe7

Top Contributor
Der Code ist vom Grundsatz her nicht anders als Deiner. Die Renderer funktionieren ganz einfach, sie folgen dem Flyweight-Pattern. Dabei wird wird nur eine Komponente erzeugt, die wie ein Stempel verwendet wird. Es wird also nicht für jede Zelle ein eigene Component benötigt, sondern nur eine. In getTableCellRendererComponent werden lediglich der Text gesetzt und das Aussehen (Rahmen etc.) verändert.
 

max514

Bekanntes Mitglied
Hey nochmal ne frage ? ich hab jetzt alles hinbekommen jetzt will ich aber bei meinem anderen jTable nicht nur eine sondern 2 spalten seperat(jeweils abhängig von einem Datum ) färben ? das Hat auch so funktioniert aber wenn es beide Spalten färben soll nimmt nur die 2 Spalte die farbe an ?
Java:
public void tableJ(JTable j) {
        DateFormat df = new SimpleDateFormat("dd.MM.yyyy");
        LocalDate jetzt = LocalDate.now();
       

        j.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value,
                    boolean isSelected, boolean hasFocus, int row, int column) {
                Component c = super.getTableCellRendererComponent(table, value,
                        isSelected, hasFocus, row, column);
                String t = (String) table.getValueAt(row, 11).toString();
               
               
                if (column == 8) {
                   
                    try {
                        Date fer = new SimpleDateFormat("dd.MM.yyyy").parse((String) table.getValueAt(row, 8));
                        String n = df.format(fer);
                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
                        LocalDate fert = LocalDate.parse(n, formatter);  
                        Boolean x = (Boolean) table.getValueAt(row, 9);
                        if (fert.compareTo(jetzt) <= -1 && x == false) {
                            c.setBackground(Color.RED);
                            c.setForeground(Color.BLACK);
                           
                        }
                       
                        if (fert.compareTo(jetzt) == 0 && x == false) {
                            c.setBackground(Color.ORANGE);
                            c.setForeground(Color.BLACK);
                           
                        }
                       
                        if (fert.compareTo(jetzt) == 1 && x == false) {
                            c.setBackground(Color.YELLOW);
                            c.setForeground(Color.BLACK);
                           
                        }
                    } catch (ParseException ex) {
                        Logger.getLogger(Vergleich.class.getName()).log(Level.SEVERE, null, ex);
                    }
                   
                } else {
                    c.setBackground(Color.WHITE);
                    c.setForeground(Color.BLACK);
                }
               
                if (column ==11) {
                   
                    try {
                        Date neu = new SimpleDateFormat("dd.MM.yyyy").parse((String) table.getValueAt(row, 11));
                        String n = df.format(neu);
                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
                        LocalDate be = LocalDate.parse(n, formatter);  
                        Boolean x = (Boolean) table.getValueAt(row, 12);
                        if (be.compareTo(jetzt) <= -1 && x == false) {
                            c.setBackground(Color.RED);
                            c.setForeground(Color.BLACK);
                            c.setFont(new Font("Tahoma", Font.BOLD, 17));
                        }
                       
                        if (be.compareTo(jetzt) == 0 && x == false) {
                            c.setBackground(Color.ORANGE);
                            c.setForeground(Color.BLACK);
                            c.setFont(new Font("Tahoma", Font.BOLD, 17));
                        }
                       
                        if (be.compareTo(jetzt) == 1 && x == false) {
                            c.setBackground(Color.YELLOW);
                            c.setForeground(Color.BLACK);
                            c.setFont(new Font("Tahoma", Font.BOLD, 17));
                        }
                    } catch (ParseException ex) {
                        Logger.getLogger(Vergleich.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    }else {
                    c.setBackground(Color.WHITE);
                    c.setForeground(Color.BLACK);
                }
               
                return c;
            }
           
           
        });
    }

Ich weiß zwar wo der fehler liegt aber ich weiß nicht wie ich ihn behebe
 

mihe7

Top Contributor
Setz die Standardfarben einfach zuerst und prüf im Anschluss auf die Spalten. Da der Code allmählich umfangreich wird, würde es sich auch anbieten, den TableCellRenderer generischer zu gestalten und z. B. an registrierte TableCellRenderer zu delegieren.
 

max514

Bekanntes Mitglied
Ja mein Programm ist fertig also länger wird der code nicht und ich glaube für die Projektarbeit in Wirtschaftsinformatik bei so wenig Programmierkentnissen ist das mehr als ausreichen =)
 

Onkel Tom

Mitglied
Habe dein Programm ausprobiert, prima es läuft. werde ich mir merken. Dein Programm bezieht sich auf Swing-Programme. Ich schreibe ein Tool für die Konsole und suche Befehle für die Programmausgaben mit wechselnder Farbgebung.

Tom
 

Ähnliche Java Themen

Neue Themen


Oben