[JTable] afficher un JLabel+icone dans une cellule

afficher un JLabel+icone dans une cellule [JTable] - Java - Programmation

Marsh Posté le 28-02-2004 à 12:58:44    

Voila je voudrais integrer un JLabel avec icone dans ma JTable
 
Un peu comme quand on fait rechercher des fichiers sous windows, dans les resultats, le nom de fichier est associé a son icone.
 
je fais ca dans mon MyTableRenderer :
 

Code :
  1. label = new JLabel(obj.nom, iconeFichier,
  2.                              SwingConstants.LEFT);
  3.          
  4.           return label;


 
 
et le problème c'est que ca m'affiche bien le JLabel mais pas l'icone qui lui est associée !!!
 
DOnc si vous aviez une idée pour qu'il s'affiche...
 
mais a mon avis le problème  n'est pas que la :
 
voivi mon code qui  initialise le renderer et a vrai dire j'ai un peu de mal avec les tablecolumn
 

Code :
  1. //on recupere la premiere colonne de la JTable
  2. TableColumn column = table.getColumnModel().getColumn(0);
  3. //On y applique le renderer
  4. table.setDefaultRenderer(column.getClass(),new MyTableRenderer());


 
Si vous pouviez m'clairer un peu pasque la doc est un peu chaude la...


Message édité par spitagor le 28-02-2004 à 13:02:58
Reply

Marsh Posté le 28-02-2004 à 12:58:44   

Reply

Marsh Posté le 29-02-2004 à 05:21:27    

Alors, manifestement, tu a raté l'explication sur les renderer (de JTable ou de JList, c'est la même architecture) et particulièrement sur les renderers par défaut.
 
Le principe du renderer c'est de rendre le composant plus léger en mémoire en ne nécessitant pas un composant graphique par case du "machin" et d'accélérer les traitements. Naturellement, si tu as vraiment envie tu peux le faire, mais en oubliant pas de mettre le composant dans la hiérarchie swing par un add(), et que ça va être très lent à cause du revalidate().
 
La grosse feinte c'est que DéfaultBiduleCellRenderer hérite de JLabel (si c'est vrai : http://java.sun.com/j2se/1.4.2/doc [...] derer.html ).
Le principe d'utilisation de ce bordel est le suivant : le bidule a un renderer unique. Quand il veut faire un peu de peinture, va peindre case par case. Pour chaque case, il appelle getTableCellRendererComponent() qui lui renverra un Component, qu'il va placer au bon endroit et qu'il va peindre, puis il va l'oublier. La feinte c'est donc de renvoyer tout le temps le même composant qu'on aura customisé en fonction de la cellule qu'il représente. Et java invente la peinture au pochoir.
 
Pour aller encore plus loin, DefaultBiduleRenderer est lui-même un composant, donc la feinte c'est de customiser directement le renderer et de faire renvoyer this par getTableCellRendererComponent().
 
un peu de pratique :

Code :
  1. class MyTableRenderer extends DefaultTableCellRenderer {
  2.   public Component getTableCellRendererComponent(JTable table,
  3.                                                Object value,
  4.                                                boolean isSelected,
  5.                                                boolean hasFocus,
  6.                                                int row,
  7.                                                int column) {
  8.     setText("case " + row + ", " + column);
  9.     setIcon(maSuperIcone);
  10.     setHorizontalAlignment(SwingConstants.LEFT);
  11.     return this;
  12.   }
  13. }


 
et voilou.
 
un peu de lecture :
http://java.sun.com/j2se/1.4.2/doc [...] derer.html
qui explique le mécanisme
 
http://java.sun.com/docs/books/tut [...] l#renderer
l'article du tutorial sur les renderer customs
 
http://java.sun.com/docs/books/per [...] ls.fm.html
performance des renderers
 
 
 
 


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 29-02-2004 à 08:10:49    

nraynaud a écrit :

Et java invente la peinture au pochoir.


 
Je le note, et je m'en vais corriger ça de ce pas :jap:


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 29-02-2004 à 09:11:18    

kadreg a écrit :


 
Je le note, et je m'en vais corriger ça de ce pas :jap:

gni ?
 
en fait c'est pas comme ça qu'ils le décrivent, j'ai vu ça après, ils disent que le renderer est "a rubber-stamp", un tampon.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 29-02-2004 à 13:17:04    

merci raynaud !!! ca fait plasir de voir quelqu'un qui masterise les interfaces grpahiques (enfin tu dois maitriser certainement d'autres choses je suppose... :) )
 
Je vasi tester ce bordel de ce pas !!!

Reply

Marsh Posté le 29-02-2004 à 13:42:50    

alors voila j'ai fait ca, ca fait pareil qu'avant, mais je en peux pas selectionner une ligne entière dans ma JTable !

Code :
  1. public Component getTableCellRendererComponent(JTable table, Object value,
  2.                                                  boolean isSelected,
  3.                                                  boolean hasFocus, int row,
  4.                                                  int column)
  5.   {
  6.     if (value instanceof ObjetDisque) {
  7.       ObjetDisque obj = (ObjetDisque) value;
  8.       //on recupere l'extension du fichier
  9.       File tmp = new File(obj.chemin);
  10.       try {
  11.         String extension = Utils.getExtension(tmp);
  12.         if ( (extension.equalsIgnoreCase(Utils.jpg)) ||
  13.             (extension.equalsIgnoreCase(Utils.jpeg))) {
  14.          setText(obj.nom);
  15.          setIcon(Explorateur.iconeJpg);
  16.              this.setHorizontalAlignment(SwingConstants.LEFT);
  17.           return this;
  18.         }


 
 
quand je clique sur la JTable, ca me selectionne la bonne ligne, mais ca ne selectionne que la colonne de droite et moi je voudrais que ca selectionne les 2 .
 
a mon avis le problème se situe plutot au niveau des colonnes...
 
 
vous etes surs que ca doit marcher ca?
 

Code :
  1. TableColumn column = table.getColumnModel().getColumn(0);//1ere colonne
  2. column.setCellRenderer(new MyTableRenderer());


 
normalement oui mais on sait jamais...


Message édité par spitagor le 29-02-2004 à 13:50:19
Reply

Marsh Posté le 29-02-2004 à 14:27:17    

bon finalement j'ai reussi a faire ce que je voulais mais c'est vraiment crados de chez crados !!!
 
 

Code :
  1. if (isSelected) {
  2.             this.setBackground(Color.blue);
  3.           }
  4.           else {
  5.             this.setBackground(Color.white);
  6.           }


 
c'est bourrin mais ca marche...
 
 :)

Reply

Marsh Posté le 29-02-2004 à 18:23:39    

spitagor a écrit :

Code :
  1. if (isSelected) {
  2.             this.setBackground(Color.blue);
  3.           }
  4.           else {
  5.             this.setBackground(Color.white);
  6.           }



ça doit pas être loin d'être la bonne méthode, mais je ne me souviens plus exactement.
 


---------------
trainoo.com, c'est fini
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed