Swing CustomCellRenderer

Paxi

Mitglied
Hi Leute, ich bin gerade dabei ein GUI für ein OfficeVerwaltungstool zu schreiben, dass ich im Rahmen meines Informatikstudiums gerade programmiere.

Ich hab hier ein kleines Problem bzg eines CustomCellRenderer.
Ich will einen CellRenderer, den ich als DefaultRenderer für meinen Table setzte und der mir danach jede zweite Zeile anders einfärben soll (ohne noch etwas markiert zu haben etc.)
Hab bereits etwas gegooglet und bisschen durch die JavaDoc gestöbert aber bin noch nicht wirklich auf das Problem gekommen.
Meine Renderer ist bisher so aufgebaut:
Java:
public class CustomTableCellRenderer extends JLabel implements TableCellRenderer {

        private Color lightblue = new Color(160,160,255);
        private Color darkblue = new Color(64,64,128);
        
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
 
            if(row%2 == 0) {
                this.setBackground(lightblue);
            }
            else this.setBackground(darkblue);         

            if(isSelected) {
                //...
            }

            if(hasFocus) {
                //...
            }

            setText(value.toString());
            //setToolTipText(value.toString());

            return this;
        }

    }

Wenn ich den Renderer nun nachdem ich meinen Table mit Daten befüllt habe mit
Java:
table.setDefaultRenderer(Object.class, new CustomTableCellRenderer());
passiert mal gar nichts.
mit
Java:
table.setDefaultRenderer(String.class, new CustomTableCellRenderer());
werden zumindest noch die makierten Reihen eingefärbt vom DefaultTableCellRenderer, was mich schonmal etwas stutzig macht weil ja schließlich Object.class für alles gelten sollte.

Ich verwende das DefaultTableModel, das ich meinem Table im Konstruktor übergeben, sofern das eine Rolle spielt.

Und noch eine weitere Frage, wie werden die Daten eigentlich intern von Java an den TableCellRenderer übergeben, beim hinzufügen einer Reihe, Spalte?

Danke schonmal im Vorhinein.
Grüße Chris
 

Paxi

Mitglied
Scheinbar hab ich irgendeinen Fehler beim setzen des Renderes gemacht. Nun scheint er zu laufen wie erwünscht.
Was mich allerdings nur immer noch interessieren würde bzg dessen wie Java das Intern verwaltet. Die Methode gibt ja einen Component, in dem Fall von JLabel abgeleitet zurück. Heißt, das dann das in jeder Zelle ein JLabel steht? Wenn ich es nämlich ausgebe mit .getClass() hab ich nur Strings, die ich ja auch als Daten einfüge.
Und eben zweiteres noch bzg wie eigentlich die Ganzen Daten an den Renderer übergeben werden.
Weil Daten fügt man ja ansich nur mit addColum und addRow hinzu. Und in der Javadoc steht beschrieben welche Werte der Renderer übergeben bekommt: TableCellRenderer (Java 2 Platform SE v1.4.2)
Man selbst kümmert sich aber eigentlich nicht darum oder sehe ich das falsch?
 

Michael...

Top Contributor
Die Zellen eine JTable werden nur gerendert (daher CellRenderer ;-)). D.h. wenn die JTable eine Zelle zeichnen will/muss übergibt sie notwendige Informationen wie den Inhalt, ob selektiert oder gar fokusiert an den Renderer. Dieser richtet die Komponente entsprechend ein und die JTable malt den aktuellen Zustand an die Zellposition. Danach übergibt sie dem Renderer die Informationen für die nächste zu zeichnende Zelle usw.
Das ganze hat den Vorteil, dass man nicht für jede Zelle eine eigene graphische Komponente benötigt.
 

Michael...

Top Contributor
Das Abwechselnde Einfärben von Zeilen könnte man auch ohne eigenen Renderer durch überschreiben der prepareRenderer(...) von JTable umsetzen. Hätte den Vorteil, dass man in den Spalten (fast) beliebig unterschiedliche Renderer einsetzen könnte ohne darin direkt das abwechselnde Färben des Hintergrunds implementieren zu müssen.
 

zerix

Mitglied
Das Abwechselnde Einfärben von Zeilen könnte man auch ohne eigenen Renderer durch überschreiben der prepareRenderer(...) von JTable umsetzen. Hätte den Vorteil, dass man in den Spalten (fast) beliebig unterschiedliche Renderer einsetzen könnte ohne darin direkt das abwechselnde Färben des Hintergrunds implementieren zu müssen.

Ich persönlich würde es nicht so lösen.
Eine Möglichkeit die ich besser finde, man schreibt sich einen Renderer der andere Renderer aufnehmen kann.

Java:
import java.awt.Color;
import java.awt.Component;
 
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
 
 
public class WrappingCellRenderer implements TableCellRenderer {
    
    private TableCellRenderer wrappedCellRenderer;
    
    public WrappingCellRenderer(TableCellRenderer cellRenderer) {
        super();
        this.wrappedCellRenderer = cellRenderer;
    }
 
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component rendererComponent = wrappedCellRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        
        if(row % 2)
            rendererComponent.setBackground(Color.GRAY);
        else
            rendererComponent.setBackground(Color.WHITE );
 
        
        return rendererComponent;
    }
 
}


Java:
table.setDefaultRenderer(Object.class, new WrappingCellRenderer(table.getDefaultRenderer(Object.class)));

Gruß

zerix
 

Neue Themen


Oben