2010-07-11 5 views
3

J'ai besoin d'afficher une image dans l'une des cellules jTable.
j'ai écrit ceci:JAVA: Mettre l'image dans la cellule jTable

class ImageRenderer extends DefaultTableCellRenderer { 
    JLabel lbl = new JLabel(); 

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, 
     boolean hasFocus, int row, int column) { 
     lbl.setText((String) value); 
     lbl.setIcon(new ImageIcon("/home/ariyan/Desktop/71290452.jpg")); 
     return lbl; 
    } 
} 

puis utilisé comme ceci:

jTable1.getColumn(0).setCellRenderer(new ImageRenderer()); 

Mais cela ne fonctionne pas
Comment puis-je faire cela?

Merci

Répondre

1

Hmm: jTable1.getColumnModel().getColumn(0).setCellRenderer(new ImageRenderer()); peut-être?

Voici l'extrait pertinent d'un code de test rapide que j'ai mis ensemble pour vérifier rapidement mes prévisions. Il affiche les icônes d'un dossier (il suppose que tous les fichiers d'un dossier sont des icônes, donc vous devriez le tester avec quelque chose comme un sous-répertoire de thème d'icônes XDG). Installez d'abord le modèle de table, puis ajoutez le moteur de rendu des cellules sur les colonnes:

class Renderer extends DefaultTableCellRenderer { 

    @Override 
    public Component getTableCellRendererComponent (JTable table, 
                Object value, 
                boolean isSelected, 
                boolean hasFocus, 
                int row, int column) { 
     if(isSelected) { 
      this.setBackground(table.getSelectionBackground()); 
      this.setForeground(table.getSelectionForeground()); 
     } 
     else { 
      this.setBackground(table.getBackground()); 
      this.setForeground(table.getForeground()); 
     } 
     if(column == 0) { 
      this.setText(list[row]); 
     } 
     else { 
      // edit as appropriate for your icon theme 
      this.setIcon(new ImageIcon("/usr/share/icons/default.kde4/16x16/apps/"+list[row])); 
     } 
     return this; 
    } 

} 
class Model extends DefaultTableModel { 

    @Override 
    public boolean isCellEditable (int row, int column) { 
     return false; 
    } 

    @Override 
    public Object getValueAt (int row, int column) { 
     return list[row]; 
    } 

    @Override 
    public int getRowCount() { 
     return list.length; 
    } 

    @Override 
    public int getColumnCount() { 
     return 2; 
    } 

    @Override 
    public String getColumnName (int column) { 
     return column == 0? "Name" : "Preview"; 
    } 

    @Override 
    public Class<?> getColumnClass (int columnIndex) { 
     return String.class; 
    } 
} 
// edit base directory as appropriate for your icon theme of choice 
static String[] list=new File("/usr/share/icons/default.kde4/16x16/apps/").list(); 
+0

Les moteurs de rendu doivent être aussi efficaces que possible. Vous ne devriez pas lire l'image à partir du disque chaque fois que le moteur de rendu est appelé. Aussi, lorsque vous étendez le rendu par défaut, vous devez appeler super.getTableCellRendererComponent (...). Cela s'assurera que le rendu est entièrement initialisé, par exemple en ajoutant la bordure appropriée et en définissant la couleur par défaut. – camickr

+0

Bien sûr que non. Mais bon je l'ai posté comme concept, code prototype. Pas une solution de travail effective! – user268396

6

JTable fournit déjà un moteur de rendu par défaut pour les images. Vous avez juste besoin de dire à la table quel type de données est contenu dans chaque colonne et il va choisir le meilleur rendu:

a) remplacer la méthode getColumnClass() de la JTable ou du TableModel pour retourner la classe de données dans le colonne. Dans ce cas, vous devriez retourner une Icon.class. B) ajouter un ImageIcon au modèle de table.

Maintenant, le JTable utilisera le rendu d'icônes par défaut pour cette colonne.

+0

Comment puis-je faire ça dans netbeans ?! – RYN

+0

Voir aussi [* Comment utiliser les tables: Concepts: Editeurs et Renderers *] (http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editrender). – trashgod

Questions connexes