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

2D Java Discussion :

drag and drop depuis JTree, image du noeud


Sujet :

2D Java

Vue hybride

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

    Informations forums :
    Inscription : Février 2009
    Messages : 25
    Par défaut drag and drop depuis JTree, image du noeud
    Bonjour,

    J'ai un JTree auquel j'aimerai ajouter une possibilite de drag and drop. Je precise que les donnees ne sont pas droppe sur le JTree mais dans un panel voisin. Pour l'instant cela fonctionne bien mais j'aimerai maintenant ajouter une image du noeud qui suit la souris vers le point de drop, afin que l'utilisateur comprenne ce qu'il est en train de faire.
    J'ai suivi ce tutoriel http://gfx.developpez.com/tutoriel/java/swing/drag/

    et cela fonctionne pour d'autre composant mais pas avec le JTree, l'image ghost se bloque et ne suit pas la souris.

    Est-ce que quelqu'un a deja fait ce genre de chose sur un arbre et pourrait m'aider?

    merci

  2. #2
    Nouveau candidat au Club
    Inscrit en
    Juin 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 2
    Par défaut
    Personnellement je les fait entre 2 JTree. J'ai modifié un peut mon code mais je ne l'est pas testé

    dragGestureRecognized est appeler quand tu commence un drag sur un noeud ou une leaf

    dragOver est appelé temps que tu reste au dessus de la zone de drag (c'est la qu'on redessine l'image de l'item sélectionné ( normalement elle ne se bloquera plus)

    Je suis pas un pro en java ce code est loin d'être parfait mais peut peut-être te débloquer.

    il faudra rajouter le code pour redessiner l'image dans la méthode dragOver de ton pannel.


    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
    import java.awt.AlphaComposite;
    import java.awt.Color;
    import java.awt.Cursor;
    import java.awt.GradientPaint;
    import java.awt.Graphics2D;
    import java.awt.Point;
    import java.awt.Rectangle;
    import java.awt.SystemColor;
    import java.awt.datatransfer.Transferable;
    import java.awt.dnd.DnDConstants;
    import java.awt.dnd.DragGestureEvent;
    import java.awt.dnd.DragGestureListener;
    import java.awt.dnd.DragSource;
    import java.awt.dnd.DragSourceDragEvent;
    import java.awt.dnd.DragSourceDropEvent;
    import java.awt.dnd.DragSourceEvent;
    import java.awt.dnd.DragSourceListener;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.geom.AffineTransform;
    import java.awt.geom.Rectangle2D;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.HashMap;
     
    import javax.swing.Icon;
    import javax.swing.JLabel;
    import javax.swing.JMenuItem;
    import javax.swing.JOptionPane;
    import javax.swing.JPopupMenu;
    import javax.swing.JTree;
    import javax.swing.event.TreeExpansionEvent;
    import javax.swing.event.TreeWillExpandListener;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeModel;
    import javax.swing.tree.ExpandVetoException;
    import javax.swing.tree.TreePath;
    import javax.swing.tree.TreeSelectionModel;
     
    public class DeviceExplorer extends JTree implements DragSourceListener,DragGestureListener,TreeWillExpandListener {
     
    	boolean newDrag=false;
    	private Rectangle2D 	_raGhost		= new Rectangle2D.Float();	
    	BufferedImage imgGhost;					
    	Point ptOffset = new Point();
     
     
    	public DeviceExplorer() {
    	DragSource dragSource = DragSource.getDefaultDragSource();
    		dragSource.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY_OR_MOVE,this);	
    	}
     
    	public void dragGestureRecognized(DragGestureEvent e){
    		Point ptDragOrigin = e.getDragOrigin();
    		TreePath path = getPathForLocation(ptDragOrigin.x, ptDragOrigin.y);
    		newDrag=true;
    		if (path == null)
    			return;
    		if (isRootPath(path))
    			return;	//On ne peut pas drag le root
     
    		Rectangle raPath = getPathBounds(path);
    		ptOffset.setLocation(ptDragOrigin.x-raPath.x, ptDragOrigin.y-raPath.y);
     
    		//On recupére l'image du dossier ou du fichier qu'on drag
    		JLabel lbl = (JLabel) getCellRenderer().getTreeCellRendererComponent(
    									this, 											
    									path.getLastPathComponent(),					
    									false,											
    									isExpanded(path), 								
    									getModel().isLeaf(path.getLastPathComponent()), 
    									0, 												
    									false								
    								);
    		lbl.setSize((int)raPath.getWidth(), (int)raPath.getHeight());
     
    		imgGhost = new BufferedImage((int)raPath.getWidth(), (int)raPath.getHeight(), BufferedImage.TYPE_INT_ARGB_PRE);
    		Graphics2D g2 = imgGhost.createGraphics();
     
    		g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, 0.5f));
    		lbl.paint(g2);
     
    		Icon icon = lbl.getIcon();
    		int nStartOfText = (icon == null) ? 0 : icon.getIconWidth()+lbl.getIconTextGap();
    		g2.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_OVER, 0.5f));	
    		g2.setPaint(new GradientPaint(nStartOfText,	0, SystemColor.controlShadow, getWidth(),	0, new Color(255,255,255,0)));
    		g2.fillRect(nStartOfText, 0, getWidth(), imgGhost.getHeight());
     
    		g2.dispose();
     
    		setSelectionPath(path);	
    		System.out.println("DRAGGING: "+path.getLastPathComponent());
     
    		Transferable transferable = new CTransferableTreePath(path);		
    		e.startDrag(null, imgGhost, new Point(5,5), transferable, this);
    	}	
     
    	public void dragEnter(DragSourceDragEvent e){}	
     
    	public void dragOver(DragSourceDragEvent e){
    		Point pt = e.getLocation();
     
    		if(!pt.equals(lastpt){ // Si la souris a bougé on redessiné l'image du drag
    			lastpt=pt;
    			Graphics2D g2 = (Graphics2D) getGraphics();
    			if (!DragSource.isDragImageSupported()){
    				paintImmediately(_raGhost.getBounds());		
    				_raGhost.setRect( (pt.x), (pt.y),imgGhost.getWidth(), imgGhost.getHeight());
    				g2.drawImage(imgGhost, AffineTransform.getTranslateInstance(_raGhost.getX(), _raGhost.getY()), null);	
    			}
    		}
    	}	
    	public void dragExit(DragSourceEvent e){}	
    	public void dropActionChanged(DragSourceDragEvent e){}	
    	public void dragDropEnd(DragSourceDropEvent e){}

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

    Informations forums :
    Inscription : Février 2009
    Messages : 25
    Par défaut
    Merci pour la reponse. Desolee de repondre si tard mais j'etais occupee sur autre chose. En fait la solution etait tres simple, comme j'avais defini une droptarget pour mon panel, j'ai juste eu a surcharger la methode dragOver de ma droptarget.
    J'ai quand meme essaye ton code mais ca n'a pas fonctionne, il n'y a pas eu d'erreur mais aucune image n'a ete dessinee. Je l'ai peut etre mal adapte au mien qui sait.
    En tout cas merci.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 18/12/2007, 09h16
  2. Drag and Drop depuis le système
    Par Kh4iN3 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 11/02/2007, 20h49
  3. drag and drop d'une image d'une page web lancée depuis un webbroswer
    Par chrisledeveloppeur2 dans le forum Web & réseau
    Réponses: 3
    Dernier message: 02/01/2007, 15h33
  4. Drag and Drop depuis une JList
    Par vic dans le forum Composants
    Réponses: 1
    Dernier message: 25/09/2006, 01h22
  5. Faire un drag and drop depuis IE vers un TListView
    Par ALEX77 dans le forum Composants VCL
    Réponses: 8
    Dernier message: 11/11/2004, 15h27

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