java - move component after drag and drop -


i've seen code of drag , drop .

question1: how can move image inside dropped panel (using mouse pointer) after image dropped. (destination of image, want where release mouse. , change location (using mouse better. or using buttons - using mouse better)

question2: how can change location after dropping end?

p.s want here image component.

first drag , drop component. change location using mouse pointer (move it).

here code:

import java.awt.borderlayout; import java.awt.eventqueue; import java.awt.gridbaglayout; import java.awt.datatransfer.dataflavor; import java.awt.datatransfer.transferable; import java.awt.datatransfer.unsupportedflavorexception; import java.awt.dnd.dndconstants; import java.awt.dnd.draggestureevent; import java.awt.dnd.draggesturelistener; import java.awt.dnd.draggesturerecognizer; 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.dnd.droptarget; import java.awt.dnd.droptargetdragevent; import java.awt.dnd.droptargetdropevent; import java.awt.dnd.droptargetevent; import java.awt.dnd.droptargetlistener; import java.io.ioexception; import javax.swing.defaultlistmodel; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jlist; import javax.swing.jpanel; import javax.swing.jscrollpane; import javax.swing.uimanager; import javax.swing.unsupportedlookandfeelexception;  public class testdnd {      public static void main(string[] args) {         new testdnd();     }      public testdnd() {         eventqueue.invokelater(new runnable() {             @override             public void run() {                 try {                     uimanager.setlookandfeel(uimanager.getsystemlookandfeelclassname());                 } catch (classnotfoundexception ex) {                 } catch (instantiationexception ex) {                 } catch (illegalaccessexception ex) {                 } catch (unsupportedlookandfeelexception ex) {                 }                  jframe frame = new jframe("test");                 frame.setdefaultcloseoperation(jframe.exit_on_close);                 frame.setlayout(new borderlayout());                 frame.add(new testpane());                 frame.pack();                 frame.setlocationrelativeto(null);                 frame.setvisible(true);             }          });     }      public class testpane extends jpanel {          private jlist list;          public testpane() {             setlayout(new borderlayout());             list = new jlist();             defaultlistmodel model = new defaultlistmodel();             model.addelement(new user("shaun"));             model.addelement(new user("andy"));             model.addelement(new user("luke"));             model.addelement(new user("han"));             model.addelement(new user("liea"));             model.addelement(new user("yoda"));             list.setmodel(model);             add(new jscrollpane(list), borderlayout.west);              draggesturerecognizer dgr = dragsource.getdefaultdragsource().createdefaultdraggesturerecognizer(                             list,                             dndconstants.action_copy_or_move,                             new draggesturehandler(list));              jpanel panel = new jpanel(new gridbaglayout());             add(panel);              droptarget dt = new droptarget(                             panel,                             dndconstants.action_copy_or_move,                             new droptargethandler(panel),                             true);            }      }      public static class user {          private string name;                  public user(string name) {             this.name = name;         }          public string getname() {             return name;         }          @override         public string tostring() {             return name;         }      }      public static class usertransferable implements transferable {          public static final dataflavor user_data_flavor = new dataflavor(user.class, "user");         private user user;          public usertransferable(user user) {             this.user = user;         }          @override         public dataflavor[] gettransferdataflavors() {             return new dataflavor[]{user_data_flavor};         }          @override         public boolean isdataflavorsupported(dataflavor flavor) {             return user_data_flavor.equals(flavor);         }          @override         public object gettransferdata(dataflavor flavor) throws unsupportedflavorexception, ioexception {             object value = null;             if (user_data_flavor.equals(flavor)) {                 value = user;             } else {                 throw new unsupportedflavorexception(flavor);             }             return value;         }      }      protected class draggesturehandler implements draggesturelistener {          private jlist list;          public draggesturehandler(jlist list) {             this.list = list;         }          @override         public void draggesturerecognized(draggestureevent dge) {             object selectedvalue = list.getselectedvalue();             if (selectedvalue instanceof user) {                 user user = (user) selectedvalue;                  transferable t = new usertransferable(user);                 dragsource ds = dge.getdragsource();                 ds.startdrag(dge, null, t, new dragsourcehandler());             }          }      }      protected class dragsourcehandler implements dragsourcelistener {          public void dragenter(dragsourcedragevent dsde) {         }          public void dragover(dragsourcedragevent dsde) {         }          public void dropactionchanged(dragsourcedragevent dsde) {         }          public void dragexit(dragsourceevent dse) {         }          public void dragdropend(dragsourcedropevent dsde) {              system.out.println("drag ended...");          }      }      protected class droptargethandler implements droptargetlistener {          private jpanel panel;          public droptargethandler(jpanel panel) {             this.panel = panel;         }          public void dragenter(droptargetdragevent dtde) {             if (dtde.gettransferable().isdataflavorsupported(usertransferable.user_data_flavor)) {                 system.out.println("accept...");                 dtde.acceptdrag(dndconstants.action_copy_or_move);             } else {                 system.out.println("drag...");                 dtde.rejectdrag();             }         }          public void dragover(droptargetdragevent dtde) {         }          public void dropactionchanged(droptargetdragevent dtde) {         }          public void dragexit(droptargetevent dte) {         }          public void drop(droptargetdropevent dtde) {             system.out.println("dropped...");             if (dtde.gettransferable().isdataflavorsupported(usertransferable.user_data_flavor)) {                 transferable t = dtde.gettransferable();                 if (t.isdataflavorsupported(usertransferable.user_data_flavor)) {                     try {                         object transferdata = t.gettransferdata(usertransferable.user_data_flavor);                         if (transferdata instanceof user) {                             user user = (user) transferdata;                             dtde.acceptdrop(dndconstants.action_copy_or_move);                             panel.add(new jlabel(user.getname()));                             panel.revalidate();                             panel.repaint();                         } else {                             dtde.rejectdrop();                         }                     } catch (unsupportedflavorexception ex) {                         ex.printstacktrace();                         dtde.rejectdrop();                     } catch (ioexception ex) {                         ex.printstacktrace();                         dtde.rejectdrop();                     }                 } else {                     dtde.rejectdrop();                 }             }         }      } 

}

this implementation of dragging, essentially, images between 2 panes.

if you're going throw in restriction of not allowing movement of components, going stuck ensure source , target containers know how handle drag , drop (and render results)

this has taken better part 4 hours, before hammer me update requests, make sure you've made effort understand code , implemented own changes

the implementation wraps image in dragimage class, maintains information image's location within container, used produce drag image...

import java.awt.alphacomposite; import java.awt.color; import java.awt.dimension; import java.awt.eventqueue; import java.awt.graphics; import java.awt.graphics2d; import java.awt.gridlayout; import java.awt.image; import java.awt.point; import java.awt.rectangle; import java.awt.datatransfer.dataflavor; import java.awt.datatransfer.transferable; import java.awt.datatransfer.unsupportedflavorexception; import java.awt.dnd.dndconstants; import java.awt.dnd.draggestureevent; import java.awt.dnd.draggesturelistener; import java.awt.dnd.draggesturerecognizer; 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.dnd.droptarget; import java.awt.dnd.droptargetdragevent; import java.awt.dnd.droptargetdropevent; import java.awt.dnd.droptargetevent; import java.awt.dnd.droptargetlistener; import java.awt.image.bufferedimage; import java.io.file; import java.io.ioexception; import java.util.arraylist; import java.util.arrays; import java.util.list; import javax.imageio.imageio; import javax.swing.jcomponent; import javax.swing.jframe; import javax.swing.jpanel; import javax.swing.uimanager; import javax.swing.unsupportedlookandfeelexception; import javax.swing.border.emptyborder; import javax.swing.border.lineborder;  public class testdnd {      public static void main(string[] args) {         new testdnd();     }      public testdnd() {         eventqueue.invokelater(new runnable() {             @override             public void run() {                 try {                     try {                         uimanager.setlookandfeel(uimanager.getsystemlookandfeelclassname());                     } catch (classnotfoundexception ex) {                     } catch (instantiationexception ex) {                     } catch (illegalaccessexception ex) {                     } catch (unsupportedlookandfeelexception ex) {                     }                      jframe frame = new jframe("test");                     frame.setdefaultcloseoperation(jframe.exit_on_close);                     frame.setlayout(new gridlayout(0, 2, 10, 10));                     ((jcomponent) frame.getcontentpane()).setborder(new emptyborder(10, 10, 10, 10));                      bufferedimage img = imageio.read(new file("issue376.jpg"));                     imagepane imagepane = new imagepane();                     imagepane.addimage(img);                      frame.add(imagepane);                     frame.add(new imagepane());                     frame.pack();                     frame.setlocationrelativeto(null);                     frame.setvisible(true);                 } catch (ioexception ex) {                     ex.printstacktrace();                     system.exit(0);                 }             }          });     }      public class imagepane extends jpanel {          private list<dragimage> images;         private dragimages dropimages;         private point dragpoint;          public imagepane() {             setborder(new lineborder(color.gray));             images = new arraylist<>(25);              draggesturerecognizer dgr = dragsource.getdefaultdragsource().createdefaultdraggesturerecognizer(                             this,                             dndconstants.action_copy_or_move,                             new draggesturehandler(this));              droptarget dt = new droptarget(                             this,                             dndconstants.action_copy_or_move,                             new droptargethandler(this),                             true);         }          @override         public dimension getpreferredsize() {             return new dimension(200, 200);         }          public dragimage getimageat(point p) {             dragimage @ = null;             (dragimage di : images) {                 if (di.contains(p)) {                     @ = di;                     break;                 }             }             return at;         }          protected boolean contains(image image) {             boolean contains = false;             (dragimage di : images) {                 if (di.getimage() == image) {                     contains = true;                     break;                 }             }             return contains;         }          public void addimage(image image) {             if (image != null) {                 if (!contains(image)) {                     int x = (int) math.round(math.random() * getwidth());                     int y = (int) math.round(math.random() * getheight());                     addimageat(new point(x, y), image);                 }             }         }          public void addimageat(point p, image image) {             if (p != null && image != null) {                 if (!contains(image)) {                     dragimage di = new dragimage(image, p);                     images.add(di);                     repaint();                 }             }         }          @override         protected void paintcomponent(graphics g) {             super.paintcomponent(g);             graphics2d g2d = (graphics2d) g.create();             (dragimage di : images) {                 g2d.drawimage(di.getimage(), di.getlocation().x, di.getlocation().y, this);             }             if (dropimages != null) {                 g2d.setcomposite(alphacomposite.srcover.derive(0.5f));                 point offset = dropimages.getoffset();                 (dragimage di : dropimages.getimages()) {                     point pp = new point(dragpoint);                     pp.x -= offset.getx();                     pp.y -= offset.gety();                     g2d.drawimage(di.getimage(), pp.x, pp.y, this);                 }             }             g2d.dispose();         }          public void removeimages(list list) {             if (list != null && list.size() > 0) {                 (object obj : list) {                     if (obj instanceof dragimage) {                         removeimage((dragimage) obj);                     }                 }             }         }          public void removeimage(dragimage img) {             images.remove(img);             repaint();         }          protected void setdragimages(dragimages dragimages) {             this.dropimages = dragimages;             repaint();         }          public void addimagesat(point location, list images) {             if (images != null && images.size() > 0) {                 (object obj : images) {                     if (obj instanceof image) {                         image img = (image) obj;                         addimageat(location, img);                         location.x += 10;                         location.y += 10;                         if (location.x >= getwidth()) {                             location.x = 0;                         }                         if (location.y >= getheight()) {                             location.y = 0;                         }                     }                 }             }         }          protected void addimages(dragimages dragimages) {             (dragimage di : dragimages.getimages()) {                 images.add(di);             }             repaint();         }          protected void addimagesat(point droppoint, dragimages dragimages) {             point offset = dragimages.getoffset();             (dragimage di : dragimages.getimages()) {                 point p = di.getlocation();                 p.x = droppoint.x - offset.x;                 p.y = droppoint.y - offset.y;                 images.add(di);             }             repaint();         }          protected void setdragpoint(point location) {             dragpoint = location;             repaint();         }      }      public static class imagetransferable implements transferable {          public static final dataflavor drag_image_data_flavor = new dataflavor(list.class, "images");         private dragimages dragimages;          public imagetransferable(dragimages dragimages) {             this.dragimages = dragimages;         }          @override         public dataflavor[] gettransferdataflavors() {             return new dataflavor[]{drag_image_data_flavor};         }          @override         public boolean isdataflavorsupported(dataflavor flavor) {             return drag_image_data_flavor.equals(flavor);         }          @override         public object gettransferdata(dataflavor flavor) throws unsupportedflavorexception, ioexception {             return dragimages;         }      }      public class dragimage {          private image image;         private point p;          public dragimage(image image, point p) {             this.image = image;             this.p = p;         }          public image getimage() {             return image;         }          public point getlocation() {             return p;         }          public dimension getsize() {             return new dimension(image.getwidth(null), image.getheight(null));         }          public boolean contains(point p) {             return new rectangle(getlocation(), getsize()).contains(p);         }      }      public class dragimages {          private point offset;         private list<dragimage> images;          public dragimages(point offset, dragimage... images) {             this.offset = offset;             this.images = arrays.aslist(images);         }          public point getoffset() {             return offset;         }          public list<dragimage> getimages() {             return images;         }      }      protected class draggesturehandler implements draggesturelistener {          private imagepane imagepane;          public draggesturehandler(imagepane list) {             this.imagepane = list;         }          @override         public void draggesturerecognized(draggestureevent dge) {             dragimage di = imagepane.getimageat(dge.getdragorigin());             if (di != null) {                 point origin = dge.getdragorigin();                 point p = new point();                 p.x = origin.x - di.getlocation().x;                 p.y = origin.y - di.getlocation().y;                 transferable t = new imagetransferable(new dragimages(p, di));                 imagepane.removeimage(di);                 dragsource ds = dge.getdragsource();                 ds.startdrag(                                 dge,                                 null,                                 t,                                 new dragsourcehandler(imagepane));             }          }      }      protected class dragsourcehandler implements dragsourcelistener {          private imagepane pane;          public dragsourcehandler(imagepane pane) {             this.pane = pane;         }          public void dragenter(dragsourcedragevent dsde) {         }          public void dragover(dragsourcedragevent dsde) {             pane.repaint();         }          public void dropactionchanged(dragsourcedragevent dsde) {         }          public void dragexit(dragsourceevent dse) {         }          public void dragdropend(dragsourcedropevent dsde) {             if (!dsde.getdropsuccess()) {                 transferable t = dsde.getdragsourcecontext().gettransferable();                 if (t != null) {                     try {                         object transferdata = t.gettransferdata(imagetransferable.drag_image_data_flavor);                         if (transferdata instanceof dragimages) {                             dragimages di = (dragimages) transferdata;                             pane.addimages(di);                         }                     } catch (unsupportedflavorexception | ioexception ex) {                         ex.printstacktrace();                     }                 }             }         }      }      protected class droptargethandler implements droptargetlistener {          private imagepane panel;          public droptargethandler(imagepane panel) {             this.panel = panel;         }          public void dragenter(droptargetdragevent dtde) {             if (dtde.gettransferable().isdataflavorsupported(imagetransferable.drag_image_data_flavor)) {                 dtde.acceptdrag(dndconstants.action_copy_or_move);                 updatedragimages(dtde);             } else {                 dtde.rejectdrag();             }         }          public void dragover(droptargetdragevent dtde) {             updatedragimages(dtde);             panel.repaint();         }          public void dropactionchanged(droptargetdragevent dtde) {         }          public void dragexit(droptargetevent dte) {             panel.setdragimages(null);         }          public void drop(droptargetdropevent dtde) {             panel.setdragimages(null);             if (dtde.gettransferable().isdataflavorsupported(imagetransferable.drag_image_data_flavor)) {                 transferable t = dtde.gettransferable();                 if (t.isdataflavorsupported(imagetransferable.drag_image_data_flavor)) {                     try {                         object transferdata = t.gettransferdata(imagetransferable.drag_image_data_flavor);                         if (transferdata instanceof dragimages) {                             dragimages images = (dragimages) transferdata;                             dtde.dropcomplete(true);                             dtde.acceptdrop(dndconstants.action_copy_or_move);                             panel.addimagesat(dtde.getlocation(), images);                         } else {                             dtde.rejectdrop();                         }                     } catch (unsupportedflavorexception ex) {                         ex.printstacktrace();                         dtde.rejectdrop();                     } catch (ioexception ex) {                         ex.printstacktrace();                         dtde.rejectdrop();                     }                 } else {                     dtde.rejectdrop();                 }             }         }          protected void updatedragimages(droptargetdragevent dtde) {             panel.setdragimages(null);             transferable t = dtde.gettransferable();             if (t != null) {                 try {                     object transferdata = t.gettransferdata(imagetransferable.drag_image_data_flavor);                     if (transferdata instanceof dragimages) {                         panel.setdragpoint(dtde.getlocation());                         panel.setdragimages((dragimages)transferdata);                     }                 } catch (unsupportedflavorexception | ioexception ex) {                     ex.printstacktrace();                 }             }         }      } } 

Comments

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

c++ - qgraphicsview horizontal scrolling always has a vertical delta -