2010-12-01 29 views
1

J'ai une table avec un modèle de table personnalisé qui a deux colonnes. La colonne 0 est une classe ImageIcon et la colonne 1 est une classe String.Java JTable TableCellRenderer avec ImageIcon Colonne

public Class<?> getColumnClass(int col) { 
    if (col == 0) { 
     return ImageIcon.class; 
    } else { 
     return String.class; 
    } 
} 

Quand je définir une nouvelle classe TableCellRenderer à ajouter aux colonnes afin que je puisse le style des cellules, elle écrasera la classe ImageIcon et il met à une chaîne.

public class CustomTableCellRenderer extends DefaultTableCellRenderer 
{ 
    public Component getTableCellRendererComponent (JTable table, Object obj, boolean isSelected,  boolean hasFocus, int row, int 
    column) 
    { 
    Component cell = super.getTableCellRendererComponent(table, 
     obj, isSelected, hasFocus, row, column); 
    if(isSelected) 
    cell.setBackground(Color.BLUE); 
    return cell; 
    } 
} 

Des idées sur comment résoudre ce problème?

Mon erreur, il est en quelque sorte caché:

Quand je définir une nouvelle classe de TableCellRenderer à ajouter aux colonnes je peux donc le style des cellules, elle écrasera la classe ImageIcon et il met à une chaîne .

Le problème est que, quand je décris cette classe TableCellRenderer de style ma table, les colonnes de ImageIcon à mon tour de table à cordes comme « Fichier: ... » au lieu de l'icône réelle.

+0

Je suis désolé, mais il semble que vous n'ayez pas posé la question. Vous venez d'expliquer ce que vous faites. S'il vous plaît expliquer le problème. Qu'est-ce qui ne va pas? Qu'est-ce qui ne fonctionne pas? – AlexR

+0

Etes-vous sûr que c'est le moteur de rendu que vous voyez et non l'éditeur? Est-ce que cet affichage des nombres se produit pour toutes les cellules, ou seulement la cellule qui a le focus et est en cours d'édition? Si ce dernier, vous devrez peut-être jouer avec l'éditeur de cellules. –

+0

Affichage de quels numéros? Parce que ma cellule devient en fait bleue sur select alors je suis sûr que c'est le moteur de rendu. – rvk

Répondre

1

Une autre solution possible est de simplement définir l'icône vous-même. Je ne suis pas sûr si c'est la meilleure solution, mais cela fonctionne:

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, 
      boolean hasFocus, int row, int column) { 
     Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, 
       column); 
     ((JLabel)cell).setIcon((Icon)value); 
     ((JLabel)cell).setText(""); 
     ((JLabel)cell).setHorizontalAlignment(JLabel.CENTER); 
     if (isSelected) { 
     cell.setBackground(Color.blue); 
     } else { 
     cell.setBackground(null); 
     } 
     return cell; 
    } 
+1

Ouais je viens de découvrir ça il y a quelques minutes, pas trop élégant mais ça marche parfaitement. – rvk

+0

cool. Vous devrez peut-être définir le texte du JLabel sur "" et l'alignement horizontal sur le centre: –

3

Il n'est pas nécessaire de créer un moteur de rendu personnalisé. JTable supporte déjà un rendu par défaut pour les colonnes contenant une icône. Tout ce que vous avez à faire est de surcharger la méthode getColumnClass(), ce que vous semblez faire.