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

AWT/Swing Java Discussion :

Substance L&F : ListCellRenderer


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Points : 316
    Points
    316
    Par défaut Substance L&F : ListCellRenderer
    Bonjour,

    Je viens de commencer à utiliser Substance pour mon Look'n Feel et je bute sur un point.
    Le rendu par défaut d'une JList est très joli : beaux items, et surtout joli fade in / fade out au passage de la souris.
    Par contre quand j'implémente mon propre ListCellRender, je n'arrive pas à retrouver ce rendu. J'ai d'abord essayé d'utiliser un simple DefaultListCellRenderer, mais là tout fout le camp. En cherchant un peu j'ai trouvé un autre default renderer : le SubstanceDefaultListCellRenderer. Là ça va beaucoup mieux, les items reprennent le même rendu que si je ne spécifie pas de renderer à ma liste. Le soucis c'est que je n'ai plus du tout de fade in / fade out quand je passe la souris sur les items.

    Mon code est très simple : je créer une JList, et je lui redéfinis le renderer par la commande suivante : maliste.setCellRenderer(new SubstanceDefaultListCellRenderer()); grosso modo.

    Avez-vu une idée et voyez-vous ce que je veux dire ?

    Merci !

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Plutôt que de faire ça, essaie de récupérer le ListCellRenderer installé sur la JList et de faire des modifications dessus à la volée. Genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maListe.getCellRenderer().setIcon(new ImageIcon("/truc/machin/bidule.png");
    Et si tu as besoin de quelque chose de vraiment particulier, va falloir plonger dans les API de substance, car le fade in/fade out fait partie des animations. Donc il va te falloir comprendre comment marche trident.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  3. #3
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Points : 316
    Points
    316
    Par défaut
    Salut sinok,

    Merci pour ta réponse. Par contre, je ne vois pas comment tu t'y prends. Déjà je n'ai pas de méthode setIcon directe en appelant le getCellRenderer de ma JList.

    Pour moi, le but d'implémenter le DefaultCellRenderer est d'intercepter la méthode getListCellComponent(params) afin de personaliser le contenu des items qui seront générés.

    Je ne comprends pas pourquoi Substance a fait un truc aussi sympa qui n'est pas réutilisable en implémentant proprement un Renderer ; et encore moins pourquoi le style par défaut appliqué aux JList est différent d'un DefaultCellRenderer.

    Bien sûr, je pourrais ne pas utiliser mon propre Renderer et réécrire les méthodes toString de mes objets ; mais je ne trouve pas cela propre de modifier ses classes métiers pour paramétrer un affichage.

    Après il reste l'option de passer par des objets intermédiaires, sortes d'enveloppes de mes objets métiers pour personnaliser les toString, mais c'est un peu lourd il me sembe, tout ça pour garder la qualité du CellRenderer par défaut...

  4. #4
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Points : 316
    Points
    316
    Par défaut
    J'ai essayé un truc de barbare en récupérant le getListCellRenderer, puis en définissant u nnouveau ListCellRenderer qui appelle le getter du Renderer quej'ai récupéré.
    Résultat : ça fait comme si j'avais recréé un SubstanceDefaultListCellRenderer : on perd le fade.

    Dommage

  5. #5
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Points : 316
    Points
    316
    Par défaut
    En fait j'ai changé de stratégie.

    Plutôt que d'écrire un CellRenderer, j'ai créé la classe "wrapper" dont j'ai parlé ci-dessus : elle contient l'objet à afficher et la méthode toString dédiée. Mon modèle ajoute ses objets à la liste en les enveloppant dans ce nouvel objet.

    Finalement ça fait presque moins de code...

  6. #6
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Est-ce que la solution suivante serait appropriée?
    http://kahdev.wordpress.com/2011/09/...r-combo-boxes/

    Le pattern Delegate me semblant ce qu'il y a de plus propre comme solution dans ce genre de cas.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  7. #7
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Points : 316
    Points
    316
    Par défaut
    Excellent ton lien sinok

    Ca m'a permis de voir que j'avais fait du Delegate sans m'en rendre compte ; je croyais que c'était moche, mais avec un bon exemple comme présenté dans ce lien, on peut comprendre que ce n'est pas si moche.

    Par contre, je suis revenu sur la partie "Avoiding a Custom Cell Renderer" qui me parait encore la mieux ; dans le cas ou on n'a que du texte à rendre.

    De plus, en utilisant ce pattern de Delegate, je perdais quand même les effets spéciaux fade in / fade out au passage de la souris sur les items.

    En tous cas les différentes possibilités sont très bien exposées dans cet article. Juste un truc, ils ne parlent pas (ou j'ai mal compris) de cette différence de rendu (entre delegate et le fait de ne pas redéfinir). Le fait de redéfinir le Renderer doit faire perdre une notion (l'utilisation de Trident) qui n'est pas directement liée au contrôleur.

    Encore merci pour cette trouvaille, c'est twitté ^^

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