Frage zu eigenem TableCellRenderer

CConraths

Aktives Mitglied
Hallo Forum
ich möchte Zellen in einem JTable unter bestimmten Bedingungen farbig hinterlegen.
Ich habe dazu diese Klasse angelegt
Java:
public class MyTableCellRenderer extends JLabel implements TableCellRenderer
{
    private static final long serialVersionUID = 1L;

public MyTableCellRenderer()
   {
       super.setOpaque(true);
   }
    
   @Override
   public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
       boolean hasFocus, int row, int column)
   {
       String string = (String) value;
       if(string.equals("Summe Tag")) {
           super.setBackground(Color.GREEN);
       }
       else if(string.equals("Summe Monat")) {
           super.setBackground(Color.BLUE);
       }
       else  {
           super.setBackground(Color.WHITE);
       }
       return this;
   }   
}

Mein Problem ist das der Text der in der Zelle stand verschwunden ist. Das mit den Farben klappt.
Kann mir da bitte jemand helfen.

Viele Grüße
Christian
 
Naja, Du musst den Text des JLabels natürlich auch setzen 🙂
Java:
setText(string);
 
nun noch eine Frage zu diesem Thema
bei der Lösung der Aufgabe wenn ich aufgrund der Bedingung in der ersten Zelle die x-te Zelle farbig hervorheben will habe ich keinen Ansatz gefunden.
Wie mache ich denn sowas ???
Danke für jede Hilfe.
Christian
 
Java:
Object firstCellValue = table.getModel().getValueAt(row, 0);
boolean inDailyTotalLine = "Summe Tag".equals(firstCellValue);

if (inDailyTotalLine) {
     setBackground(Color.GREEN);
     if (col == 1) {
          setFont(boldFont);
     }
}
...
Du meinst so etwas in der Richtung?
 
Hallo mihe7
in deinem Beispiel nimmst du column = 1 als Abfrage
getTableCellRendererComponent wird aber bei mir immer nur mit column 0 aufgerufen
Wenn ich column 12 farbig setzen will habe ich doch diese gar nicht im Zugriff
 
eieiei
für dich ist das Tagesgeschäft aber ich bin nicht so tief drinnen in der Objektorientierung.
Ich versuche das nachzuvollziehen also
der eigene TableCellRenderer gibt mir die Möglichkeit die Methode getTableCellRendererComponent zu überschreiben.

ich rufe ihn mit den Parametern "Table,value,isSelected,hasFocus,row,column" auf.

Ich habe einen Table mit 16 Spalten. Davon möchte ich in der Zelle (0,11) (1,11) (2,11).... die Farbe setzen wenn in (0,0), (1,0),(2,0) ein bestimmter Wert steht
Java:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
   {
      
       Object firstCellValue = table.getModel().getValueAt(row, 0);       
       String string = (String) firstCellValue;
       if(string.equals("Summe Tag")) {
           super.setBackground(Color.GREEN);
           super.setText(string);
       }
       else if(string.equals("Summe Monat")) {
           super.setBackground(Color.CYAN);
           super.setText(string);
       }
       else  {
           super.setBackground(Color.WHITE);
           super.setText(string);
       }
       super.setText(string);
       return this;
   }

aufrufen tue ich wie folgt

Code:
mtr.getTableCellRendererComponent(alle_einsatzverfuegungen_table, alle_einsatzverfuegungen_table.getColumnModel().getColumn(11), false, false, 0, 11);

Das hier setzt die Farbe für die Zellen (0,0), (1,0),(2,0)


was muss ich parameterseits übergeben um die 11 te Spalte mit einer Farbe zu überschreiben.

wer wie was wiso weshalb warum wer nicht fragt bleibt dumm

🙂


Danke für jede Hilfestellung.


 
ich rufe ihn mit den Parametern "Table,value,isSelected,hasFocus,row,column" auf.
Nein, JTable ruft ihn auf 🙂 Du musst dem ColumnModel der JTable nur sagen, für welche Spalte welcher Renderer verwendet werden soll. Ich muss jetzt weg, aber vielleicht kann ich Dir heute Nacht schnell ein Beispiel reinklopfen - wenn ich drandenke.
 
Beispiel:
Java:
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class Test {

    static class CellColorDecorator implements TableCellRenderer {
        private final TableCellRenderer delegate;
       
        public CellColorDecorator(TableCellRenderer delegate) {
            this.delegate = delegate;
        }
       
        public static void install(JTable table) {
            TableColumnModel columns = table.getColumnModel();
            for (int i = 0, n = columns.getColumnCount(); i < n; i++) {
                TableColumn column = columns.getColumn(i);
                TableCellRenderer delegate = column.getCellRenderer();
                if (delegate == null) {
                    delegate = new DefaultTableCellRenderer();
                }

                column.setCellRenderer(new CellColorDecorator(delegate));
            }
        }
       
        @Override
        public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus,
                int row, int column) {
            Component comp = delegate.getTableCellRendererComponent(table,
                    value, isSelected, hasFocus, row, column);
                   
            Object firstCellValue = table.getModel().getValueAt(row, 0);
            boolean inDailyTotalLine = "Summe Tag".equals(firstCellValue);
           
            if (!isSelected && !hasFocus) {
                if (inDailyTotalLine) {
                    comp.setBackground(Color.GREEN);
                } else {
                    comp.setBackground(table.getBackground());
                }
            }

            return comp;
        }
    }

    public void run() {
        Object[][] data = {
            {"Anna", 14},
            {"Hans", 12},
            {"Summe Tag", 26},
            {"Anna", 10},
            {"Hans", 8},
            {"Summe Tag", 18}
        };
       
        JTable table = new JTable(data, new Object[]{"Wer","Was"});       
       
        CellColorDecorator.install(table);
   
        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());
    }
}
 
Hallo mihe7
vielen Dank für dein Beispiel welches standalone auch das leistet was ich machen will.

Ich möchte es aber nicht als eigene Klasse verwenden sondern in mein Projekt includieren.
Und hier scheitere ich erneut.
Java:
alle_einsatzverfuegungen_table = new JTable(alle_einsatzverfuegungen_table_model);
CellColorDecorator.install(alle_einsatzverfuegungen_table);

so rufe ich die install-methode auf
und das habe ich implementiert
Code:
    static class CellColorDecorator implements TableCellRenderer {
        private final TableCellRenderer delegate;
      
        public CellColorDecorator(TableCellRenderer delegate) {
            this.delegate = delegate;
        }
      
        public static void install(JTable table) {
            TableColumnModel columns = table.getColumnModel();
            for (int i = 0, n = columns.getColumnCount(); i < n; i++) {
                TableColumn column = columns.getColumn(i);
                TableCellRenderer delegate = column.getCellRenderer();
                if (delegate == null) {
                    delegate = new DefaultTableCellRenderer();
                }

                column.setCellRenderer(new CellColorDecorator(delegate));
            }
        }
      
        @Override
        public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus,
                int row, int column) {
            Component comp = delegate.getTableCellRendererComponent(table,
                    value, isSelected, hasFocus, row, column);
                  
            Object firstCellValue = table.getModel().getValueAt(row, 0);
            boolean inDailyTotalLine = "Summe Tag".equals(firstCellValue);
          
            if (!isSelected && !hasFocus) {
                if (inDailyTotalLine) {
                    comp.setBackground(Color.GREEN);
                } else {
                    comp.setBackground(table.getBackground());
                }
            }

            return comp;
        }
    }

getTableCellRendererComponent wird aber immer nur mit dem ersten Column jeder Zeile aufgerufen.
Das wird dann auch grün unterlegt.
Wo muss ich denn eingreifen, damit alle Spalten der Reihe gerendert werden ???

Da steh ich auf dem Schlauch
Danke für jede Hilfe
 

Neue Themen


Zurück
Oben