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 :

Affichage d'un JPane dans un JFrame


Sujet :

AWT/Swing Java

  1. #41
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    bon chez moi le composant qu j'ajoute ne s'affiche pas dans le panneaucomposant en plus pour gérer le déplacement des composants dans le dragzone je dois définir un transferthandler? et est ce que je dois l'ajouter au composanttransferable? comment gérer les événements sur le composant transferable? c'est dans le draganddroplistener? et pour relier les composants dans le dragzone comment faire? un fois de plus merci pour ton aide si précieuse
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  2. #42
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    Règle d'abord le problème de l'affichage dans le panneau de gauche.
    Cela doit permettre de vérifier que le drag démarre.

    Une remarque générale : tu fais du code inutilement compliqué. Il n'est pas nécessaire, par exemple, de faire une classe spéciale pour le mouseListener
    ou encore je ne vois pas l'intérêt de la méthode getJContentPane dans Acceuil.
    Mais c'est mon opinion ...

    Pour l'instant ne change rien on continue avec ce que tu as fait.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #43
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    bon la le composant s'affiche c'était juste des erreurs d’inattention. le drag marche bien mais le dropzone n'accepte pas le drop.
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  4. #44
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    C'est normal, il faut créer un TransferHandler spécifique pour la DropZone
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  5. #45
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    oui c'est aussi ce que j'ai pensé mais je crois que c'est le rôle de la classe DropTransfertHandler que voila:
    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
     
    package monpackage;
     
    import java.awt.Point;
    import java.awt.datatransfer.DataFlavor;
    import javax.swing.TransferHandler;
     
    public class DropTransfertHandler extends TransferHandler{
    	public boolean importData(TransferHandler.TransferSupport support){
    		  if(!canImport(support))
    			  return false;
    		ComposantTransferable comp=(ComposantTransferable) support.getTransferable();
     
                // création d'un nouveau composant à partir du clone
                Composant copie = comp.composant.getClone();
     
                //  recuperation de la drop-zone
                DropZone destination = (DropZone) support.getComponent();
     
                //  coordonnées du largage
                Point p = support.getDropLocation().getDropPoint();
     
                destination.insert(copie,p);
    		return true;
    	}
    	public boolean canImport(TransferHandler.TransferSupport info) {
    		   //Nous contrôlons si les données reçues
    		   //sont d'un type autorisé, ici le type String 		
    		   if (!info.isDataFlavorSupported(DataFlavor.imageFlavor)) {
    			   return false;
    		   }
    		   return true;
    		}
    }
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  6. #46
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    Je regarde ça
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  7. #47
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    le problème est au niveau du dataflavor j'ai mis le contenu de la methode canImport du droptransferthandler le panneau accepte le drop mais le composant ne s'affiche pas dans le dropzone
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  8. #48
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    1) rectifications

    Tu dois faire attention quand tu surcharges une méthode.
    Tu as fais la même erreur que précédemment à savoir une petite faute de syntaxe qui fait croire que tu as bien surchargé la méthode mais qui crée une autre méthode :
    tu as tapé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public boolean canimport(TransferHandler.TransferSupport info) {
    alors qu'il fallait taper :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public boolean canImport(TransferHandler.TransferSupport info) {
    il fallait un "i" majuscule. N'oublie pas que java est sensible à la casse.
    Moralité : il faut faire du copier/coller de code pour éviter ce problème
    ou alors bien vérifier !

    toujours dans la même méthode, tu lui mets comme condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    		   if (!info.isDataFlavorSupported(DataFlavor.imageFlavor)) {
    			   return false;
    		   }
    		   return true;
    ça veut dire que s'il ne s'agit pas d'une image alors il ne doit pas transférer.
    Or nous voulons transférer un objet "ComposantTransferable" qui n'est pas une image !

    concentre-toi bien quand tu codes et demande-toi toujours pourquoi tu écris ce que tu écris.

    Bon enfin dans la méthode "importData" tu essayes de récupérer le ComposantTransferable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ComposantTransferable comp = (ComposantTransferable) support.getTransferable();
    erreur, il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ComposantTransferable comp = (ComposantTransferable) support.getTransferable().getTransferData(ComposantFlavor.getComposantFlavor());
    mais il est vrai que ce dernier point n'est pas intuitif !

    Voilà. Maintenant le drop en lui-même va fonctionner

    Ce qui ne marche pas c'est la méthode clone (elle plante) car elle renvoie l'objet lui-même au lieu d'une copie de l'objet (voir documentation de clone)


    2) évolutions

    On aborde ici un nouveau point de ton application.
    En fait, je trouve que le clone n'est pas si intéressant : à quoi bon copier l'objet transféré ComposantTransferable pour l'insérer dans DropZone ?
    Plutôt que de chercher à faire un clone, récupère l'image et le texte et construit un tout nouvel objet sur lequel tu pourras programmer les connexions électriques avec les autres éléments (c'est le but de ton application).
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  9. #49
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    voila ma nouvelle classe dropTransfertHandler mais elle n'accepte toujours pas le drop:
    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
     
    package monpackage;
    import java.awt.Point;
    import java.awt.datatransfer.DataFlavor;
    import java.awt.datatransfer.UnsupportedFlavorException;
    import java.io.IOException;
     
    import javax.swing.TransferHandler;
     
    public class DropTransfertHandler extends TransferHandler{
    	public boolean importData(TransferHandler.TransferSupport support){
    		  if(!canImport(support))
    			  return false;
    		ComposantTransferable comp = null;
    		try {
    			comp = (ComposantTransferable) support.getTransferable().getTransferData(ComposantFlavor.getComposantFlavor());
    		} catch (UnsupportedFlavorException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
                // création d'un nouveau composant à partir du clone
                Composant copie = comp.composant.getClone();
     
                //  recuperation de la drop-zone
                DropZone destination = (DropZone) support.getComponent();
     
                //  coordonnées du largage
                Point p = support.getDropLocation().getDropPoint();
     
                destination.insert(copie,p);
    		return true;
    	}
    	public boolean canImport(TransferHandler.TransferSupport info) {
    		  if (!info.isDataFlavorSupported(DataFlavor.imageFlavor)) {
    			   return false;
    		   }
    		   return true;
    		}
    }
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  10. #50
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    Ben déjà il faudrait apporter toutes les corrections mentionnées plus haut
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  11. #51
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    je ne sais pas pourquoi mais canimport est écris avec i majuscule et sa s'affiche en minuscule
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  12. #52
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    j'ai comme l'impression que la méthode insert n'agit pas voila son code:
    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
     
    package monpackage;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Point;
    import java.awt.datatransfer.DataFlavor;
    import java.util.ArrayList;
    import java.util.Iterator;
     
    import javax.swing.JPanel;
    import javax.swing.TransferHandler;
     
    public class DropZone extends JPanel{
    	public DropZone()	{
    		setTransferHandler(new DropTransfertHandler());
    		this.setBackground(Color.red);
    		setLayout(null);
    	}
    	public void insert(Composant c,Point p){
    		c.setBounds(p.x, p.y, c.longueur , c.largeur );
    		add(c,p.x,p.y);
    	}
    }
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  13. #53
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    peut etre le probleme est ailleurs je poste toutes mes classes llà tu procede par identification comme l'autre jour:
    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
     
    package monpackage;
    import java.awt.Dimension;
    import java.awt.Image;
    import java.io.Serializable;
    import javax.swing.JPanel;
     
    public class Composant extends JPanel implements Serializable,Cloneable{
    	private static final long serialVersionUID = 1L;
    	private String nom;
    	public int x;
    	public int y;
    	public Image image;
    	public int longueur;
    	public int largeur;
    	public Composant(String no,Image img)
    	{
    		this.nom=no;
    		this.image=img;
    		this.longueur=image.getWidth(null);
    		this.largeur=image.getHeight(null);
    		//setPreferredSize(new Dimension(longueur,largeur));
    	}
    	public String getName()
    	{
    		return nom;
    	}
    	public void setPositioon(int px,int py)
    	{
    		x=px;
    		y=py;
    	}
    	public Composant getClone(){
    		return this.getClone();
    	}
    }
    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
     
    package monpackage;
     
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.datatransfer.DataFlavor;
    import java.awt.datatransfer.Transferable;
    import java.awt.datatransfer.UnsupportedFlavorException;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Iterator;
     
    import javax.swing.JPanel;
    import javax.swing.TransferHandler;
     
    public class ComposantTransferable extends JPanel implements Transferable{
    private DataFlavor img=new DataFlavor("image/png",null);
    public Composant composant;
    public ComposantTransferable(Composant c)
    {
    composant=c;
     setTransferHandler(new ComposantTransfertHandler());
     addMouseListener(new DragAndDropListener());
     setPreferredSize(new Dimension(composant.longueur,composant.largeur));
    }
    public void paintComponent(Graphics g){
    		super.paintComponent(g);					
    		g.drawImage(composant.image, composant.x, composant.y,composant.longueur,composant.largeur,null);
    }
    	@Override
    	public Object getTransferData(DataFlavor arg0)
    			throws UnsupportedFlavorException, IOException {
    			if(ComposantFlavor.getComposantFlavor().equals(arg0))
    			{
    				return composant;
    			}
    			else throw new UnsupportedFlavorException(arg0);
    	}
     
    	@Override
    	public DataFlavor[] getTransferDataFlavors() {
    		ArrayList l= new ArrayList();
    		l.add(ComposantFlavor.getComposantFlavor());
    		l.add(img);
    		return (DataFlavor[]) l.toArray(new DataFlavor[l.size()]);
    	}
     
    	@Override
    	public boolean isDataFlavorSupported(DataFlavor arg0) {
    		return ComposantFlavor.getComposantFlavor().equals(arg0);
    	}
     
    }
    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
     
    package monpackage;
    import java.awt.datatransfer.Transferable;
    import javax.swing.JComponent;
    import javax.swing.TransferHandler;
     
    public class ComposantTransfertHandler extends TransferHandler{
        // ----------------- POUR LE DRAG ---------------------------------------------------------
     
        //  Indication du type de transfert : ici, on ne fait que de la copie (pas de déplacement)
        public int getSourceActions(JComponent c) {
            return COPY;
        }
     
        //  Cette méthode prépare l'objet à tranférer (objet qui doit implémenter Transferable)
        @Override
        public Transferable createTransferable(JComponent c) {
            return (Transferable) c;
        }
    }
    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
     
    package monpackage;
     
    import java.awt.datatransfer.DataFlavor;
     
     
    public class ComposantFlavor {
    	private static String mimeType = DataFlavor.javaJVMLocalObjectMimeType +
    			";class=" + Composant.class.getName();
    	private static DataFlavor composantFlavor= null;
    	public static DataFlavor getComposantFlavor()
    	{
            try {
                composantFlavor = new DataFlavor(mimeType);
            } catch (ClassNotFoundException e) { }
            return composantFlavor;
    	}
     
    }
    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
     
    package monpackage;
     
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
     
    import javax.swing.TransferHandler;
     
    public class DragAndDropListener extends MouseAdapter{
    	public void mousePressed(MouseEvent e){
    		ComposantTransferable ct=(ComposantTransferable)e.getSource();
    		ct.getTransferHandler().exportAsDrag(ct, e, TransferHandler.COPY);
    		e.consume();
    	}
     
    }
    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
     
    package monpackage;
    import java.awt.Point;
    import java.awt.datatransfer.DataFlavor;
    import java.awt.datatransfer.UnsupportedFlavorException;
    import java.io.IOException;
     
    import javax.swing.TransferHandler;
     
    public class DropTransfertHandler extends TransferHandler{
    	public boolean importData(TransferHandler.TransferSupport support){
    		  if(!canImport(support))
    			  return false;
    		ComposantTransferable comp = null;
    		try {
    			comp = (ComposantTransferable) support.getTransferable().getTransferData(ComposantFlavor.getComposantFlavor());
    		} catch (UnsupportedFlavorException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
                // création d'un nouveau composant à partir du clone
                Composant copie = comp.composant.getClone();
     
                //  recuperation de la drop-zone
                DropZone destination = (DropZone) support.getComponent();
     
                //  coordonnées du largage
                Point p = support.getDropLocation().getDropPoint();
                destination.insert(copie,p);
    		return true;
    	}
    	public boolean canImport(TransferHandler.TransferSupport info) {
    		  if (!info.isDataFlavorSupported(DataFlavor.imageFlavor)) {
    			   return false;
    		   }
    		   return true;
    		}
    }
    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
     
    package monpackage;
     
    import java.awt.Color;
    import java.awt.Graphics;
    import java.util.ArrayList;
    import java.util.Iterator;
     
    import javax.swing.JPanel;
     
    public class PanneauComposant extends JPanel{
    	ArrayList<ComposantTransferable> listecomp;
    	public PanneauComposant(){
    		listecomp=new ArrayList<>();
    		setBackground(Color.white);
     
    	}
    public void ajouterComposant(ComposantTransferable c){
    	listecomp.add(c);
    	for(Iterator<ComposantTransferable> it=listecomp.iterator();it.hasNext();)
    	{
    		ComposantTransferable ce=(ComposantTransferable)it.next();
    		ce.setBounds(ce.composant.x, ce.composant.y,ce.composant.longueur,ce.composant.largeur);
    		add(ce);
    	}
    }
    }
    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
     
    package monpackage;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Point;
    import java.awt.datatransfer.DataFlavor;
    import java.util.ArrayList;
    import java.util.Iterator;
     
    import javax.swing.JPanel;
    import javax.swing.TransferHandler;
     
    public class DropZone extends JPanel{
    	ArrayList<Composant> liste;
    	public DropZone()	{
    		setTransferHandler(new DropTransfertHandler());
    		this.setBackground(Color.red);
    		setLayout(null);
    		liste=new ArrayList<>();
    	}
    	public void insert(Composant c){
    		c.setBounds(p.x, p.y, c.longueur , c.largeur );
    		add(c,p.x,p.y);
    	}
     
    }
    En passant dans la classe droptransferthandler la methode canImport est avec i majuscule
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  14. #54
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    1) Dans le code que tu as posté, il est avec un "i" minuscule et donc ne peut pas fonctionner.
    2) Toujours dans canImport, tu utilises DataFlavor.imageFlavor et non pas ComposantFlavor.getComposantFlavor() donc ça ne pourra pas marcher
    3) La méthode clone dans la classe Composant ne peut pas fonctionner : tu renvoies l'objet lui-même ET PAS une copie (voir doc de clone) comme il faut le faire. Donc ça va planter

    Ces modifications devaient être faites.
    Tant que tu ne fais pas les modifications, on ne peut pas continuer.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  15. #55
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    bon la j'ai essayer de modifier le classe dropzone et droptransferthandler pour qu'ils puissent afficher le composant qui est drop. voila les codes:
    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
     
    package monpackage;
    import java.awt.Point;
    import java.awt.datatransfer.DataFlavor;
    import java.awt.datatransfer.UnsupportedFlavorException;
    import java.io.IOException;
     
    import javax.swing.TransferHandler;
     
    public class DropTransfertHandler extends TransferHandler{
    	public boolean importData(TransferHandler.TransferSupport support){
    		  if(!canImport(support))
    			  return false;
    		ComposantTransferable comp = null;
    		try {
    			comp = (ComposantTransferable) support.getTransferable().getTransferData(ComposantFlavor.getComposantFlavor());
    		} catch (UnsupportedFlavorException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
                // création d'un nouveau composant à partir du clone
                Composant copie = new Composant(comp.composant.nom, comp.composant.image);
     
                //  recuperation de la drop-zone
                DropZone destination = (DropZone) support.getComponent();
     
                //  coordonnées du largage
                Point p = support.getDropLocation().getDropPoint();
     
                copie.x=p.x;
                copie.y=p.y;
     
                destination.insert(copie);
    		return true;
    	}
    	public boolean canImport(TransferHandler.TransferSupport info) {
    		  if (!info.isDataFlavorSupported(ComposantFlavor.getComposantFlavor())) {
    			   return false;
    		   }
    		   return true;
    		}
    }
    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
     
    package monpackage;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Point;
    import java.awt.datatransfer.DataFlavor;
    import java.util.ArrayList;
    import java.util.Iterator;
     
    import javax.swing.JPanel;
    import javax.swing.TransferHandler;
     
    public class DropZone extends JPanel{
    	ArrayList<Composant> liste;
    	public DropZone()	{
    		setTransferHandler(new DropTransfertHandler());
    		//this.setBackground(Color.red);
    		setLayout(null);
    		liste=new ArrayList<>();
    	}
    	public void insert(Composant c){
    		liste.add(c);
    		repaint();
    	}
    	public void paintComponent(Graphics g){
    		super.paintComponent(g);
    		for(Iterator<Composant> it=liste.iterator();it.hasNext();)
    		{
    			Composant ce=(Composant)it.next();
    			g.drawImage(ce.image,ce.x,ce.y,ce.longueur,ce.largeur,null);
    		}
    	}
    }
    et j'ai ajouté ceci dans Composant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setPreferredSize(new Dimension(longueur,largeur));
    dans le constructeur mais le composant ne s'affiche pas dans le dropzone après le drop
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  16. #56
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    une fois de plus je ne sais pas pourquoi le i de canimport est en minuscule pourtant il est en majuscule dans mon code. De plus lorsque je fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Image image = ImageIO.read(Acceuil.class.getResource("/composants/lignes.png"));
    Composant c =new Composant("texte",image);
    dz.insert(c);
    le composant j'ajoute bien donc je pense que le problème se situe au niveau du importData du droptransferthandler. remarque: le dropzone accepte bien le drop c'est le transfert qui pose problème.
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  17. #57
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    J'ai du mal à comprendre.
    Tu dis que dans ton IDE le "i" est en majuscule et que lorsque tu le postes sur developpez.net il passe en minuscule ?

    Ajoute le code en rouge à ton DropTransfertHandler de la façon suivante :

    1) test de déclenchement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        @Override       // vérifie la bonne redéfinition de la méthode
        public boolean importData(TransferHandler.TransferSupport support) {
            try {
                if (!canImport(support)) {
                    return false;
                }
                System.out.println("importData déclenché");    //  nous dira si la méthode est déclenchée et qu'elle passe le test canImport
    2) vérification de la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        @Override       // vérifie la bonne redéfinition de la méthode
        public boolean canImport(TransferHandler.TransferSupport info) {
            if (!info.isDataFlavorSupported(ComposantFlavor.getComposantFlavor())) {
                return false;
            }
            System.out.println("canImport déclenché");    //  nous dira si la méthode est déclenchée
            return true;
        }
    Si ça plante à la compilation c'est que canImport n'est pas bien écrit
    Si ce point n'est pas réglé, le importData ne se déclenche pas


    j'ai besoin de savoir
    :
    - quel est ton IDE (NetBeans, Eclipse, ...) ?
    - quelle version de Java utilises-tu ?

    .
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  18. #58
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    j'ai fait comme tu m'a dit et lorsque j’exécute et que je fait mon drag et que je suis sur le dropzone, le message écrit dans canImportData est affiché et lorsque je fais le drop le message qui est dans le importData s'affiche et sa ne plante pas en effet je pense que les 2 méthodes sont utilisées et que le problème réside dans la récupération du composant qui st dragé. De plus j'utilise eclipse et jdk dans sa version 1.7
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  19. #59
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    Alors c'est bon, on peut y aller :

    La guerre des clones

    tu ne peux pas récupérer ton composant car tu utilises une méthode clone qui ne marche pas
    (je te l'avais déjà dis )

    tu as écris dans ta classe Composant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	public Composant getClone(){
    		return this.getClone();
    	}
    ceci ne crée EN AUCUN CAS une copie mais renvoie l'objet lui-même (avec une boucle infinie par dessus le marché)

    Remplace-moi cette horreur par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        public Composant getClone() {
            Composant c = new Composant(nom, image);
            return c;
        };
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  20. #60
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    j'ai fais comme tu as dit et le problème se situe au niveau du drop car je n'arrive pas a recuperer le composant qui est porté voila donc le nouveau code:
    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
     
    package monpackage;
    import java.awt.Point;
    import java.awt.datatransfer.UnsupportedFlavorException;
    import java.io.IOException;
     
    import javax.swing.TransferHandler;
     
    public class DropTransfertHandler extends TransferHandler{
    	public boolean importData(TransferHandler.TransferSupport support){
    		  if(!canImport(support))
    			  return false;
    		  ComposantTransferable comp = null;
    		try {
    			comp = (ComposantTransferable) support.getTransferable().getTransferData(ComposantFlavor.getComposantFlavor());
    		} catch (UnsupportedFlavorException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
                // création d'un nouveau composant à partir du clone
                Composant copie = comp.composant.getClone();
     
                //  recuperation de la drop-zone
                DropZone destination = (DropZone) support.getComponent();
     
                //  coordonnées du largage
                Point p = support.getDropLocation().getDropPoint();
     
                copie.x=p.x;
                copie.y=p.y;
                System.out.print("vous avez collé "+copie.nom);
                destination.insert(copie);
    		return true;
    	}
    	public boolean canImport(TransferHandler.TransferSupport info) {
    		  if (!info.isDataFlavorSupported(ComposantFlavor.getComposantFlavor())) {
    			   return false;
    		   }
    		   return true;
    		}
    }
    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
     
    package monpackage;
    import java.awt.Dimension;
    import java.awt.Image;
    import java.io.Serializable;
    import javax.swing.JPanel;
     
    public class Composant extends JPanel implements Serializable,Cloneable{
    	private static final long serialVersionUID = 1L;
    	public String nom;
    	public int x;
    	public int y;
    	public Image image;
    	public int longueur;
    	public int largeur;
    	public Composant(String no,Image img)
    	{
    		this.nom=no;
    		this.image=img;
    		this.longueur=image.getWidth(null);
    		this.largeur=image.getHeight(null);
    		setPreferredSize(new Dimension(longueur,largeur));
    	}
    	public String getName()
    	{
    		return nom;
    	}
    	public void setPositioon(int px,int py)
    	{
    		x=px;
    		y=py;
    	}
    	public Composant getClone(){
    		//return this.getClone();
    		Composant c=new Composant(nom, image);
    		return c;
    	}
    }
    de plus le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                System.out.print("vous avez collé "+copie.nom);
    ne s'affiche pas lors du drop
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 9 PremièrePremière 1234567 ... DernièreDernière

Discussions similaires

  1. Problème d'affichage d'un JPanel dans un JFrame.
    Par Patrick95500 dans le forum Agents de placement/Fenêtres
    Réponses: 8
    Dernier message: 18/09/2014, 13h51
  2. Affichage d'un JLabel dans une JFrame
    Par Christophe39 dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 17/02/2014, 13h41
  3. Affichage de différents JPanel dans une JFrame
    Par PROJECT-AURORA dans le forum Débuter
    Réponses: 13
    Dernier message: 16/11/2013, 11h22
  4. Ajout et affichage d'un JPanel dans une JFrame lorsqu'un évènement se produit
    Par bilou_12 dans le forum Agents de placement/Fenêtres
    Réponses: 0
    Dernier message: 27/03/2012, 20h27
  5. [pdf][jframe] affichage d'un PDF dans un JFrame
    Par r.matha dans le forum Documents
    Réponses: 3
    Dernier message: 06/10/2006, 15h00

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