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 du drag'n'drop de JLabel


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 44
    Par défaut Problème avec du drag'n'drop de JLabel
    Bonjour,

    J'essaye de faire un petit test de drag'n'drop d'un JLabel sur un JPanel.
    J'ai donc ajouté un MouseMotionListener à mon JLabel, mais lorsque je déplace ce dernier, bizarrement, une seule image sur deux du JLabel est bonne au niveau des coordonnées (l'autre se trouve en bas à droite).

    Voici les positions successives de mon JLabel lorsque je le bouge :
    java.awt.Point[x=450,y=394]
    java.awt.Point[x=250,y=248]
    java.awt.Point[x=428,y=370]
    java.awt.Point[x=236,y=230]
    java.awt.Point[x=414,y=358]
    java.awt.Point[x=224,y=220]

    Je ne vois pourtant pas ce qui cloche dans mon mouseDragged :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void mouseDragged(MouseEvent e) {
            Component source = (Component) e.getSource(); // mon JLabel, donc
            Point fLocation = f.getLocation(); // location de la frame sur l'écran
            int xos = e.getXOnScreen();
            int yos = e.getYOnScreen();
            source.setLocation(xos - fLocation.x - 4 + e.getX(),
                               yos - fLocation.y - 24 + e.getY()); // 4 et 24 sont la différence entre la frame et le JPanel
            dp.repaint(); // apparemment inutile
        }



    Qu'est-ce que j'ai oublié de prendre en compte dans mon calcul ? Quelqu'un a une idée ?

    Merci d'avance !

  2. #2
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Je suis pas un pro du drag and drop, mais il me semble bizarre que tu utilises getX() et getXOnScreen() pour ton calcul. Est-ce que tu ne pourrais pas utiliser seulement un des deux, ça serait plus clair.

    Il me semble qu'un simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    source.setLocation(e.getX(), e.getY());
    suffit normalement, non ? Pourquoi tu as besoin de calculer la position sur l'écran ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 44
    Par défaut
    Citation Envoyé par Baptiste Wicht Voir le message
    Je suis pas un pro du drag and drop, mais il me semble bizarre que tu utilises getX() et getXOnScreen() pour ton calcul. Est-ce que tu ne pourrais pas utiliser seulement un des deux, ça serait plus clair.

    Il me semble qu'un simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    source.setLocation(e.getX(), e.getY());
    suffit normalement, non ? Pourquoi tu as besoin de calculer la position sur l'écran ?

    Je veux en fait tenir compte de l'endroit du JLabel où l'utilisateur a cliqué.
    Par exemple, s'il clique dans le quart inférieur droit du JLabel, le comportement ne devra pas être le même que s'il clique dans le quart supérieur gauche, car setLocation() positionne l'élément avec son coin supérieur gauche...

  4. #4
    Membre expérimenté 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
    Par défaut
    Citation Envoyé par zzzer Voir le message
    Je veux en fait tenir compte de l'endroit du JLabel où l'utilisateur a cliqué.
    Essaie ceci:
    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
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    public class DragComponentDemo extends JFrame{
        //The component to be dragged:
        private JLabel label = new JLabel("Hello world");
        public DragComponentDemo(){
            super("DragComponentDemo");
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            setSize(400, 300);
            setLocationRelativeTo(null);
            setLayout(null);
            label.setBounds(50, 50, label.getPreferredSize().width,
                    label.getPreferredSize().height);
            label.setCursor(new Cursor(Cursor.MOVE_CURSOR));
            add(label);
            DragHandler dragHandler = new DragHandler();
            label.addMouseListener(dragHandler);
            label.addMouseMotionListener(dragHandler);
        }
        public static void main(final String... args){
            Runnable gui = new Runnable() {
                public void run() {
                    new DragComponentDemo().setVisible(true);
                }
            };
            //GUI must start on EventDispatchThread:
            SwingUtilities.invokeLater(gui);
        }
    }
    class DragHandler extends MouseAdapter{
    //We save the "press" point in "mousePressed", so we can translate the
    //source location in "mouseDragged" relatively to the "press" point:
        private Point press;
        @Override
        public void mousePressed(final MouseEvent e) {
            press = e.getPoint();
        }
        @Override
        public void mouseDragged(final MouseEvent e) {
            Component source = (Component) e.getSource();
            Point location = source.getLocation();
            location.translate(e.getX() - press.x, e.getY() - press.y);
            source.setLocation(location);
        }
    }

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 44
    Par défaut
    Citation Envoyé par uhrand Voir le message
    Essaie ceci:
    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
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    public class DragComponentDemo extends JFrame{
        //The component to be dragged:
        private JLabel label = new JLabel("Hello world");
        public DragComponentDemo(){
            super("DragComponentDemo");
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            setSize(400, 300);
            setLocationRelativeTo(null);
            setLayout(null);
            label.setBounds(50, 50, label.getPreferredSize().width,
                    label.getPreferredSize().height);
            label.setCursor(new Cursor(Cursor.MOVE_CURSOR));
            add(label);
            DragHandler dragHandler = new DragHandler();
            label.addMouseListener(dragHandler);
            label.addMouseMotionListener(dragHandler);
        }
        public static void main(final String... args){
            Runnable gui = new Runnable() {
                public void run() {
                    new DragComponentDemo().setVisible(true);
                }
            };
            //GUI must start on EventDispatchThread:
            SwingUtilities.invokeLater(gui);
        }
    }
    class DragHandler extends MouseAdapter{
    //We save the "press" point in "mousePressed", so we can translate the
    //source location in "mouseDragged" relatively to the "press" point:
        private Point press;
        @Override
        public void mousePressed(final MouseEvent e) {
            press = e.getPoint();
        }
        @Override
        public void mouseDragged(final MouseEvent e) {
            Component source = (Component) e.getSource();
            Point location = source.getLocation();
            location.translate(e.getX() - press.x, e.getY() - press.y);
            source.setLocation(location);
        }
    }

    Merci beaucoup, ça marche parfaitement !
    Problème résolu

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 44
    Par défaut
    uhrand, une petite question supplémentaire : y a-t-il une raison particulière pour créer une classe interne plutôt que de faire étendre ma classe principale ?

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

Discussions similaires

  1. problème d'encoding avec un drag-and-drop.
    Par Luke spywoker dans le forum GTK+ avec Python
    Réponses: 1
    Dernier message: 10/09/2014, 17h24
  2. Réponses: 1
    Dernier message: 19/02/2014, 20h17
  3. Réponses: 0
    Dernier message: 21/07/2010, 06h37
  4. [MooTools] Liste sans style avec le drag'n'drop
    Par mac5im dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 13/06/2008, 11h50
  5. Réponses: 1
    Dernier message: 29/04/2006, 16h55

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