# JTable TableCellRenderer



## dimitrif (3. Dez 2007)

Hallo,

ich habe eine Frage, da ich relativ neu in Java bin, weiß ich nicht genau, wie ich es machen kann.

Also, ich habe eine JTable, die von mir erzeugt wurde. Dabei habe ich TableCellRenderer eingesetzt, denn es muss ein Kalender werden. Alles funktioniert:


```
jTable1 = new javax.swing.JTable(){
            //prepareRenderer überschreiben: 
            @Override public Component prepareRenderer(final TableCellRenderer renderer, 
                    final int row, final int column) { 
                Component c = super.prepareRenderer(renderer, row, column);
                if(c instanceof JLabel){ 
                    JLabel label = (JLabel)c; 
                    label.setHorizontalAlignment(JLabel.CENTER);
                // Hier beginnt die Farbformatierung der Zeilen für Sa und So
                int n;
                for(n=0;n<6;n++){
                    if (this.convertColumnIndexToModel(column)==0 && this.convertRowIndexToModel(row)==n){
                        label.setBackground(Color.white);
                    }
                    if (this.convertColumnIndexToModel(column)==5 && this.convertRowIndexToModel(row)==n){
                        Color Farbe = new Color (204,204,204);
                        label.setBackground(Farbe);
                    }
                }
                 if (this.convertColumnIndexToModel(column)==0 && this.convertRowIndexToModel(row)==6){
                    label.setBackground(Color.white);
                    }
                } 
                return c; 
            } 
        };
```
......................

nur, da ich noch unterschiedliche Felder markiern muss nd diese markierungen sind von unterschiedlichen Buttons abhängig, muss ich meine Tabelle immer neu gestalten, das geht zwar auch, aber ist irgendwie umständlich.

Wie kann ich dieses Teil hier:


```
//prepareRenderer überschreiben: 
            @Override public Component prepareRenderer(final TableCellRenderer renderer, 
                    final int row, final int column) { 
                Component c = super.prepareRenderer(renderer, row, column);
                if(c instanceof JLabel){ 
                    JLabel label = (JLabel)c; 
                    label.setHorizontalAlignment(JLabel.CENTER);
                // Hier beginnt die Farbformatierung der Zeilen für Sa und So
                int n;
                for(n=0;n<6;n++){
                    if (this.convertColumnIndexToModel(column)==0 && this.convertRowIndexToModel(row)==n){
                        label.setBackground(Color.white);
                    }
                    if (this.convertColumnIndexToModel(column)==5 && this.convertRowIndexToModel(row)==n){
                        Color Farbe = new Color (204,204,204);
                        label.setBackground(Farbe);
                    }
                }
                 if (this.convertColumnIndexToModel(column)==0 && this.convertRowIndexToModel(row)==6){
                    label.setBackground(Color.white);
                    }
                } 
                return c; 
            }
```

immer wieder aufrufen, ohne die Tabelle neu zu erzeugen?

Danke


----------



## Beni (3. Dez 2007)

Sorg dafür, dass das TableModel sagt "ich habe mich verändert, zeichne mich neu". Falls du ein AbstractTableModel oder DefaultTableModel verwendest, dann ruf die Methode "fireTableDataChanged()" auf um die Information abzuschicken.


----------



## dimitrif (28. Jan 2008)

Ich brauche immer noch Hilfe. 

Ich habe für meine jTable1 eine Klasse erzeugt:


```
class egal extends DefaultTableCellRenderer {
       public Component prepareRenderer(final TableCellRenderer renderer, 
                final int row, final int column) { 
                Component c = jTable1.prepareRenderer(renderer, row, column); 
                if(c instanceof JLabel){ 
                    JLabel label = (JLabel)c; 
                    label.setHorizontalAlignment(JLabel.CENTER);
                    // Hier beginnt die Farbformatierung der Zeilen für Sa und So
                    int n;
                    for(n=0;n<7;n++){
                        if (jTable1.convertColumnIndexToModel(column)==0 && jTable1.convertRowIndexToModel(row)==n){
                            label.setBackground(Color.white);
                        }
                        if (jTable1.convertColumnIndexToModel(column)==5 && jTable1.convertRowIndexToModel(row)==n){
                            Color Farbe = new Color (204,204,204);
                            label.setBackground(Farbe);
                        }
                    }
                    if (jTable1.convertColumnIndexToModel(column)==0 && jTable1.convertRowIndexToModel(row)==7){
                        label.setBackground(Color.white);
                    }
                } 
                return c; 
            }
   }
```


Dann habe ich ein Ereignis:


```
private void cleancalendar(java.awt.event.ActionEvent evt) {                               
        DefaultTableCellRenderer ren = new egal();
        jTable1.setDefaultRenderer(egal.class, ren);
        zeile=-1;
    }
```

und dann passiert nichts......  

            wenn ich fireTableDataChanged() verwende, dann findet er diese Methode nicht.


Was mache ich falsch?


Vielen Dank


----------

