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 :

Drag n Drop de JButton


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 13
    Par défaut Drag n Drop de JButton
    Bonjour, j'ai pour projet de faire un jeu de role en java,
    j'aurai besoin de placer une barre d'action rapide qui
    permettra par exemple de dragger un sort ou une arme
    vers la barre d'action rapide. Je voudrai utiliser pour ça des
    jbutton. Apres un drag les jbuttons arrive bien dans la
    nouvelle fenêtre mais
    1°) il garde l'aspect enfoncé
    2°) Le jbutton de la fenetre d'origine du drag semblerai
    avoir été enlevé

  2. #2
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 13
    Par défaut
    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
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
     
    import javax.swing.*;
    import java.awt.*;
    import javax.swing.event.*;
    import java.awt.event.MouseEvent;
    import java.awt.datatransfer.*;
    import java.io.IOException;
     
    public class TestDnD {
     
    	public JFrame maf;
    	public static DataFlavor BouttonDraggableFlavor;
    	/*Ce dataFlavor est celui d'un objet jbutton qui
    	 * implémente Transferable
    	 */
    	public static void main(String[] args) throws Exception {
    		new TestDnD();
    	}
     
    	public TestDnD() {
    		initialize();
    	}
     
    	public void initialize() {	
    		maf = new JFrame();
    		maf.getContentPane().setLayout(null);
     
    		/*Je crée une jinternalframesource qui contient le jbutton
    		 * que l'on drag de la jinternalframesource
    		 * vers la jinternalframecible.
    		 * BouttonDraggable est un "Tranferable",l'idée est
    		 * de transferer une instance de BouttonDraggable
    		 * dans le jinternalframesource qui ajoutera ce jbutton,
    		 * le jbutton et le jinternalframesource possede tous deux
    		 * un TransferHandler qui leur est propre
    		 */
    		JInternalFrame jinternalFrameSource = new JInternalFrame();
     
    		jinternalFrameSource.setBounds(new Rectangle(0,0,120,120));
    		jinternalFrameSource.getContentPane().setLayout(null);
    		BouttonDraggable jb = new BouttonDraggable("Dragme");
    		jb.setBounds(new Rectangle(0,0,80,80));
    		jinternalFrameSource.getContentPane().add(jb);
    		jinternalFrameSource.setVisible(true);
     
    		JInternalFrame jinternalFrameCible = new JInternalFrame();
     
    		jinternalFrameCible.setTransferHandler
    			(new DropDansJInternalFrameHandler(jinternalFrameCible));
    		jinternalFrameCible.setBounds(new Rectangle(120,0,120,120));
    		jinternalFrameCible.getContentPane().setLayout(null);
    		jinternalFrameCible.setVisible(true);
     
    		maf.getContentPane().setSize(300,300);
    		maf.getContentPane().add(jinternalFrameSource);
    		maf.getContentPane().add(jinternalFrameCible);
     
    		maf.setSize(300, 300);
    		maf.setTitle("test");
    		maf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		maf.setVisible(true);
    	}
     
    	public class BouttonDraggable extends JButton implements Transferable {
     
    		static final long serialVersionUID = 1;
     
    		public BouttonDraggable (String s) {
    			super(s);
    			setTransferHandler(new DragBouttonHandler(this));
    			DeplacementAdapter listener = new DeplacementAdapter();
    			addMouseListener(listener);
    			/*Ne me demandez pas d'expliquer ce try catch
    			 * c'est trop fort pour moi, c'est censé crée un DataFlavor
    			 * qui correspond à l'objet BouttonDraggable
    			 */
    			try{
    				String MIME = DataFlavor.javaJVMLocalObjectMimeType +
    					";class=" + BouttonDraggable.class.getName();
    				BouttonDraggableFlavor = new DataFlavor(MIME);
    			} catch (ClassNotFoundException e){}
    		}
     
    		public Object getTransferData(DataFlavor flavor) {
    			/*Les données à transferer sont un BouttonDraggable d'ou le this*/
    			return (flavor == BouttonDraggableFlavor) ? this : null;
    		}
     
    		public boolean isDataFlavorSupported(DataFlavor flavor){
    			return (flavor == BouttonDraggableFlavor);
    		}
     
    		public DataFlavor[] getTransferDataFlavors() {
    			DataFlavor[] dataFlavor = new DataFlavor[1];
    			dataFlavor[0] = BouttonDraggableFlavor;
    			return dataFlavor;
    		}
     
    		public class DeplacementAdapter extends MouseInputAdapter{
     
    			public void mousePressed(MouseEvent e) {
    				JComponent c = (JComponent) e.getSource();
    				TransferHandler th = c.getTransferHandler();
    				/*exportAsDrag pour gerer un mouvement de drag*/
    				th.exportAsDrag(c, e, TransferHandler.COPY);
    				System.out.println("bouton pressé");
    				maf.repaint();
    				e.consume();
    			}
    		}
     
    		public class DragBouttonHandler extends TransferHandler {
     
    			static final long serialVersionUID = 1;
     
    			public BouttonDraggable monBouttonDraggable;
     
    			public DragBouttonHandler(BouttonDraggable jb){
    				monBouttonDraggable = jb;
    			}
     
    			public int getSourceActions(JComponent c){
    			/*Ici on spécifie que l'on veut copier ce que l'on drag
    			 * en principe parce que dans la pratique il semblerait
    			 * que cela coupe
    			 */
    				return TransferHandler.COPY;
    			}
     
    			public Transferable createTransferable(JComponent component){
    				System.out.println("transferable creer");
    				/*L'objet Transferable que le veut transferer
    				 * est le bouttonDraggable
    				 */
    				return  monBouttonDraggable;
    			}
    		}
    	}
     
    	public class DropDansJInternalFrameHandler extends TransferHandler {
    		/*Ce transfert Handler va gérer le drop du
    		 * jbutton dans le jinternalframe
    		 */
    		static final long serialVersionUID = 1;
     
    		public JInternalFrame maJInternalFrame;
     
    		public DropDansJInternalFrameHandler(JInternalFrame ji){
    			maJInternalFrame = ji;
    		}
     
    		public boolean canImport(JComponent comp, DataFlavor flavor[]){
    			/*On vérifie que le type de donné droppé
    			 * est bien celui du bouttondraggable
    			 */
    			return (flavor[0] == TestDnD.BouttonDraggableFlavor);
    		}
     
    		public boolean importData(JComponent component, Transferable transferable){
    			try{
    				if(transferable.isDataFlavorSupported
    						(TestDnD.BouttonDraggableFlavor)){
    					/*On récupere le jbutton et on l'ajoute
    					 * à la jinternalframesource
    					 */
    					BouttonDraggable bd = (BouttonDraggable)
    						transferable.getTransferData
    						(TestDnD.BouttonDraggableFlavor);
    					maJInternalFrame.add(bd);
    					maJInternalFrame.revalidate();
    					maJInternalFrame.repaint();
    					maf.repaint();
    					return true;
    				}
    			}catch (UnsupportedFlavorException e){
    				System.out.println("flavorerror");
    			}
    			catch(IOException e){System.out.println("ioerror");}
    			System.out.println("flavor pas supporter");
    			return false;
    		}
    	}
    }

  3. #3
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 13
    Par défaut
    Bon ben merci moi jai résolu une partie du problème.
    il faut modifier une methode pour que une copie soit transféré et non pas
    une référence (si j'ai bien compris), et BouttonDraggable doit
    implementer Cloneable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public Object getTransferData(DataFlavor flavor) {
    			try{
    			BouttonDraggable bd = (BouttonDraggable)this.clone();
    			return (flavor == BouttonDraggableFlavor) ? bd : null;
    			}catch(CloneNotSupportedException e){System.out.println("clone impossible");}
    			return null;
    		}

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

Discussions similaires

  1. Drag and drop "de l'extérieur"
    Par Invité dans le forum C++Builder
    Réponses: 12
    Dernier message: 31/03/2020, 10h10
  2. Réponses: 0
    Dernier message: 12/05/2015, 20h17
  3. [JSP][DRAG AND DROP]
    Par hamed dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 23/01/2004, 17h36
  4. drag and drop
    Par jujuesteban dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/06/2003, 09h23

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