Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2893 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [JTable] afficher un JLabel+icone dans une cellule

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[JTable] afficher un JLabel+icone dans une cellule

n°658447
spitagor
Posté le 28-02-2004 à 12:58:44  profilanswer
 

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
mood
Publicité
Posté le 28-02-2004 à 12:58:44  profilanswer
 

n°659042
nraynaud
lol
Posté le 29-02-2004 à 05:21:27  profilanswer
 

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
n°659049
kadreg
profil: Utilisateur
Posté le 29-02-2004 à 08:10:49  profilanswer
 

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 !
n°659053
nraynaud
lol
Posté le 29-02-2004 à 09:11:18  profilanswer
 

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
n°659224
spitagor
Posté le 29-02-2004 à 13:17:04  profilanswer
 

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 !!!

n°659242
spitagor
Posté le 29-02-2004 à 13:42:50  profilanswer
 

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
n°659303
spitagor
Posté le 29-02-2004 à 14:27:17  profilanswer
 

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...
 
 :)

n°659446
nraynaud
lol
Posté le 29-02-2004 à 18:23:39  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [JTable] afficher un JLabel+icone dans une cellule

 

Sujets relatifs
Cellule qui n'est pas de taille fixe dans un tableauKoment afficher un fichier excel dans le navigateur
[MFC] Un bouton avec une icone supportant le theme XPafficher date
[HTML] afficher une image qui se trouve a une certaine URLafficher smplment le contenu de la cnsole et la sortie d'autre scripts
Pb JTable ...[HTML/JS ] Afficher un texte en fonction d'une combobox
FPDF : je n'arrive pas à afficher le résultat de ma requête [résolu] 
Plus de sujets relatifs à : [JTable] afficher un JLabel+icone dans une cellule


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR