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 :

problème surprenant de contextes graphiques


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Par défaut problème surprenant de contextes graphiques
    Bonjour,
    voilà le problème que je n'arrive pas à démêler :
    Pour faire le plus simple possible :
    J'ai une fenêtre qui contient une barre d'outil et un JPanel.
    Dans ma méthode redéfinie paintComponent() je mets au début :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    super.paintComponent( g );
    Graphics2D g2D = (Graphics2D) g;
    System.out.println( g2D.getTransform() );
    Après le lancement de l'application la fenêtre de sortie me renvoie :

    AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 43.0]].

    43 étant l'épaisseur de ma barre d'outil. Ce qui signifie, si j'ai bien compris, qu'en interne, sans rien dire, le contexte graphique passé à paintComponent à déjà subit une translation pour mettre l'origine en haut à gauche du panneau, il a donc tenu compte de l'épaiseur de la barre d'outil.
    Bon très bien,

    Maintenant, J'ai créé une classe interne au JPanel qui s'appelle EcouteurPanneau et qui est destinée à écouter le Panneau comme son nom l'indique. Elle implémente mouseClicked. Je veux bien sûr appeler repaint() depuis mouseClicked() pour rafraichir le panneau. Ainsi je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Jpanel.this.repaint();
    Et là surprise : quand je clique dans le panneau, mon instruction:
    System.out.println( g2D.getTransform() );
    me renvoie maintenant :
    AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]

    Là, je ne comprends plus. maintenant, pourquoi le contexte graphique n'a plus la même origine ?
    C'est pourtant toujours le même paintComponent qui est appelé puisque mon instruction System.out.println( g2D.getTransform() ); me renvoie quelque chose !!!

    Encore plus fort :
    Si, maintenant, je rajoute dans mouseClicked ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    System.out.println( "avant repaint" );
    PanneauDessin.this.repaint();
    System.out.println( "après repaint" );
    et maintenant je clique, voilà ce que j'obtiens:

    avant repaint
    après repaint
    AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]

    Alors là, c'est incompréhensible !
    La dernière ligne devrait être entre "Avant repaint" et "après repaint" , non ?
    Que se passe-t-il ?
    Je suis perdu avec ces histoires de contexte graphique...
    Merci pour vos explications.

  2. #2
    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
    Avec les systemes de double-buffering et de recopie partielle de l'ecran/du composant, il ne faut pre-supposer que c'est toujours le meme graphics qu'on a sous la main, bien au contraire (pour qu'il ne faut pas garder de reference sur la valeur retournee par getGraphics(), et pis de toute maniere faut pas utilise cette methode).

    En gros a chaque appel il se passe un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Graphics2D childGraphics = (Graphics2D)parentGraphics.create(<bornes du composants ou de la zone de clip);
    try {
       composant.paint(childGraphics);
    }
    finally {
      childGraphics.dispose();
    }
    La methode repaint() n'effectue aucun reaffichage en soit, et retourne directement. Elle dit juste un truc du genre "hey s'teu plait monsieur le repaint manager, tu pourrais faire un affichage complet du composant (resp de la zone que je t'indique - si tu as utilise la variante qui prend une sous-zone), des que tu le pourras ? Mais uniquement si ca ne t'ennuies pas et pis si n'es pas trop charge dans ton boulot et que tu n'as rien d'autre a faire. Je veux pas deranger moi. Hein, s'teu plait, s'teu plait, s'teu plait, dit monsieur le repaint manager... allez quoi... soit sympa !"

    Bref, la methode indique juste qu'il faudrait redessiner le composant plus tard !
    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

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    et comme c'est juste le panneau que tu redessine, la toolbar n'est pas redessinée, pas besoin donc de créer un graphics qui l'englobe est serait translaté.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Par défaut Merci
    Merci pour votre amusante réponse. Je me demande d'ailleurs s'il existe des bouquins sur java qui traitent en détail de ce genre de choses.

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    pour ce qui est de la méthode repaint() et de son fonctionnement, c'est dans la doc ainsi que dans la pluspart des bouquins traitant de swing

    pour ce qui est du graphics qui change de translation, c'est une particularité de l'implémentation, y a pas de raison de la traiter dans un ouvrage, ca peut changer d'une version java à l'autre. En gros: si un comportement n'est pas documenté dans la javadoc, en général, ca veux dire qu'il ne faut pas en tenir compte

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    En ce qui concerne le bouquin, au niveau traitement avancé de tout ce qui est Graphics, je te conseille de te diriger vers celui de Romain Guy et Chet Haase, Filthy Rich Clients

Discussions similaires

  1. Problème avec le contexte graphique associé à JPanel
    Par Virgile le chat dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 20/06/2007, 23h31
  2. problème dans la carte graphique
    Par ikrame dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 21/04/2006, 00h29
  3. Probléme avec la carte graphique(GForce4)
    Par menzlitsh dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 28/03/2006, 00h09
  4. [VBA EXCEL] Problème d'éxécution avec graphiques
    Par RedBurn dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/11/2005, 09h55
  5. [Débutant] Obtenir un contexte graphique précis..
    Par milootooloo dans le forum 2D
    Réponses: 4
    Dernier message: 31/10/2005, 23h22

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