Probleme avec le drag and drop

cs_Nayra Messages postés 11 Date d'inscription vendredi 27 février 2009 Statut Membre Dernière intervention 14 avril 2009 - 11 avril 2009 à 21:00
cs_Nayra Messages postés 11 Date d'inscription vendredi 27 février 2009 Statut Membre Dernière intervention 14 avril 2009 - 14 avril 2009 à 22:26
Bonsoir à tous,

alors je vous présente ce code :

[B]import java.awt.Event;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

public class Test2 extends JFrame implements MouseMotionListener{
JLabel[] label = new JLabel[100]; //Copies de l'image
JPanel p ;//notre panel principal qui contient les images
int nbCopie=0; //nombre de copies existantes

public Test2(){//constructeur qui créé la fenetre principale
super("titre");
p = new JPanel(null);
createCopy(); //on ajoute une copie au panel
this.getContentPane().add(p);
this.setSize(800,600);
this.setVisible(true);
}

public static void main(String[] args) {
new Test2();
}

public void createCopy(){// créé une nouvelle copie de l'image
label[nbCopie]=new JLabel(new ImageIcon("logo.png"));
//initialise l'image
label[nbCopie].setBounds(0,0,120,160); // initialise sa position aux coordonnéees 0,0
label[nbCopie].addMouseMotionListener(this);//ajoute un mousemotionlistener pour détecter le drag n drop
p.add(label[nbCopie]);//on ajoute la copie au panel
p.repaint();//on redessine le panel
nbCopie++; //incrémente le nombre de copies existantes
}

public void mouseDragged(MouseEvent e) {
//lorsque qu'on fais du drag n drop sur une copie

//si la derniere copie créé a été bougée (coordonnées 0,0),
//on en créé une nouvelle qui sert de modele
if (label[nbCopie-1].getX() != 0 && label[nbCopie-1].getY()!=0) createCopy();

JLabel temp=(JLabel)e.getSource();
//créé une référence vers la copie sur laquelle on a cliqué

temp.setBounds(temp.getX()+e.getX()-60,temp.getY()+e.getY()-80,120,160);
//déplace la copie sur laquelle je fais du drag n drop
}

public void mouseMoved(MouseEvent e) {
}
}/B

comme vous avez compris, le code permet de faire le drag and drop d'une image dans une fenetre construite d'un seul panneau, et il fonctionne très bien.

le problème ici c'est que je n'arrive pas à modifier mon code de façon qu'il me permettra de déplacer cette image d'un panel à un autre.
en fait, je veux que ma fenetre soit divisée en deux panels,l'un contiendra l'image(ou précisément sa copie originale), l'autre est celui que je déposerais mes copies de l'image dedans.

si ça vous intéresse, merci de me répondre.
j'ai besoin d'un coup de pouce, alors n'hésitez pas.
merci ..

7 réponses

uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
12 avril 2009 à 10:27
1. Définir les variables nécessaires:
private JPanel panel2;
private JLayeredPane dragLayer;
private JLabel temp2;  //référence sur le JLabel en cours de déplacement

2. Dans le constructeur, créer "panel2" et obtenir le "dragLayer" (=JLayeredPane existant déjà dans JFrame):
panel2 = new JPanel(null);
panel2.setBorder(BorderFactory.createLineBorder(Color.BLUE));
add(panel2);
dragLayer = getLayeredPane();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

3. Définir le JPanel "p" p.ex. dans "BorderLayout.WEST" (au lieu du positionnement par défaut qui est "CENTER"):
this.getContentPane().add(p, BorderLayout.WEST);
p.setPreferredSize(new Dimension(120, 0));  //mettre la largeur désirée

4. Ajouter un "MouseListener" au "JLabel" et faire le "drop" dans "mouseReleased":
public void createCopy() {// créé une nouvelle copie de l'image
...
    label[nbCopie].addMouseListener(new MouseAdapter() {
        @Override
        public void mouseReleased(MouseEvent e) {
            if (temp2 != null) {
                dragLayer.remove(temp2);
                Point loc = temp2.getLocation();
                loc.translate(-panel2.getX(), -panel2.getY());
                temp2.setLocation(loc);
                panel2.add(temp2);
                temp2 = null;
                panel2.repaint();
            }
        }
    });
    nbCopie++; //incrémente le nombre de copies existantes
}

5. Dans "mouseDragged", mettre le "JLabel" dans la variable d'instance "temp2" et faire le déplacement du "JLabel" vers le "dragLayer" (remove-add) (Tu peus laisser inchangé le JLabel temp et temp.setBounds(..)):
if (label[nbCopie - 1].getX() != 0 && label[nbCopie - 1].getY() != 0) {
    temp2 = (JLabel) e.getSource();
    p.remove(temp2);
    createCopy();
    dragLayer.add(temp2, JLayeredPane.DRAG_LAYER);
}
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
12 avril 2009 à 11:22
Dans mouseReleased, avant de faire "panel2.add(temp2)" on pourrait encore contrôler si le JLable est bien sur le panel2. Par exemple:
if(temp2.getX() < 0){
    dragLayer.repaint();
    return ;
}
0
cs_Nayra Messages postés 11 Date d'inscription vendredi 27 février 2009 Statut Membre Dernière intervention 14 avril 2009
12 avril 2009 à 14:17
Bonjour Monsieur,

merci bien pour la réponse
ça va beaucoup me servir.

en corrigeant mon code, je vois que ma fenêtre est bien divisée en deux panels, mais je trouve pas l'image.
voici comment j'ai procédé:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

public class Test2 extends JFrame implements MouseMotionListener{
JLabel[] label = new JLabel[100]; //Copies de l'image
JPanel p ;//notre panel principal qui contient les images
int nbCopie=0; //nombre de copies existantes
private JPanel panel2;
private JLayeredPane dragLayer;
private JLabel temp2;  //référence sur le JLabel en cours de déplacement

public Test2(){//constructeur qui créé la fenetre principale
super("titre");
p = new JPanel(null);
createCopy(); //on ajoute une copie au panel
this.getContentPane().add(p, BorderLayout.WEST);
p.setPreferredSize(new Dimension(120, 0));  //mettre la largeur désirée
this.setSize(800,600);
this.setVisible(true);
panel2 = new JPanel(null);
panel2.setBorder(BorderFactory.createLineBorder(Color.BLUE));
add(panel2);
dragLayer = getLayeredPane();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {
new Test2();
}

public void createCopy(){// créé une nouvelle copie de l'image
    label[nbCopie]=new JLabel(new ImageIcon("C:\\Documents and Settings\\Naira\\workspace\\mon projet\\ressources\\delete.png"));
    //initialise l'image

    label[nbCopie].addMouseListener(new MouseAdapter() {
        @Override
        public void mouseReleased(MouseEvent e) {
            if (temp2 != null) {
                dragLayer.remove(temp2);
                Point loc = temp2.getLocation();
                loc.translate(-panel2.getX(), -panel2.getY());
                temp2.setLocation(loc);
                if(temp2.getX() < 0){
                    dragLayer.repaint();
                    return ;}
                panel2.add(temp2);
                temp2 = null;
                panel2.repaint();}
        }});
    nbCopie++; //incrémente le nombre de copies existantes   
}

public void mouseDragged(MouseEvent e) {
if (label[nbCopie - 1].getX() != 0 && label[nbCopie - 1].getY() != 0) {
    temp2 = (JLabel) e.getSource();
    p.remove(temp2);
    createCopy();
    dragLayer.add(temp2, JLayeredPane.DRAG_LAYER);}
}

public void mouseMoved(MouseEvent e) {
}
}

je trouve pas ou est le problème
merci de m'aider sur cette tache.
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
12 avril 2009 à 20:02
Recommence en lisant attentivement le mode d'emploi, fais travailler également ton cerveau.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Nayra Messages postés 11 Date d'inscription vendredi 27 février 2009 Statut Membre Dernière intervention 14 avril 2009
13 avril 2009 à 18:12
Bonjour,
j'ai essayé de corriger mon code et j'ai réussi à faire afficher l'image.
mais lorsque je clique sur l'image (située dans le panel p) et que j'essaye à la déplacer, il se produit un comportement étrange : deux copies de l'images sont créées, l'une s'installe dans le panel p, l'autre dans le panel2 sans que je puisse la déplacer une seconde fois
voici le code :

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

public class Test2 extends JFrame implements MouseMotionListener{
/**
     *
     */
    private static final long serialVersionUID = 1L;
JLabel[] label = new JLabel[100]; //Copies de l'image
JPanel p ;//notre panel principal qui contient les images
int nbCopie=0; //nombre de copies existantes
private JPanel panel2;
private JLayeredPane dragLayer;
private JLabel temp2;  //référence sur le JLabel en cours de déplacement

public Test2(){//constructeur qui créé la fenetre principale
super("titre");
p = new JPanel();
p.setBorder(BorderFactory.createLineBorder(Color.GREEN));
createCopy(); //on ajoute une copie au panel
this.getContentPane().add(p, BorderLayout.WEST);
p.setPreferredSize(new Dimension(120, 0));  //mettre la largeur désirée
this.setSize(800,600);
this.setVisible(true);
panel2 = new JPanel(null);
panel2.setBorder(BorderFactory.createLineBorder(Color.BLUE));
add(panel2);
dragLayer = getLayeredPane();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {
new Test2();
}

public void createCopy(){// créé une nouvelle copie de l'image
    p.add(label[nbCopie]=new JLabel(new ImageIcon("C:\\Documents and Settings\\Naira\\workspace\\mon projet\\ressources\\folder.png")));
    //initialise l'image
    label[nbCopie].setBounds(0,0,120,160); // initialise sa position aux coordonnéees 0,0
    label[nbCopie].addMouseMotionListener(this);
    label[nbCopie].addMouseListener(new MouseAdapter() {
        public void mouseReleased(MouseEvent e) {
    
            if (temp2 != null) {
                dragLayer.remove(temp2);
                Point loc = temp2.getLocation();
                loc.translate(panel2.getX(), panel2.getY());
                temp2.setLocation(loc);}
            
            if(temp2.getX() < 0){
                    dragLayer.repaint();
                    return ;}

                panel2.add(temp2);
                temp2 = null;
                panel2.repaint();       
        }
    
});

    nbCopie++; //incrémente le nombre de copies existantes
}
    

public void mouseDragged(MouseEvent e) {
    if (label[nbCopie - 1].getX() != 0 && label[nbCopie - 1].getY() != 0) {
        temp2 = (JLabel) e.getSource();
        p.remove(temp2);
        createCopy();
        dragLayer.add(temp2, JLayeredPane.DRAG_LAYER);}

}

public void mouseMoved(MouseEvent e) {
}
}

merci pour votre aide( je suis encore débutante en programmation)
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
14 avril 2009 à 21:18
Je n'ai pas regardé de près ta dernière version, mais quand moi je fais les modifications que j'ai décrit plus haut dans ta première version, ça fonctionne très bien. Tu n'as rien à inventer la dedans, il suffit de savoir lire et de suivre exactement mes instructions, et ça fonctionnera.
0
cs_Nayra Messages postés 11 Date d'inscription vendredi 27 février 2009 Statut Membre Dernière intervention 14 avril 2009
14 avril 2009 à 22:26
eh ben ça n'a pas fonctionné
et je sais bien comment lire
peut être que tu dois lire de près pour pouvoir me répondre sur ce que j'ai demandé exactement
0
Rejoignez-nous