Swing JTable mit ImageIcon und Text in einer Zelle

keram

Aktives Mitglied
Hey Leute, ich bin mal wieder am werkeln und bin an einem Punkt angekommen wo ich euren Rat gebrauchen könnte.

Ich habe mir ein JTable erzeugt und möchte nun in meine erste Zelle ein ImageIcon setzen plus einen kleinen Text.

Ich habe mir eine Classe erstellt um mir mein DefaultTableCellRenderer Object zu erstellen.
Die Classe macht momentan noch nicht viel, außer eine Methode zu überschreiben welches prüft ob mein Object eine instanz von einem ImageIcon ist.

Java:
class ImageCellRenderer extends DefaultTableCellRenderer {
    @Override
    public void setValue( Object o ) {
        if( o instanceof ImageIcon ) {
            setIcon( (ImageIcon)o );
        }
        else
            setText( o.toString() );
    }

}

Ein DefaultTableCellRenderer erbt von einem JLabel, weswegen wir einfach setIcon machen können.

Nun kommt der Part wo der Computer Amok läuft.
zfk3dl7z.png


Wie man sieht benutzt die JTable meinen Renderer, jedoch nicht richtig.
Ich habe versucht meine Table mittels table.setDefaultRenderer( ImageIcon.class, new ImageCellRenderer() ); zu rendern, jedoch ohne Erfolg. Als ich ImageIcon.class zu Object.class geändert habe geht es natürliche ohne Probleme...

Nun zu meinen Fragen:
1. Wie halte ich den Renderer auf in jede Zeile zu schreiben? Er soll nur in die erste Column schreiben...
2. Gibt es eine Möglichkeit den Renderer zu sagen das er den bestehenden Content in der Zelle stehen lassen soll und lediglich das Icon vor die Daten setzt?

Meine Vorschläge:
1. Der Zelle zwei Objecte vom Typ JLabel hinzufügen, dem ersten das Icon geben dem zweiten den Text. Mein Problem dabei ist jedoch das ich nicht weiß wie ich durch das DefaultTableModel zwei Objecte gleichzeitig hinzufügen kann...

Ich bitte um Hilfe, bei Fragen, haut in die Tasten!
 
Normalerweise überschreibt man getTableCellRendererComponent
Java:
  @Override
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
   final Component tableCellRendererComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
   if (column == 0) {
    setIcon(icon);
   } else {
    setIcon(null);
   }
   return tableCellRendererComponent;
  }

Man kann auch das if-else weglassen, das Icon immer setzen und mit table.getColumn("MeineSpalte").setCellRenderer(renderer); den Renderer nur für eine ganz bestimmte Spalte setzen.
 

Neue Themen


Zurück
Oben