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 :

JTextPane pour CellRenderer


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 158
    Par défaut JTextPane pour CellRenderer
    Bonjour,

    J'utilise un JTextPane en tant que CellRenderer pour afficher des icones au milieu d'un texte dans une table. J'ai un problème avec ce composant. Aléatoirement, mes icones s'affichent, ne s'affichent pas ou je vois l'image des ressources non trouvées.
    Avez-vous une idée sur l'origine de ce problème bizarre?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par apqmwnqmap Voir le message
    Avez-vous une idée sur l'origine de ce problème bizarre?
    Non, fait voir ton code.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 158
    Par défaut
    Mon code fait partie d'une grosse application. Alors je vais devoir prendre un peu de temps pour extraire l'essentiel.
    En attendant, si quelqu'un a une idée...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 158
    Par défaut
    Voici un example pour illustrer le problème

    Nous avons le renderer suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class ColoredTextCellRendererExample extends JTextPane implements TableCellRenderer {
     
        public ColoredTextCellRendererExample() {
            super();
            setContentType("text/html");
            String iconUrl = IsieCommonResourceHandler.class.getResource("statparam/graphic/icons/data_little.gif").toString();
            setText("<html><font face=\"Arial\"><img src=\""+ iconUrl + "\"/><b><font color=\"rgb(37,123,198)\">TEXTE</font></b></font></html>");
        }
     
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            return this;
        }
    }
    que nous positionnons sur une Jtable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    table.getColumnModel().getColumn(0).setCellRenderer(new ColoredTextCellRendererExample());
    lorsqu'on exécute l'application, la table s'affiche avec des icônes ressource non trouvée.
    Si on redimensionne la colonne ou que l'on clique sur la ligne, la vraie icône apparaît.

    Merci pour votre aide.

  5. #5
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Les icônes sont loadées de façon "lazy". Donc quand tu affiches ton écran au départ elles sont en train d'être chargées mais pas encore fini.
    Pour évite ce phénomène tu peux peut-être essayer ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    java.net.URL imgUrl = IsieCommonResourceHandler.class.getResource("statparam/graphic/icons/data_little.gif");
    if (imgUrl != null) {
        ImageIcon ico = new ImageIcon(imgUrl);
        String iconUrl = IsieCommonResourceHandler.class.getResource("statparam/graphic/icons/data_little.gif").toString();
        // ...
    }

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 158
    Par défaut
    Merci pour ta réponse, mais ça n'a rien changé à notre problème...

    Peut etre que je pourrais mettre un sleep alors, mais je ne sais pas trop ou...

  7. #7
    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
    Je subodorre que c'est parce que swing.text affiche le texte en plusieurs passes ; il fait des invokeLater en interne. Lorsque tu le reprends pour le renderer, il n'y a que la première passe, et pas celle qui affichera les graphismes.

    C'est un peu la foire pour deviner - il n'y a pas d'autres termes - quand est-ce que le JTextPane sera complètement dessiné. Ce que je fais d'habitude est que, après avoir lancé la demande d'affichage, j'envoie un invokeLater en espérant que tous ceux internes aux JTextPane seront avant, et qu'ils n'en demanderont pas de nouveaux. Le mien sera donc le dernier. En général, ça fonctionne, mais pas toujours.

    Dans mon invokeLater, espéré être le dernier, je place les traitements finaux.

    Et je réfléchis à deux fois au préalable pour savoir s'il est vraiment utile de me lancer là dedans...

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 158
    Par défaut
    Si ce n'est pas possible de faire ce que je veux avec un JTextPane, je ne trouve pas que ce soit un composant magnifique...
    Pour ce qui est de l'utilité de mon truc, je dois réaliser une table saisissable dans laquelle j'ajoute des icones devant les noms qui representent des variables (ce sont des expressions algébriques composées de chiffre et de variables prédéfinies). Du coup, j'ai besoin d'un composant capable d'afficher des icones dans du texte. Le JTextPane me parrait prédestiné pour cette sainte tâche. Mais si quelqu'un a une autre idée...

  9. #9
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    J'ignore si c'est le cas pour le JTextPane mais le JSlider par exemple fonctionne effectivement en plusieurs passes et m'avait pose des problemes pour l'integration a une JTable il y a quelques annes. Donc plutot que d'avoir un TableCellRenderer/CellEditor utilisant un unique JSlider pour controler les valeurs d'un intervalle, j'ai du du mettre plein de JSlider dans le modele de ma table et faire des renderer et editor qui soient capable d'afficher ces reglettes individuelles.

    Evidement, rien ne garantie que la source du probleme soit la meme ici.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  10. #10
    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
    Là j'ai malheureusement quelque mal à te proposer une solution.

    D'un coté il est compréhensible qu'un composant complexe soit dessiné en plusieurs passes ; mais, de l'autre, je ne connais pas de moyen fiable d'avoir l'information Composant compliqué a fini de s'afficher.

    Demander une modif de la demande ?... proposer une sorte de synthèse pour l'affichage mode renderer, et un JTextPane pour l'édition ?... par exemple, lorsqu'il s'agit de couleur, on place la couleur choisie dans le renderer, et un JColorChooser comme éditeur... C'est un paliatif, je sais, désolé.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 158
    Par défaut
    Merci des différentes idées, je vais regarder tout ça.

    Et de mettre un wait, vous croyez que ça serait efficace? Parce que j'ai pas de problème de perf.

  12. #12
    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
    Oui, j'y ai pensé sans oser te le proposer, parce que ça impose un délai d'affichage qui sera forcément vu.

    (et aussi passeque c'est pas très correct, mais il est vrai que nous sommes en présence d'un défaut de swing, crois-je )

    Fais gaffe aussi que c'est pas forcément facile : il va te falloir mettre ce composant quelque part pour l'afficher, choper son image, mettre cette image quelquepart...

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 158
    Par défaut
    Je ne suis pas sur de savoir exactement quoi faire. Je pensais faire un wait dans le paint, mais ça n'a aucun effet (c'est peut etre idiot). Pourrais-tu me décrire un peu plus ce que tu imaginais?

  14. #14
    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
    Si tu fais un wait dans le paint cela ne risque pas de fonctionner, puisque c'est le paint qui fait le dessin !

    En très gros :
    1. il faut afficher le composant quelque part, sans que l'utilisateur le voye (c'est la première difficulté)
    2. il faut attendre que ce composant soit affiché (un wait, dans ton traitement pour choper l'image du JTextPane, et non pas dans le paint d'affichage ! )
    3. il faut transformer la vue de ce composant en image (facile)
    4. il faut réafficher les renderer concernés (un peu plus compliqué)


    Bref, dans l'ensemble, c'est laborieux et peu fiable. Es-tu sûr que ce soit nécessaire ?

    (il y a au moins un avantage, c'est que comme tous les moutons à 5 pattes c'est très formateur) (une fois qu'on a retrouvé les 4 pattes vraiment utiles).

  15. #15
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Il ne faut JAMAIS faire de wait() dans une methode de rendu se deroulant dans l'EDT !
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 158
    Par défaut
    As-tu une idée pour faire marcher le JTextPane alors? Ou un autre composant?

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/12/2010, 17h13
  2. Template Proposals pour JTextPane/JTextArea
    Par araï dans le forum Composants
    Réponses: 2
    Dernier message: 01/11/2010, 11h06
  3. Réponses: 2
    Dernier message: 19/03/2008, 11h58
  4. mis à jour JTextPane pour Wrap/noWrap
    Par visiwi dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 20/02/2008, 16h37
  5. [JTextPane] conseils pour la colorisation syntaxique
    Par _KB_ dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 27/06/2006, 10h01

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