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 :

Origine d'un JPanel mal positionnée ?


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 Origine d'un JPanel mal positionnée ?
    Bonjour,
    Voilà le problème qui me tient à coeur.
    Pour faire aussi simple que possible, J'ai une JFrame qui contient une JToolBar à sa place habituelle (BorderLayout.NORTH) et un JPanel en-dessous (BorderLayout.CENTER).
    Je redéfinie paintComponent() du JPanel de la manière suivante :

    1) Je translate le contexte graphique : g2D.translate(100,0);
    2) Je fais appel à createInverse pour rétablir g2D à l'AffineTransform de départ (qui redevient donc l'identité).
    3) je fais g2D.drawLine(0, 0, 100, 100);

    voir code ci-dessous pour plus de détail.

    Alors, ma ligne devrait être tracée depuis l'origine du JPanel en haut à gauche du JPanel. Eh bien NON !!!
    Elle est tracée à partir du haut (à gauche) de la barre d'outil. Comme si l'origine n'était pas revenu à l'origine du JPanel mais à l'origine du JFrame.

    Donc, que s'est-il passé ?
    Merci beaucoup...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     @Override
        protected void paintComponent(Graphics g)
        {
            Graphics2D g2D = (Graphics2D)g.create();
            super.paintComponent(g2D);
     
            g2D.translate(100, 0);
     
            AffineTransform saveAT = g2D.getTransform();
                try{
                    g2D.transform(g2D.getTransform().createInverse());
                } catch (NoninvertibleTransformException ex) {}
     
            g2D.drawLine(0, 0, 100, 100);
            g2D.setTransform(saveAT);
        }

  2. #2
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    essayer de mettre super.paintComponent(g) comme premier instruction

  3. #3
    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
    non, cela ne marche pas.
    Vous voyez autre chose ?

  4. #4
    Membre très actif
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Par défaut
    Graphics2D g2D = (Graphics2D)g.create(); n'est pas nécessaire

    Graphics2D g2D = (Graphics2D)g; suffit

  5. #5
    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 origine d'un JPanel mal positionnée (bis)
    Bonjour,
    voilà mon problème formulé plus simplement :
    Je crée une JFrame qui contient une JToolbar en haut et un JPanel en dessous. Le truc classique.. Je redéfinie le paintComponent de mon JPanel de la manière suivante :

    (je translate g2D, puis je le remets à sa position initiale et je trace une ligne : voir code)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     @Override
        protected void paintComponent(Graphics g)
        {
            Graphics2D g2D = (Graphics2D)g;
            super.paintComponent(g2D);
     
            g2D.translate(100, 0);
     
            try{
                g2D.transform(g2D.getTransform().createInverse());
     
            } catch (NoninvertibleTransformException ex) {}
     
            g2D.drawLine(0, 0, 100, 100);
        }
    Alors ma ligne se dessinne certes, mais en prenant pour origine le haut de la JToolBar (c'est-à-dire l'origine de la JFrame) et pas l'origine de mon JPanel !!!
    Que se passe-t-il ?
    Merci bien.

  6. #6
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    change

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     g2D.drawLine(0, 0, 100, 100);
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g2D.drawLine(tonPanno.getLocation().x,tonPanno.getLocation().y, 100, 100);

  7. #7
    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
    Ok, cela marche peut-être mais ça n'explique pas pourquoi si je fais
    g2D.drawLine(0,0,100,100); sans trafiquer g2D avant, eh bien ma ligne est bien positionné (en haut à gauche du JPanel).
    Plus précisément :
    le code suivant positionne ma ligne en haut de la JToolBar (c'est-à-dire à l'origine du JFrame et pas du JPanel)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    @Override
        protected void paintComponent(Graphics g)
        {
            Graphics2D g2D = (Graphics2D)g;
            super.paintComponent(g2D);
     
            g2D.translate(100, 0);
     
            try{
                g2D.transform(g2D.getTransform().createInverse());
     
            } catch (NoninvertibleTransformException ex) {}
     
            g2D.drawLine(0, 0, 100, 100);
        }
    et celui-là positionne correctement la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    @Override
        protected void paintComponent(Graphics g)
        {
            Graphics2D g2D = (Graphics2D)g;
            super.paintComponent(g2D);
     
            g2D.drawLine(0, 0, 100, 100);
        }
    alors pourquoi cette différence ? ...puisque dans les deux cas je devrais retrouver l'origine du JPanel.

  8. #8
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    c'est un un beug !!!!


    je plaisente



    Citation Envoyé par Virgile le chat Voir le message
    Ok, cela marche peut-être
    pourquoi "peut être" !! tu n'est pas sur ?


    Citation Envoyé par Virgile le chat Voir le message
    ça n'explique pas pourquoi si je fais
    g2D.drawLine(0,0,100,100); sans trafiquer g2D avant, eh bien ma ligne est bien positionné (en haut à gauche du JPanel).
    Plus précisément :
    le code suivant positionne ma ligne en haut de la JToolBar (c'est-à-dire à l'origine du JFrame et pas du JPanel)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    @Override
        protected void paintComponent(Graphics g)
        {
            Graphics2D g2D = (Graphics2D)g;
            super.paintComponent(g2D);
     
            g2D.translate(100, 0);
     
            try{
                g2D.transform(g2D.getTransform().createInverse());
     
            } catch (NoninvertibleTransformException ex) {}
     
            g2D.drawLine(0, 0, 100, 100);
        }
    et celui-là positionne correctement la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    @Override
        protected void paintComponent(Graphics g)
        {
            Graphics2D g2D = (Graphics2D)g;
            super.paintComponent(g2D);
     
            g2D.drawLine(0, 0, 100, 100);
        }
    alors pourquoi cette différence ? ...puisque dans les deux cas je devrais retrouver l'origine du JPanel.

    ton vecteur de translation est de (100,0) or la méthode g2D.getTransform() renvoi un vecteur de translation par rapport au la fenétre principale signifie
    (100, hauteur du ton tool barre)

    tu peut vérifier avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                    System.out.println(g2D.getTransform().getTranslateX());
    	        System.out.println(g2D.getTransform().getTranslateY());
    	        try
    	        {
    	            g2D.transform(g2D.getTransform().createInverse());
     
    	        } catch (NoninvertibleTransformException ex) {}

  9. #9
    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
    "peut-être" car je n'ai pas vérifié. Mais c'est une façon de parler. Je te fais confiance.
    Sinon, pour mon problème, ce n'est pas très logique que createInverse soit translate(-100, -hauteurJToolBar) !
    De plus, en fait le problème que j'ai expliqué est une simplification d'un problème plus complexe dans un programme que je développe en ce moment.
    En fait, dans mon programme, j'ai dans mon paintComponent de mon JPanel, g2D.createInverse. Quand mon programme s'ouvre j'ai ce problème (décalage vers le haut à cause de ma JToolbar) mais après un appel de repaint le problème de décalage n'apparait plus. c'est juste à l'initialisation que le décalage se produit. Ensuite createInverse renvoie bien la vrai inverse de mon affineTransform.
    Donc ?...

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

Discussions similaires

  1. Footer mal positionné
    Par Debault dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 01/03/2008, 12h15
  2. DIV en absolute d'un DIV relative mal positionné avec IE6
    Par Stessy dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 27/02/2007, 16h47
  3. JPanel et positionnement sur un ViewPort
    Par RR instinct dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 09/02/2007, 15h33
  4. anim Flash mal positionnée sous Firefox
    Par matperino dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 10/09/2006, 17h11
  5. [W3C] FOOTER mal positionné dans une colonne
    Par miltonis dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 28/12/2005, 16h38

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