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;
}
}
} |
Partager