Problem mit CustomTableCellRenderer (Swing)



  • 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:

    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

    table.setDefaultRenderer(Object.class, new CustomTableCellRenderer());
    

    passiert mal gar nichts.
    mit

    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



  • Welche Daten sind denn in den einzelnen Columns? Lass dir mal via einem Logger ausgeben ob deine Methode aufgerufen wird.

    MfG SideWinder



  • 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: http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/table/TableCellRenderer.html
    Man selbst kümmert sich aber eigentlich nicht darum oder sehe ich das falsch?



  • Den Renderer nutzt dann Java intern zum Anzeigen.

    Q: Warum ein JLabel?
    A: Du musst gar kein JLabel zurückgeben, beliebige Komponenten sind möglich. Du könntest also auch Checkboxen, etc. einbauen.

    Q: Warum überhaupt eine Komponente und nicht einfach ein String?
    A: Naja, damit eben auch ComboBoxes, CheckBoxes, etc. möglich sind.

    Q: dass jede Zelle ein JLabel beiinhaltet
    A: Das würde zuviel Speicher kosten, deswegen wird der Inhalt gestempelt. Du gibst der Tabelle im Renderer eine Komponente zurück, diese painted sie dann an die richtige Stelle, ruft dich wieder auf (du legst jetzt aber keine neue Komponente an sondern veränderst nur die bisherige - Speicherersparnis) usw. usf.

    Q: Wie werden dem Renderer die Daten übergeben?
    A: Das macht die JTable intern wenn sie informiert wird sich neu zu zeichnen.

    MfG SideWinder



  • Danke dir SideWinder 🙂
    Das hat meine Unklarheiten beseitigt


Anmelden zum Antworten