DefaultTableCellRenderer

Status
Nicht offen für weitere Antworten.

dimitrif

Mitglied
Leute HILFEEEEEE!!!!!!!!!!!!!!!!!

Ich komme einfach nicht weiter.

Also, ich habe eine Tabelle, die jTable1 heißt

wenn ich so was schreibe:



Code:
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<7;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)==7){
                        label.setBackground(Color.white);
                    }
                } 
                return c; 
            } 
        };

dann funktioniert meine Tabelle wunderbar.

Ich will aber meine Tabelle nicht immer neu erstellen.

Also, habe ich eine Klasse geschrieben:


Code:
public class meineKlasse extends DefaultTableCellRenderer {

      //prepareRenderer überschreiben: 
           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; 
            }
   }

nur wie kann ich dann diese Klasse aufrufen und meine Tabelle zuweisen?


Danke

[Edit by Beni: Codetags]
 
G

Gast

Gast
schau mal in den FAQs, da stehts wunderbar beschrieben...du machst das auch irgendwie koimsch.
 

outbreaker

Bekanntes Mitglied
API schreibt:

Code:
JTable#setDefaultRenderer(Class<?> columnClass, TableCellRenderer renderer)
//Sets a default cell renderer to be used if no renderer has been set in a TableColumn.

Also bei dir dann wohl so:

Code:
jTable1.setDefaultRenderer(Obejct.class, new meineKlasse ());
 

dimitrif

Mitglied
outbreaker hat gesagt.:
API schreibt:

Code:
JTable#setDefaultRenderer(Class<?> columnClass, TableCellRenderer renderer)
//Sets a default cell renderer to be used if no renderer has been set in a TableColumn.

Also bei dir dann wohl so:

Code:
jTable1.setDefaultRenderer(Obejct.class, new meineKlasse ());


Hallo, danke für die Antwort,

ich mache es auch so

Code:
jTable1.setDefaultRenderer(Obejct.class, new meineKlasse ());

ich sehe aber keine Veränderungen.

Vielleicht ist meineKlasse falsch geschrieben?

Code:
public class meineKlasse extends DefaultTableCellRenderer {

      //prepareRenderer überschreiben: 
           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; 
            }
   }


:(
 

outbreaker

Bekanntes Mitglied
Was willst du den Erreichen?

gehe ich Richtig in der Annahme das du die Zellen Formatieren willst?
Vielleicht solltest du lieber diese Methode überschreiben:

Code:
getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
 

dimitrif

Mitglied
Vielen Dank für die Antwort,

ja, das soll ein Kalender sien, Sa, So hat eine andere Farbe. Es kann sein, die Methode, die du vorgeschlagen hast ist besser, aber bei der gibt es so viel Parameter. Wie soll ich das umsetzen, letzendlich brauche ich nur Hintergrundfarbe von Zellen.....

Kannst du mir vielleicht irgendeinen Beispiel zeigen. Ich habe zwar ein bisschen gegoogelt, aber das war nicht wirklich zutreffend.


Danke
 

outbreaker

Bekanntes Mitglied
in der API steht was die Parameter bedeuten

zurückgeben musst du ein Component
Das kann alles Möglich sein was du halt in der Zelle haben willst (JComboBox,JTextField, JLabel,...)

Wenn du z.B. die Hintergundfarbe einer Zelle ändern willst dann kannst du das auf folgende Art machen:

Code:
public class MyRenderer extends DefaultTableCellRenderer {

	@Override
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		JLabel label = new JLabel((String)value); //Vorrausgesetzt da kommt auch ein String von deinem Model
		label.setBackground(Color.RED);
		return label;
	}
	
}
 

dimitrif

Mitglied
Ich habe jetzt folgendes stehen, mit der Tabelle passiert aber nichts - alles bleibt beim Alten.

Was hast du mit String von meinem Model gemeint?

Code:
public class MyRenderer extends DefaultTableCellRenderer { 

   @Override 
   public Component getTableCellRendererComponent(JTable table, Object value, 
         boolean isSelected, boolean hasFocus, int row, int column) { 
      JLabel label = new JLabel((String)value); //Vorrausgesetzt da kommt auch ein String von deinem Model 
      label.setHorizontalAlignment(JLabel.CENTER);
      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 label; 
   } 
    
}


    private void cleancalendar(java.awt.event.ActionEvent evt) {                               
        jTable1.setDefaultRenderer(Object.class, new MyRenderer());
    }

mit der Tabelle passiert aber nichts - alles bleibt beim Alten.

Was hast du mit String von meinem Model gemeint?
 

outbreaker

Bekanntes Mitglied
hast du mal den einfachen Renderer versucht den ich geschrieben habe?
passiert da auch nichts?

Ich meinte mit String von deinem model das der value welcher in die Methode gegeben wird auch wirklich ein String ist
wegen dem Cast auf String

Du kannst ja auch ganz andere Objecte in deinem Model von der Tabelle speichern als Strings und dann wäre das value kein String sondern halt eine andere Klasse und würde an der Stelle des Castens eine Exception auslösen
 

dimitrif

Mitglied
outbreaker hat gesagt.:
hast du mal den einfachen Renderer versucht den ich geschrieben habe?
passiert da auch nichts?

Ich meinte mit String von deinem model das der value welcher in die Methode gegeben wird auch wirklich ein String ist
wegen dem Cast auf String

Du kannst ja auch ganz andere Objecte in deinem Model von der Tabelle speichern als Strings und dann wäre das value kein String sondern halt eine andere Klasse und würde an der Stelle des Castens eine Exception auslösen

ich habe das auch mit deinem Beispiel ausprobiert. Da passiert auch nichts.

Meine Tabelle wird eigentlich am Anfang so erzeugt:

Code:
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<7;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)==7){
                        label.setBackground(Color.white);
                    }
                } 
                return c; 
            } 
        };
jTable1.setFont(new java.awt.Font("Times New Roman", 0, 14));
        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                week1,week2,week3,week4,week5,week6
            },
            new String [] {
                "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false, false, true
            };

            @Override
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jTable1.setCellSelectionEnabled(true);
        jTable1.setDoubleBuffered(true);
        jTable1.setSelectionBackground(new java.awt.Color(51, 204, 0));
        jTable1.setSelectionMode(javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        jTable1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                startday(evt);
            }
        });

asdasd
 

dimitrif

Mitglied
Das bedeutet, dass die am Anfang schon richtig konfiguriert wird, aber danach kann ich einiges markieren und um das wieder rückgängig zu machen brauche ich das Anfangsmodel.
 

outbreaker

Bekanntes Mitglied
habe gerade mal ein kurzes test Beispiel geschrieben aus irgend einem Grund setzt er den Hintergrund nicht
bei setForeground funktioniert mein Renderer

muss ich mir mal später nochmal genauer ansehen
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben