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 component
s, 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
Post a Comment