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

2D Java Discussion :

[Java2D] ajouter des éléments graphiques à un objet existant


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut [Java2D] ajouter des éléments graphiques à un objet existant
    Bonjour,

    Je dispose d'un JTextPane, et je souhaiterais dessiner un beau carré rose, par exemple au-dessus du 10ème caractère (ce n'est qu'un exemple). Evidemment, ce carré doit suivre la vie du JTextPane (agrandissement, scrollpane, etc...) [EDIT]

    Je pourrais bien sûr créer une classe fille et redéfinir son paintComponent(). Le problème est que ce JTextPane est créé par un autre module de mon application, que je ne contrôle pas (j'essaie de constituer une librairie) [EDIT]. Je ne peux donc pas "modifier" son paintComponent() ni créer une classe fille.

    [EDIT] En d'autres termes, je cherche à construire une méthode qui prend un JTextPane en paramètre, et qui modifie l'affichage de ce dernier, de telle manière que, à chaque fois que le JTextPane est redessiné, un carré rose soit ajouté au-dessus du 10ème caractère (ce n'est qu'un exemple).

    Existe-t-il néanmoins un moyen de modifier son affichage (rajout d'une forme géométrique) ?
    Mes premières recherches m'ont mené vers :
    - getGraphics(),
    - ComponentUI
    Dois-je creuser ces pistes ou existe-t-il une autre méthode mieux adaptée ?

    Merci d'avance pour votre aide,
    Cordialement,

    Nicolas

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut
    Une troisième piste peut-être :
    - mettre un listener sur la méthode paintComponent() du JTextPane avec l'API introspection [mais est-ce techniquement faisable ? Je n'ai pas encore regardé], de manière à rajouter le carré rose manuellement à la suite de chaque appel à paintComponent()

  3. #3
    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
    Ce n'est pas strictement impossible, mais ce n'est vraiment pas pratique de faire ça en java.

    Il n'existe pas de Listener sur la méthode paint. Tu peux instrumenter, comme on dit, le byte code pour y caler un appel externe. Mais ce n'est vraiment pas pratique.

    Tu peux pister divers listeners, avec lesquels tu supputes qu'il sera probable qu'il y ait un appel au paint. Par exemple s'il y a un changement de la taille du composant, il est plus que probable qu'il y aura un appel au paint. Le problème de cette voie est qu'elle est techniquement casse-gueule pour repérer la position des composants, mais que de plus tu ne gères pas l'ordre d'appel des listeners ; il se peut très bien que le tien soit appelé avant celui qui redessine "vraiment" l'interface.

    Cete voie est toutefois bonne lorsque le truc que tu veux rajouter correspond à l'événement écouté. Par exemple, lors d'un redimensionnement de fenêtre, il est parfaitement adapté de placer sur cette fenêtre un petit rectangle montrant la dimension de cette fenêtre.

    Pour le reste, ne parlons pas des divers problèmes que posent la prise en compte du look and feel.

    Donc, ma position est qu'il vaut mieux s'abstenir.

    Si on y est obligé, une voie sympa est de trouver le moyen de placer un JPanel transparent par dessus le JPanel principal du composant (ou par dessous) (enfin... où tu peux), et d'y dessiner dessus ce qu'il faut. Ce n'est pas évident, parce qu'il faut composer avec le layout du composant.

    Par cette approche le problème de l'appel au paint est résolu par la mécanique swing, le problème de l'ordre d'appel des listeners aussi, il ne te reste plus qu'à espérer tomber juste dans le positionnement de tes ornementations

    Il arrive aussi souvent que les composants élaborés donnent accès à l'un de leurs sous-composants. Tu peux avoir plus de facilité à travailler à partir de là, qu'à partir du composant général.

    Tu peux également intervenir par le biais du composantUI, mais cette voie m'a toujours décue. Le look and feel est bien adapté pour concevoir de grands et beaux interfaces utilisateurs, qui prennent un an de développement à une équipe de 30 personnes ; il n'est pas bien adapté aux bidouillages de secours.

    Tu peux également tenter de profiter du Glass Pane (utilisé pour les popups, les tooltips, etc) (si, bien sûr, il n'y a pas de popup ou de tooltips perturbants).

    Et ainsi de suite.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut
    Un grand merci pour ton message, qui confirme, de manière solide et structurée, ce qui n'était chez moi que de vagues intuitions.

    Encore merci,

    Nicolas

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Si tu ne peux pas hériter de JTextPane parce que tu ne contrôles pas la création, tu peux toujours l'encapsuler dans un JComponent, et dans ce JComponent tu affiches le JTextPane puis tes petits carrés roses !

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut
    Bonjour ®om,

    Merci de ton intervention.
    J'ai essayé de mettre en oeuvre ton idée.
    Le problème réside dans le fait que je fais clignoter mon carré rose (avec un Timer).
    Le carré rose est dessiné sur le JComponent.
    Le JComponent est "derrière" le JTextPane qu'il contient.
    Pour que le carré rose soit visible, je dois donc rendre le JTextPane() en setOpaque(false).
    Au moment du clignotement du carré rose, le contenu du JTextPane passe du noir au grisé : il clignote également.
    Ou bien y a-t-il quelquechose que je n'ai pas implémenté correctement...

    Cordialement,

    Nicolas

Discussions similaires

  1. [JSON] ajouter des éléments à un objet
    Par beegees dans le forum jQuery
    Réponses: 5
    Dernier message: 25/07/2014, 20h45
  2. Réponses: 5
    Dernier message: 29/07/2010, 09h00
  3. Ajouter des éléments graphiques à un fichier GEF
    Par caro_caro dans le forum Eclipse Platform
    Réponses: 0
    Dernier message: 12/02/2009, 16h34
  4. Réponses: 3
    Dernier message: 25/01/2009, 17h32

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