2017-11-17 2 views
0

Ich habe eine JTable, die ich dynamisch von List<String> Objekte erstellen. Ich mache das wahrscheinlich völlig falsch, aber es funktioniert. Das einzige, was ich nicht zur Arbeit bringen kann, ist das Hinzufügen von Bildern zu einigen der Zellen.So fügen Sie Bilder zu einer dynamisch erstellten JTable hinzu

Alles, was es tut, ist die ImageIcon Objektname als String zu den Zellen hinzugefügt. Siehe meinen Code unten.

private static Image doneImage = getIconImage("doneImage"); 
private static Image notDoneImage = getIconImage("notDoneImage"); 

private DefaultTableModel model = new DefaultTableModel(){ 
    @Override 
    public Class<?> getColumnClass(int column){ 
     if ((column & 1) != 0){ 
      return ImageIcon.class; 
     }else{ 
      return String.class; 
     } 
    } 
}; 

initTables(); 

JTable table = new JTable(); 
table.setModel(model); 

private void initTables(){ 

    model.addRow(new Object[]{}); 

    int rowsToAdd = 0; 
    int rowCount = 0; 
    int columnId = 0; 

    for(HouseObject aHouse : houses){ 
     for(RoomObject aRoom : aHouse.getRooms()){ 

      model.addColumn(null); 
      model.addColumn(aRoom.getId()); 
      model.setValueAt(aRoom.getId(), 0, columnId); 

      if (rowCount < aRoom.getEvents().size()){ 
       rowsToAdd = aRoom.getEvents().size() - model.getRowCount(); 
       for(int i = 0; i <= rowsToAdd; i++){ 
        model.addRow(new Object[]{}); 
       } 
       rowCount = model.getRowCount(); 
      } 

      for(int i = 0; i < aRoom.getEvents().size(); i++){ 
       model.setValueAt(aRoom.getEvents().get(i).getId(), i+1, columnId); 

       for(String houseDone : housesDone){ 
        if(aRoom.getEvents().get(i).getId().contains(houseDone)){ 
         model.setValueAt(doneImage , i+1, columnId+1); // this does not work 
        }else{ 
         model.setValueAt(notDoneImage, i+1, columnId+1); 
        } 
       } 
      } 

      columnId = columnId+2; 
     } 
    } 
} 

Antwort

1

Sie benötigen Renderer

Hier für Ihre Tabelle zu installieren, ist der Renderer:

public class IconTableCellRenderer extends DefaultTableCellRenderer { 

    @Override 
    protected void setValue(Object value) { 
     if (value instanceof Icon) { 
      setText(null); 
      setIcon((Icon) value); 
     } else { 
      super.setValue(value); 
     } 
    } 
} 

Und so müssen Sie es installieren:

JTable table = new JTable(); 
table.setModel(model); 
table.setDefaultRenderer(ImageIcon.class, new IconTableCellRenderer()); 
+0

Das funktioniert. Ich hatte bereits einen CellRenderer für die Schriftfarbe, aber ich habe nicht verstanden, dass ich 'setValue()' überschreiben muss. Vielen Dank! – omnomnom

+0

@omnomnom, der benutzerdefinierte Renderer ist nicht erforderlich. Alles, was Sie tun müssen, ist "Icon.class" zurückzugeben, und die Tabelle wird ihren Standard-Icon-Renderer verwenden. Die Tabelle verwendet den Standard-Renderer, der für jeden LAF unterschiedlich sein kann (oder auch nicht). Erstellen Sie keinen Renderer, es sei denn, Sie müssen dies wirklich tun. – camickr

1

Ich habe ein JTable, die ich dynamisch aus List-Objekten erstelle.

Nun, Sie können nicht einfach Strings zur Tabelle hinzufügen, da dann Bild als ImageIcon hinzugefügt werden muss. Sie benötigen also eine Liste, damit Sie String- und Symbolwerte hinzufügen können.

Dann müssen Sie die getColumnClass(...) Methode Ihres TableModels überschreiben, um Icon.class für die Spalte zurückzugeben, die das Symbol enthält. Die Tabelle verwendet dann den entsprechenden Renderer für das Symbol.

Siehe: How to set icon in a column of JTable? für ein funktionierendes Beispiel.

+0

Ich habe 'getColumnClass()' überschrieben und es wird 'ImageIcon.class' für alle Spalten zurückgegeben, die Symbole in meinem Code enthalten. – omnomnom

Verwandte Themen