Swing: jTableCellRenderer -> Klappt nur bei String-Spalte

Status
Nicht offen für weitere Antworten.

mabe83

Mitglied
Hallo Forum,

ich möchte eine Tabelle farblich etwas aufpeppen. Dazu habe ich TableCellRenderer implementiert und die Methode getTableCellRendererComponent entsprechend angepasst.

Leider wirken sich die Änderungen nur auf Zellen aus, welche vom Typ String sind und das obwohl ich auf alle Datentypen (ich habe jedoch auch Double, Integer und Date Spalten in meiner Tabelle) geachtet habe. Ich sehe in meinem Code keinen Fehler, aber vielleicht habe ich die Anwendung falsch verstanden.

Wäre super wenn ihr mir ein paar Tipps geben könntet. Hier die Methode: (Lacht nicht über die If-Else, dass hat mir das AutoFormat von Netbeans so herausgegeben)

Code:
public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column)
    {
        JLabel label = null;

        if (value instanceof String)
        {
            label = new JLabel((String) value);
        }
        else
        {
            if (value instanceof Double)
            {
                label = new JLabel(((Double) value).toString());
            }
            else
            {
                if (value instanceof Integer)
                {
                    label = new JLabel(((Integer) value).toString());
                }
                else
                {
                    if (value instanceof Date)
                    {
                        label = new JLabel(((Date) value).toString());
                    }
                }
            }
        }
        
        label.setOpaque(true);
        label.setBorder( BorderFactory.createEmptyBorder(1, 1, 1, 1) );
        label.setFont(table.getFont());
        label.setForeground(table.getForeground());
        label.setBackground(new Color(255, 150, 0));
        label.setToolTipText("ich bin ein tipp");

        return label;
    }
 
Wie hast du den Renderer der Tabelle übergeben?
Mit "setDefaultRenderer( Object.class, new MyRenderer() )"?

Dann musst du dasselbe noch für "Double.class", etc. machen (kannst dort auch einen anderen Renderer setzen, das würde dir diese "instanceof"s ersparen.
Wieso? Weil es für diese speziellen Klassen schon vorinstallierte Renderer gibt, und das JTable immer denjenigen Renderer nimmt der am besten passt (und bei einem Date passt der Renderer der für Date.class angemeldet wurde besser als derjenige für Object.class).

P.S.: NIE NIE NIE in einem Renderer ein "new JLabel" machen. Du kannst dieselbe Komponenten mehrfach benutzen (schau nach wie es der DefaultTableCellRenderer macht!). Wiederverwendung spart kilometerweise Speicher und Rechenzeit.
 
Vielen Dank für die schnelle Hilfe.

Ja, ich habe den Renderer mit setDefaultRenderer( Object.class, new MyRenderer() ) gesetzt. Werde nun für jeden Typ einen eigenen Renderer implementieren. Danke für den Tipp!

Das man nicht das new JLabel verwenden soll (eben weil es jedes mal neu angelegt wird) habe ich auch schon gelesen. Werde mich gleich als nächstes um eine Alternative kümmern. Danke auch für diesen Hinweis!

Ich schreibe dann meine Lösung hier her, damit auch andere etwas davon haben.

EDIT:

Hier nun meine neue Variante. Im Prinzip ist gar kein großer Aufwand zu betreiben. Man muss nur von JLabel ableiten und die Instanz selbst returnen, da die Klasse selbst nun das JLabel ist. Hier noch ein kleines Beispiel:

Code:
import java.awt.Color;
import java.awt.Component;
import java.util.Date;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class jTableCellRendererForDate extends JLabel implements TableCellRenderer
{
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column)
    {
        this.setText(((Date)value).toString());
        this.setOpaque(true);
        this.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
        this.setFont(table.getFont());
        this.setForeground(table.getForeground());
        this.setBackground(new Color(255, 150, 0));

        return this;
    }
}

Und noch ein Link zu einem weiten Bsp inkl Erklärung: http://exampledepot.com/egs/javax.swing.table/CustRend.html
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben