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 :

JLayeredPane et setTransform, comportement étrange


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut JLayeredPane et setTransform, comportement étrange
    Bonjour.

    Je dessine dans un JPanel et j'aimerais pouvoir faire passer des JInternalFrame par dessus ce dessin. Mais il semblerait que Graphics2D setTransform pose des soucis. Lorsque j'assigne une AffineTransform j'ai des trainées lorsque je déplace la JInternalFrame par dessus le JPanel.

    Voici le code qui expose le problème :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    import javax.swing.*;
     
    import java.awt.*;
    import java.awt.geom.AffineTransform;
     
    public class RootLayeredPaneDemo extends JPanel
    {
        public RootLayeredPaneDemo(JLayeredPane layeredPane)
        {
     
            JInternalFrame dummyTest = new JInternalFrame();
            dummyTest.setSize(100, 100);
            dummyTest.setLocation(120, 100);
            dummyTest.putClientProperty("JInternalFrame.isPalette", Boolean.TRUE);
            dummyTest.setVisible(true);
     
            layeredPane.add(dummyTest, 1);
     
            IMGPanel panel = new IMGPanel(false);
            panel.setSize(100, 100);
            panel.setLocation(0, 0);
            layeredPane.add(panel, 0);
     
            IMGPanel panel2 = new IMGPanel(true);
            panel2.setSize(100, 100);
            panel2.setLocation(150, 0);
            layeredPane.add(panel2, 0);
     
        }
     
        private class IMGPanel extends JPanel
        {
            boolean at;
     
            public IMGPanel(boolean at)
            {
                this.at = at;
            }
     
            @Override
            public void paintComponent(Graphics graphics)
            {
                Graphics2D g = (Graphics2D) graphics;
                g.setColor(Color.red);
                g.clearRect(0, 0, getWidth(), getHeight());
                if (at)
                    g.setTransform(new AffineTransform());
                g.drawLine(0, getHeight()/2, getWidth(), getHeight()/2);
                g.drawLine(getWidth()/2, 0, getWidth()/2, getHeight());
            }
        }
     
        private static void createAndShowGUI()
        {
            //Create and set up the window.
            JFrame frame = new JFrame("RootLayeredPaneDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            //Create and set up the content pane.
            RootLayeredPaneDemo newContentPane = new RootLayeredPaneDemo(
                    frame.getLayeredPane());
            newContentPane.setOpaque(true); //content panes must be opaque
            frame.setContentPane(newContentPane);
     
            //Display the window.
            frame.setSize(new Dimension(300, 350));
            frame.setVisible(true);
        }
     
        public static void main(String[] args)
        {
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            javax.swing.SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowGUI();
                }
            });
        }
    }
    Si on passe l'interalFrame sur le panel à gauche tout baigne mais sur celui de droite ça fait des trainées.


    Merci d'avance.

  2. #2
    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
    ajoute un appel à super.paintComponent(g) au début de ton paintComponent

  3. #3
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut
    Citation Envoyé par sinok Voir le message
    ajoute un appel à super.paintComponent(g) au début de ton paintComponent
    Aucun effet.

    Ça marche chez toi en faisant ça ?

  4. #4
    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
    salut.
    d'aprés mes infos, JDesktopPane est le seul conteneur fait pour gérer les JInternalFrame

  5. #5
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut
    Citation Envoyé par slim_java Voir le message
    salut.
    d'aprés mes infos, JDesktopPane est le seul conteneur fait pour gérer les JInternalFrame
    J'étais pas sceptique et malheureusement j'avais raison de l'être, ça ne change rien.

    Voici le code que j'ai fait pour tester :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    import javax.swing.*;
     
    import java.awt.*;
    import java.awt.geom.AffineTransform;
     
    public class JDPaneTest extends JPanel
    {
        boolean at;
     
        public JDPaneTest(boolean at)
        {
            this.at = at;
        }
     
        @Override
        public void paintComponent(Graphics graphics)
        {
            Graphics2D g = (Graphics2D) graphics;
            g.setColor(Color.red);
            g.clearRect(0, 0, getWidth(), getHeight());
            if (at)
                g.setTransform(new AffineTransform());
            g.drawLine(0, getHeight() / 2, getWidth(), getHeight() / 2);
            g.drawLine(getWidth() / 2, 0, getWidth() / 2, getHeight());
        }
     
        private static void createAndShowGUI()
        {
            //Create and set up the window.
            JFrame frame = new JFrame("RootLayeredPaneDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            //Create and set up the content pane.
            JDesktopPane jdp = new JDesktopPane();
     
            //panels
            JDPaneTest panel = new JDPaneTest(false);
            panel.setSize(100, 100);
            panel.setLocation(0, 0);
     
            JDPaneTest panel2 = new JDPaneTest(true);
            panel2.setSize(100, 100);
            panel2.setLocation(150, 0);
     
            jdp.add(panel, -1);
            jdp.add(panel2, -1);
     
     
            //internal frame
            JInternalFrame dummyTest = new JInternalFrame();
            dummyTest.setSize(100, 100);
            dummyTest.setLocation(120, 100);
            dummyTest.putClientProperty("JInternalFrame.isPalette", Boolean.TRUE);
            dummyTest.setVisible(true);
     
            jdp.add(dummyTest, 0);
     
            jdp.setBackground(Color.gray);
     
            frame.setContentPane(jdp);
     
            //Display the window.
            frame.setSize(new Dimension(300, 350));
            frame.setVisible(true);
     
     
        }
     
        public static void main(String[] args)
        {
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            javax.swing.SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowGUI();
                }
            });
     
        }
    }

  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
    salut.
    je comprends pas ces deux lignes !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     if (at)      
              g.setTransform(new AffineTransform());

  7. #7
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut
    Citation Envoyé par slim_java Voir le message
    salut.
    je comprends pas ces deux lignes !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     if (at)      
              g.setTransform(new AffineTransform());
    Je me suis probablement mal exprimé dans le premier post car c'est là le coeur de mon problème.

    J'utilise une affineTransform pour faire des dessins dans un JPanel mais dès que je fais appel à la méthode setTransform j'ai des trainées quand un élément se déplace au dessus. Sans la transform pas de trainées et tout se passe bien. Malheureusement s'en passer n'est pas une option.

    Ces lignes servent donc à illustrer mon problème en faisant un panel avec transform et un sans.

    J'espère que c'est plus clair

  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
    Citation Envoyé par ThzChz Voir le message
    Malheureusement s'en passer n'est pas une option.
    qu'est ce que tu cherche à faire avec l' AffineTransform ?
    je vois aucune transformation

  9. #9
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut
    Citation Envoyé par slim_java Voir le message
    qu'est ce que tu cherche à faire avec l' AffineTransform ?
    Du zoom & pan, c'est déjà fait et ça fonctionne mais ne nous écartons pas du sujet svp

    edit: Le contenu de l'affineTransform ne change rien au problème et le code posté sert simplement à illustrer et n'a rien à voir avec le code sur lequel je travaille (qui serait bien trop long pour être posté ici).

  10. #10
    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
    Citation Envoyé par ThzChz Voir le message
    mais ne nous écartons pas du sujet svp
    ah bon !
    voila comment tu devais utiliser un objet AffineTransform :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AffineTransform at = new AffineTransform();
    Ellipse2D.Float ellipse = new Ellipse2D.Float(10f,10f,10f,10f);
    at.translate(50, 50);
    g.fill(at.createTransformedShape(ellipse));
    essayer donc de mettre mon code sous et dis moi si le problème d'affichage persiste

  11. #11
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut
    Citation Envoyé par slim_java Voir le message
    ah bon !
    voila comment tu devais utiliser un objet AffineTransform :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AffineTransform at = new AffineTransform();
    Ellipse2D.Float ellipse = new Ellipse2D.Float(10f,10f,10f,10f);
    at.translate(50, 50);
    g.fill(at.createTransformedShape(ellipse));
    essayer donc de mettre mon code sous et dis moi si le problème d'affichage persiste
    Merci pour ton aide mais tu n'as pas saisi mon problème, je sais comment utiliser les AffineTransform, j'en ai mis une vide pour l'exemple vu que son contenu ne changeait rien. Mais celle que j'utilise est bien remplie de translate et scale

    Ceci dit j'ai peut être trouvé comment contourner le problème de mon côté.

  12. #12
    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
    Citation Envoyé par ThzChz Voir le message
    Mais celle que j'utilise est bien remplie de translate et scale
    ok donc ne s'agit il d'un problème de double-buffering

    Citation Envoyé par ThzChz Voir le message
    Ceci dit j'ai peut être trouvé comment contourner le problème de mon côté.
    tu peux nous dire comment ?

  13. #13
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut
    En ajoutant un repaint() explicite, j'ai réussi dans l'exemple mais je ne suis pas encore parvenu à trouver le bon endroit dans mon code, donc ce n'est peut être pas encore gagné. Si j'y arrive je posterai la solution bien entendu.

  14. #14
    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
    Passe en java 6, le problème n'y existe pas.

  15. #15
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut
    Je suis en java 1.6.

  16. #16
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut
    Mais... je n'ai pas résolu mon problème ! (un modérateur l'avait coché comme résolu)

    En rajoutant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        @Override
        public void paintComponent(Graphics graphics)
        {
            panel2.repaint();
        }
    Le problème persiste si la palette est entièrement à l'intérieur du panel (il faut lui assigner une taille plus petite pour s'en rendre compte).

    Un coup dans l'eau donc

  17. #17
    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
    Citation Envoyé par ThzChz Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        @Override
        public void paintComponent(Graphics graphics)
        {
            panel2.repaint();
        }


    essayer de faire ton dessin dans une image, par la suite ajouter cette image à ton panneau
    un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public void paintComponent(Graphics g)
         {
            Image monImage = (BufferedImage)    createImage(100, 100);
            Graphics buffer = monImage.getGraphics();
            Graphics2D surface = (Graphics2D) buffer;
            // dessiner on utilisant l'objet surface
           // ...
            g.drawImage(monImage, 0, 0, null);
        }

  18. #18
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut
    Citation Envoyé par slim_java Voir le message


    essayer de faire ton dessin dans une image, par la suite ajouter cette image à ton panneau
    un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public void paintComponent(Graphics g)
         {
            Image monImage = (BufferedImage)    createImage(100, 100);
            Graphics buffer = monImage.getGraphics();
            Graphics2D surface = (Graphics2D) buffer;
            // dessiner on utilisant l'objet surface
           // ...
            g.drawImage(monImage, 0, 0, null);
        }

    Je sais ce n'est pas bien joli, mais j'en suis arrivé à un point ou trouver une solution est devenu plus important que de comprendre le problème :p

    La solution m'a été donnée ailleurs, au lieu d'utiliser g.setTransform utiliser plutôt g.transform, c'est écrit dans la doc en plus :
    Overwrites the Transform in the Graphics2D context. WARNING: This method should never be used to apply a new coordinate transform on top of an existing transform because the Graphics2D might already have a transform that is needed for other purposes, such as rendering Swing components or applying a scaling transformation to adjust for the resolution of a printer.
    Ça m'apprendra.

    Merci pour votre aide malgré tout.

  19. #19
    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
    Citation Envoyé par ThzChz Voir le message
    au lieu d'utiliser g.setTransform utiliser plutôt g.transform, c'est écrit dans la doc en plus
    on avait pas une idée sur les transformations que tu applique...

    un peu de théorie :

    qd tu souhaite appliquer seulement des transformations de manière temporaire,
    il vaudrait mieux récupérer l'ancienne transformation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AffineTransform ancienne_Transf =g.getTransform();
    ensuite, tu applique les nouvelles transformations
    Enfin, ajouter l'ancienne transformation à la nouvelle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.setTransform(ancienne_Transf );
    c'est une habitude pour ceux qui travaillent en 3D

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

Discussions similaires

  1. [Forms6i] Un IF-ELSIF au comportement étrange
    Par lafouine dans le forum Forms
    Réponses: 11
    Dernier message: 13/09/2005, 16h40
  2. Comportement étrange apres une désinstallation
    Par Sunchaser dans le forum Excel
    Réponses: 4
    Dernier message: 06/08/2005, 20h44
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 22h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 10h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 12h23

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