IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

Comment fonctionne réellement le CellRenderer ?


Sujet :

Composants Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Par défaut Comment fonctionne réellement le CellRenderer ?
    Bonjour,

    Pour un projet qui ressemble plus ou moins à une gallerie d'image, je me trouve confronté à vouloir afficher un très grand nombre de JTextArea dans un JPanel (aucun Layout spécifié, je donne la position de chaque JTextArea).

    Du coup, je voudrais faire comme pour le CellRenderer d'une JTable avec JLabel, i.e. n'avoir qu'un seul composent instancié, mais utiliser son rendu de multiples fois (après avoir positionné le contenu du JTextArea bien entendu. Il n'a pas besoin d'être éditable, mais il doit être dans un JScrollPane pour un scrolling vertical) (et donc, je vais aussi stocker la position des scrollbars pour chaque rendu).

    Pour être plus préçis je voudrais quelque chose qui ressemble à ceci:

    http://img2.imageshack.us/my.php?ima...idfbrowser.png

    Le texte collatéral devrait se trouver dans un JTextArea, lui même dans un JScrollPane.

    voilà, si vous avez une idée, ou un lien vers une description claire de la façon dont fontionne réellement le CellRenderer (je n'arrive pas à trouver avec l'ami Google) merci beaucoup

  2. #2
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    C'est vrai qu'il n'existe pas beaucoup de description sur la techno du Renderers, parce que c'est à la fois simple et compliqué.

    Déjà, le Renderer n'est qu'une image ; donc, pas de scroll (sauf l'image du scroll, bien sûr, mais alors ça ne scroll pas).

    Le principe général est que un même composant fait l'image de plusieurs valeurs. C'est une sorte de MVC inversé : une seule vue, plusieurs modèles.

    Donc, si c'est un JTextPane, ton unique JTextPane va afficher plusieurs textes, à chaque fois en mettant le nouveau texte après avoir enlevé le précédent, afficher son image dans un contexte graphique, et cette image est ensuite installée dans la JTable.

    Malheureusement il me semble qu'il y a des problèmes avec les composants textuels, parce qu'ils font leur impression en plusieurs passes, car ce sont des composants complexes, et qu'il est difficile de savoir quand est-ce que de tels composants sont complètement dessinés dans un Graphics.

    Le secret pour la JTable est de jouer sur l'alternance Render / Editeur : au niveau du renderer tu présentes une image simple, voir simpliste, du composant, et tu affiches tout le truc en phase d'édition. Voir Using Custom Renderers.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Par défaut
    Bonjour gifffftane, et merci pour ta réponse !

    En fait, j'ai déjà investigué l'approche JTable + Custom cell renderer, par exemple:

    http://img186.imageshack.us/img186/6050/screensho.jpg

    Chaque cellule est un JPanel avec un JLabel et un JTextArea dans un JScrollPane.
    Un problème cependant, c'est que ma JTable est déjà dans un JScrollPane "global", et que les événements souris sont capturés par la JTable et non forwardé au JScrollPane de chaque cellule... donc scrolling sur le JTextArea de chaque cellule impossible.
    J'ai regardé aussi pour passer par un CellEditor mais ça ne change pas grand chose...

    J'aimerai bien le faire fonctionner aussi comme cela avec une JTable !
    (mais dans mon message précédent, je voulais me passer de JTable et tout déssiner à la main, juste utiliser la technique du renderer JTable pour mon JTextArea. En fait, comment faire pour instancier une fois un composant, mais le dessiner deux fois sur un panel par exemple ! (et avec des valeurs différentes!))

  4. #4
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Il n'est pas du tout normal que quand tu fais scroller un scroll c'est un autre qui scroll. Tu as dû te tromper quelque part, fait un programme de test pour approfondir ce cas particulier.

    Disposer un même composant en deux endroits différents simultanément est impossible en swing. Le renderer ne place que l'image de ce composant, image que tu pourrais disposer en plusieurs endroits.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Par défaut
    oui, j'avais compris que je ne peux pas disposer un composant deux fois simultanément... je parlais de le déssiner deux fois, (via l'image du composant donné par un renderer), exactement pour la cellule d'un JTable.

    pour ce qui est du scroll, j'ai fait de nombreux tests, dans mon image précédent, j'ai:
    1. une frame
    2. un scrollpane
    3. une jtable
    4. dans chaque cellule un jpanel == {un JLabel, un scrollpane avec un JTextArea comme viewportview).

    Les évènements pour le scrolling n'affectent pas les scrollpanes dans les cellules de ma jtable, uniquement mon scrollpane global.

    Pour tester, j'ai essayé de me passer de JTable, et là, ça fonctionne impécablement (mais je me suis donc passé de cellrenderer, et je crée N jtextarea, N scrollpane etc. bref, pas très futé, mais, les événements sont bien dispatchés, c'est donc un problème dû à l'utilisation de ma JTable).

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Hypercube Voir le message
    Chaque cellule est un JPanel avec un JLabel et un JTextArea dans un JScrollPane.
    Un problème cependant, c'est que ma JTable est déjà dans un JScrollPane "global", et que les événements souris sont capturés par la JTable et non forwardé au JScrollPane de chaque cellule... donc scrolling sur le JTextArea de chaque cellule impossible.
    J'ai regardé aussi pour passer par un CellEditor mais ça ne change pas grand chose...
    Ce comportement est tout à fait normal !
    En effet la JTable utilise un seul et unique CellRenderer pour toutes les cellules (ou du moins les cellules avec le meme type de renderer). Le composant est en fait directement dessiné par la JTable sans qu'il soit réellement ajouté à la hierarchie des composants. Du coup il ne peut pas recevoir les événements...

    Une solution serait d'utiliser un second renderer, que tu ajouterais réellement à la JTable par dessus la cellule lors du survol de la souris, afin de pouvoir recevoir et traiter les événements.

    Il restera toutefois le problème des scrollbars qui pourront sauter d'un état à l'autre au survol, car le rendu du renderer "classique" sera différent du vrai composant au survol...



    Question : tu aurais combien d'élément à afficher ? Si tu n'en a pas beaucoup un simple GridLayout peut faire l'affaire...

    a++

    PS : Perso j'aurais utilisé une JList plutôt qu'une JTable

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Par défaut
    Bonjour adiGuba,

    Merci pour ces infos, ça m'éclaire pas mal sur la JTable... j'avais deviné avec ce que disais gifffftane plus haut.

    C'est pour afficher éventuellement beaucoup d'éléments (je fais de la modélisation sur des bases d'images).
    En l'occurrence, là, j'ai testé avec SWT Nebula Image Gallery sur un jeu de données de 25.000 images, (j'ai codé un moteur de chargement des images, load-on-view en quelque sorte), c'est fluide, impec', mais c'est du SWT et ça ne m'arrange pas du tout :-(

    bon... je crois que je vais me passer des infos contextuelles pour chaque images, et n'afficher que les images. En fait, ce qu'il me faudrait ce serait une JTable où il n'y a pas de hauteur de row fixée, mais une hauteur de cellule, par exemple la hauteur de la cellule 1 de la colonne 1 fait 120px, la hauteur de la cellule 1 de la colonne 2 fait 256px.
    Comme ça j'afficherai un JTextArea de la hauteur qu'il me faut pour afficher tout mon texte et je peux me passer d'un JScrollPane pour chaque cellule.

    C'est pas faisable avec la JTable swing ça ?

    J'ai cherché rapidos mais je n'ai pas trouvé de custom component pour faire ça... (et en bidouillant le cell renderer, ça ne fonctionne pas (en changeant la PreferredSize des JLabel)).

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Hypercube Voir le message
    C'est pas faisable avec la JTable swing ça ?

    J'ai cherché rapidos mais je n'ai pas trouvé de custom component pour faire ça... (et en bidouillant le cell renderer, ça ne fonctionne pas (en changeant la PreferredSize des JLabel)).
    C'est faisable avec une JList

    Si je ne me trompe pas la JList respectent la preferredSize des ListCellRenderer, donc tu pourras avoir des éléments de taille différente...

    a++

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 64
    Par défaut
    Bonjour,

    Pourquoi tu ne fais pas un scroll directement sue ton JTextArea ? Tu te passerais dans ce cas d'un JScrollPane et tu ne devrais pas avoir de problème avec les Editors/Renderers si je n'ai rien loupé. De ce fait tu peux garder ton JTable si c'est absolument ce que tu souhaite avec dans ton interface graphique. En appliquant la méthode : sur ton JTextArea, je pense que tu obtiendras le comportement souhaité.

    Bon courage

  10. #10
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Si je ne me trompe pas la JList respectent la preferredSize des ListCellRenderer, donc tu pourras avoir des éléments de taille différente...
    Oups désolé je me suis trompé : il respecte bien le preferredSize mais donne la même taille à tous les composants !

    Citation Envoyé par fluff Voir le message
    Pourquoi tu ne fais pas un scroll directement sue ton JTextArea ? Tu te passerais dans ce cas d'un JScrollPane et tu ne devrais pas avoir de problème avec les Editors/Renderers si je n'ai rien loupé.
    Non : autoscroll indique justement que le JScrollPane parent doit scroller automatiquement pour voir la fin du texte, et cela ne change rien au fait que le composant ne soit pas réellement affiché



    J'essaye l'utilisation d'un double renderer mais j'ai du mal à conserver la position des scrollbars

    a++

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Par défaut
    Bonjour,

    On peut jouer avec la size des composants, i.e. custom panel pour une cellule, dans une JTable.
    En l'occurrence pour le problème évoqués ci-dessus, je met mon texte dans mon JTextArea, en récupère la preferredSize pour savoir quelle est la hauteur idéal pour le composant (pour voir tout le texte), et règle la hauteur de la ligne de la table en fonction de la cellule de hauteur max. sur la même ligne.

    Je marque le thread comme résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JSF] comment fonctionne <h:message> ?
    Par anitshka dans le forum JSF
    Réponses: 5
    Dernier message: 29/06/2005, 17h36
  2. Comment fonctionne TXmlDocumment ????
    Par almisuifre dans le forum C++Builder
    Réponses: 8
    Dernier message: 18/02/2005, 12h54
  3. comment fonctionne une interface graphique???
    Par elekis dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 27/10/2004, 23h10
  4. Comment fonctionne le ClassExplorer ?
    Par borisd dans le forum C++Builder
    Réponses: 7
    Dernier message: 30/09/2004, 17h44
  5. Comment fonctionne le CVS ?
    Par mathieu dans le forum CVS
    Réponses: 6
    Dernier message: 23/03/2004, 11h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo