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 :

Problème avec le contexte graphique associé à JPanel


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Points : 49
    Points
    49
    Par défaut Problème avec le contexte graphique associé à JPanel
    Bonjour,
    Je voudrais des éclaircissements sur le lien entre un objet d'une sous-classe de JPanel et l'objet Graphics qui lui est associé. Si j'ai bien compris (vous me corrigerez...) un objet de type Graphics est passé en paramètre à la méthode paintComponent à chaque fois qu'elle est appelée ? Mais est-ce le même objet à chaque fois. Je veux dire un objet Graphics qui évolurais au fil du temps ? J'en ai bien l'impression car quand l'objet graphics est modifié par la méthode scale par exemple, celui-ci perdure quand on appelle paintComponent une autre fois. Je me trompe ?
    Mais alors... l'objet Graphics est comme une variable d'instance de l'objet JPanel, non ? Une variable d'instance cachée qui évolue au fil du temps, non ?
    Si c'est le cas, quand cette variable est-elle instanciée ?
    Je dis cela car, quand j'écris un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public MonPanneau() {
          super();
          Graphics g = this.getGraphics();
    }
    g est null. Pourtant la méthode getGraphics renvoie bien le contexte graphique associé au panneau, non ? Si null est renvoyé, c'est que le contexte grraphique n'existe pas encore ? Dans ce cas quand existe-t-il ?
    Et si j'ai besoin du contexte graphique à ce moment-là comment je fais ?

    Voilà un tas de question qui montrent que je n'ai pas tout saisi.
    Pouvez-vous m'aider ?
    Merci de prêter attention à mon problème.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 195
    Points : 115
    Points
    115
    Par défaut
    je pense qu'avec toute ces question google est ton meilleur amis(encore si tu n'avais que 2 ou 3 questions mais la sa prouve que tu ne saisie pas du tout ce qu'est le probleme)
    si une personne a la patience de t'expliquer

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par Virgile le chat
    J'en ai bien l'impression car quand l'objet graphics est modifié par la méthode scale par exemple, celui-ci perdure quand on appelle paintComponent une autre fois. Je me trompe ?
    Geuh... en general quand on modifie un contexte graphique (transformation, clip, etc...) qui nous est fourni on fait un minimum d'effort pour le restaurer a son etat initial (annuler les transformations, remettre les indices de rendu, remettre l'ancien clip, etc...) avant de le rendre car il peut etre utilise immediatement/de suite dans la meme boucle d'affichage pour afficher d'autres composants (sachant qu'en general les composants positionnent eux-meme certaines chose comme la couleur de fond, d'avant-plan, la police, etc.. dont on a pas trop besoin de s'occuper nous-meme). C'etait deja comme ca en Turbo Pascal il y a 14 ans quand j'ai commence a programmer et c'est quelques chose que je continue a faire en Java.

    D'ou l'utilite de la methode create() qui cree une vue sur le Graphics (un contexte du contexte en quelques sorte) qui permet de faire toutes les transformations qu'on veut sans se soucier de devoir les annuler par la suite.

    Apres quant a dire si c'est le meme contexte qui sera reutilise dans la boucle suivante... je ne connais pas completement les mecanismes de Swing a fond (c'est plus du cote de Gfx la) et de maniere general je fais comme si ce n'etait PAS le cas. D'autant plus que cette meme methode d'affichage peut tres bien etre appellee avec un autre contexte tierce provenant d'une image ou de l'imprimante (alors la oui on est sur que ce n'est pas le meme). Ca peut dependre egalement si le double-buffering est active ou pas, etc... bref je ne m'appuierai pas trop sur ce genre de certitudes.
    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

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Points : 49
    Points
    49
    Par défaut Mon problème n'est pas là
    Bonjour,
    Merci d'avoir eu la patience de m'expliquer (n'est-ce pas nightwar...). Mais vous n'avez pas compris mon problème. Il s'agit justement de modifier durablement mon contexte graphique. Il ne s'agit pas de le conserver en annulant une modification faite à un moment. En effet, je l'utilise comme un repère du plan dans le quel je zoome ou bien je me déplace.
    Donc je me demande plutôt pourquoi getGraphics me renvoie null quand je l'appelle. Il semblerait que ça dépende du moment où je l'appelle...
    le contexte graphique se comporte-t-il comme une variable d'instance de la classe JPanel ?
    Merci

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Citation Envoyé par Virgile le chat
    Bonjour,
    Je voudrais des éclaircissements sur le lien entre un objet d'une sous-classe de JPanel et l'objet Graphics qui lui est associé. Si j'ai bien compris (vous me corrigerez...) un objet de type Graphics est passé en paramètre à la méthode paintComponent à chaque fois qu'elle est appelée ?
    oui

    Citation Envoyé par Virgile le chat
    Mais est-ce le même objet à chaque fois.
    non

    Citation Envoyé par Virgile le chat
    Je veux dire un objet Graphics qui évolurais au fil du temps ?
    non

    Citation Envoyé par Virgile le chat
    J'en ai bien l'impression car quand l'objet graphics est modifié par la méthode scale par exemple, celui-ci perdure quand on appelle paintComponent une autre fois. Je me trompe ?
    oui, tu te trompes

    Citation Envoyé par Virgile le chat
    Mais alors... l'objet Graphics est comme une variable d'instance de l'objet JPanel, non ?
    non

    Citation Envoyé par Virgile le chat
    Une variable d'instance cachée qui évolue au fil du temps, non ?
    non

    Citation Envoyé par Virgile le chat
    Si c'est le cas, quand cette variable est-elle instanciée ?
    Un objet graphics est créé avant chaque paintComponent()

    Citation Envoyé par Virgile le chat
    Je dis cela car, quand j'écris un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public MonPanneau() {
          super();
          Graphics g = this.getGraphics();
    }
    g est null.
    Pourtant la méthode getGraphics renvoie bien le contexte graphique associé au panneau, non ?
    getGraphics retourne null si le composant n'est pas "displayable". Ton JPanel n'est pas ajouté à une frame, il n'est pas affichable.
    Attention également, getGraphics() retourne un nouvel objet à chaque appel (cf javadoc)

    Citation Envoyé par Virgile le chat
    Si null est renvoyé, c'est que le contexte grraphique n'existe pas encore ?
    voila, c'est ca

    Citation Envoyé par Virgile le chat
    Dans ce cas quand existe-t-il ?
    Quand le composant est displayable (cf la javadoc de Component.isDisplayable()).

    Citation Envoyé par Virgile le chat
    Et si j'ai besoin du contexte graphique à ce moment-là comment je fais ?
    Il faut changer de conception.

    Citation Envoyé par Virgile le chat
    Voilà un tas de question qui montrent que je n'ai pas tout saisi.
    Pouvez-vous m'aider ?
    Merci de prêter attention à mon problème.
    No problem

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par Sanguko
    Il faut changer de conception.
    Voilà, tout est dit, c'est exactement ça et dit simplement en plus. Si tu n'as toujours pas compris : tu ne dois pas garder la référence sur le Graphics ; tu dois à chaque appel à paintComponent() recommencer comme si c'était un nouveau (et si ca se trouve c'est un nouveau).

    Tu as des transformations ? Des changements de repère ? etc... alors tu gardes ces informations sous une forme ou une autre (AffineTransform par exemple, mais tu peux également uniquement conserver des données numériques si tu le souhaites) et tu les réappliques à chaque réaffichage avant de redessiner/retracer ton rendu.

    Si vraiment tu ne veux réaliser ton rendu qu'une seule et unique fois, va plutot voir du coté des méthodes de rendu de type offscreen qui utilisent le Graphics d'une image, image qui est elle-même composée sur l'écran à chaque réaffichage (on ne dessine dans le Graphics de l'image qu'une seule fois, mais on dessine l'image plusieurs fois dans le Graphics de l'écran). Seulement voilà tu utiliseras plus de mémoire sur le coup et dans la majorité des cas un rendu offscreen n'est pas nécessaire, mieux vaut un rendu direct sur la surface de l'écran.
    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

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Points : 49
    Points
    49
    Par défaut Merci beaucoup
    merci beaucoup pour toutes ces explications.

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

Discussions similaires

  1. Problème avec le mode graphique
    Par dot-_-net dans le forum C++
    Réponses: 6
    Dernier message: 27/12/2007, 18h54
  2. Problème avec un tutoriel graphique
    Par oops! dans le forum C
    Réponses: 2
    Dernier message: 27/03/2007, 09h46
  3. [XUBUNTU] Problème avec l'interface graphique de vnc
    Par sniperwolf79 dans le forum Ubuntu
    Réponses: 1
    Dernier message: 08/02/2007, 14h40
  4. Problème avec un JTextArea et un JPanel
    Par Spinoza23 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 01/02/2007, 16h33
  5. Probléme avec la carte graphique(GForce4)
    Par menzlitsh dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 28/03/2006, 00h09

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