cs_Nayra
Messages postés11Date d'inscriptionvendredi 27 février 2009StatutMembreDernière intervention14 avril 2009
-
11 avril 2009 à 21:00
cs_Nayra
Messages postés11Date d'inscriptionvendredi 27 février 2009StatutMembreDernière intervention14 avril 2009
-
14 avril 2009 à 22:26
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
}
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 ..
uhrand
Messages postés491Date d'inscriptionsamedi 20 mai 2006StatutMembreDernière intervention15 juillet 20129 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);
}
uhrand
Messages postés491Date d'inscriptionsamedi 20 mai 2006StatutMembreDernière intervention15 juillet 20129 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 ;
}
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
}
cs_Nayra
Messages postés11Date d'inscriptionvendredi 27 février 2009StatutMembreDernière intervention14 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 :
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);}
uhrand
Messages postés491Date d'inscriptionsamedi 20 mai 2006StatutMembreDernière intervention15 juillet 20129 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.
cs_Nayra
Messages postés11Date d'inscriptionvendredi 27 février 2009StatutMembreDernière intervention14 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