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

Agents de placement/Fenêtres Java Discussion :

JPanel : "Saut" lors d'une perte de focus


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2010
    Messages : 8
    Points : 9
    Points
    9
    Par défaut JPanel : "Saut" lors d'une perte de focus
    Hello!

    J'ai un petit problème que je n'arrive pas à résoudre avec des JPanel.

    Je dessine une scène 2D dedans, tout va bien tant que mon JPanel garde le focus (il y a possibilité de bouger la scène avec la souris et la molette).

    Mais lorsque je clique sur une autre fenêtre de mon interface (toutes les fenêtres sont des JInternalFrame dans un JDesktopPane), la vue du JPanel saute étrangement.
    Et dès que je repaint ma vue, elle reprend la position d'avant le saut...

    J'ai une application totalement différente (dans le sens où ce n'est pas du copier-coller du JPanel, mais du code neuf) et j'ai le même phénomène (sur Windows, OS X et Ubuntu)

    Je vous met le code simplifié :

    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
    84
    85
    86
    87
    88
    89
    90
    91
    public class Panel2D extends JPanel implements MouseMotionListener, MouseWheelListener, MouseListener
    {
     
        private Point2D.Double center;
        private double scaleFactor;
        protected Point lastMousePosition;
     
        public Panel2D()
        {
            super();
     
            lastMousePosition = null;
     
    	panelBounds = new Rectangle2D.Double();
            center = new Point2D.Double(getSize().getWidth() / 2.0,
                                        getSize().getHeight() / 2.0);
     
    	// ...
     
            setScaleFactor(1.0 / 3.0);
     
            setBackground(Color.black);
     
            addMouseListener(this);
            addMouseMotionListener(this);
            addMouseWheelListener(this);
        }
     
        @Override
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
     
    	AffineTransform saveG2D = g2d.getTransform();
     
            g2d.setTransform(AffineTransform.getScaleInstance(scaleFactor, scaleFactor));
     
            g2d.translate(getSize().getWidth() / 2.0 / scaleFactor,
                          getSize().getHeight() / 2.0 / scaleFactor);
            g2d.translate(-center.x, center.y);
     
    	// dessin des objets...
     
            g2d.setTransform(saveG2D);
        }
     
    public final void setScaleFactor(double _scaleFactor)
        {
            scaleFactor = _scaleFactor;
     
            if (scaleFactor > 3.0)
            {
                scaleFactor = 3.0;
            }
     
            if (scaleFactor < 0.1)
            {
                scaleFactor = 0.1;
            }
     
            panelBounds = new Rectangle2D.Double(center.x - getSize().getWidth() / scaleFactor,
                                                 center.y - getSize().getHeight() / scaleFactor,
                                                 getSize().getWidth() * 2.0 / scaleFactor,
                                                 getSize().getHeight() * 2.0 / scaleFactor);
     
            repaint();
        }
     
        public void mouseDragged(MouseEvent e)
        {
            if (lastMousePosition != null)
            {
                center.x -= (e.getLocationOnScreen().x - lastMousePosition.x) / (scaleFactor / 2.0);
                center.y += (e.getLocationOnScreen().y - lastMousePosition.y) / (scaleFactor / 2.0);
            }
            lastMousePosition = e.getLocationOnScreen();
            repaint();
        }
     
        public void mouseWheelMoved(MouseWheelEvent e)
        {
            setScaleFactor(scaleFactor - e.getWheelRotation() / 10.0);
        }
     
        public void mouseReleased(MouseEvent e)
        {
            lastMousePosition = null;
        }
     
    //...
    }
    et la JInternalFrame qui contient tout ça :
    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
     
    public class Frame2D extends JInternalFrame implements Observer
    {
     
        private Panel2D panel;
     
        public Frame2D()
        {
            super("Affichage 2D des points HPS (données traitées)",
                  true, //resizable
                  true, //closable
                  true, //maximizable
                  true);//iconifiable
     
            setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
     
            panel = new Panel2D();
     
            setLayout(new BorderLayout());
            add(panel);
     
            setVisible(true);
     
            pack();
        }
     
        @Override
        public void update(Observable o, Object arg)
        {
            repaint();
        }
    }
    Est-ce que j'oublie de faire appel à une méthode particulière?

    Merci d'avance pour toute aide

    LePaK



    PS : quelques images du phénomène

    la première lorsque le panel a le focus


    la deuxième juste après l'avoir perdu, on voit bien que la vue à fait un "saut"

  2. #2
    Membre actif Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par lepak Voir le message
    Est-ce que j'oublie de faire appel à une méthode particulière?
    Essaie avec la méthode "scale" (au lieu de "getScaleInstance"):
    //g2d.setTransform(AffineTransform.getScaleInstance(scaleFactor, scaleFactor));
    g2d.scale(scaleFactor, scaleFactor);

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2010
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par uhrand Voir le message
    Essaie avec la méthode "scale" (au lieu de "getScaleInstance"):
    //g2d.setTransform(AffineTransform.getScaleInstance(scaleFactor, scaleFactor));
    g2d.scale(scaleFactor, scaleFactor);
    Bien vu!
    Merci beaucoup!

    Par contre je serais pas contre une petite explication du pourquoi du comment

  4. #4
    Membre actif Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Points : 275
    Points
    275
    Par défaut
    "getScaleInstance" crée chaque fois un nouvel objet de "AffineTransform", tandis que "scale" utilise l'objet "AffineTransform" existant pour le mettre à l'échelle. D'ailleurs, la création d'objets est généralement déconseillée à l'intérieur de la méthode "paintComponent".

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/09/2014, 13h14
  2. [AJAX] appel AJAX lors d'une perte de session
    Par CocoLeNain dans le forum AJAX
    Réponses: 0
    Dernier message: 31/05/2010, 21h35
  3. excel -> test lors de la perte du focus d'une cellule
    Par greg778 dans le forum Macros et VBA Excel
    Réponses: 24
    Dernier message: 26/09/2005, 17h26

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