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 :
- class MyTableRenderer extends DefaultTableCellRenderer {
- public Component getTableCellRendererComponent(JTable table,
- Object value,
- boolean isSelected,
- boolean hasFocus,
- int row,
- int column) {
- setText("case " + row + ", " + column);
- setIcon(maSuperIcone);
- setHorizontalAlignment(SwingConstants.LEFT);
- return this;
- }
- }
|
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