Wednesday 15 July 2015

java - Move and Reorder JLabels in JPanel using DnD -



java - Move and Reorder JLabels in JPanel using DnD -

i have programme i'm working on takes input names , creates jlabels , populates them arraylist. when user clicks begin button, jlabels populate in left jpanel. i've been trying utilize dnd allow user drag , re-order labels in left panel. far, i've been able re-create text 1 label another. goal drag label or downwards in list, , depending on it's dropped in jpanel, have remaining jlabels move or downwards in panel. i'm using flowlayout panel, , labels wide plenty create vertical alignment. here code:

import java.awt.borderlayout; import java.awt.color; import java.awt.container; import java.awt.dimension; import java.awt.flowlayout; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.mouseadapter; import java.awt.event.mouseevent; import java.awt.event.mouselistener; import java.util.arraylist; import javax.swing.borderfactory; import javax.swing.jbutton; import javax.swing.jcomponent; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jpanel; import javax.swing.jtextfield; import javax.swing.transferhandler; import javax.swing.border.border; public class gui extends jframe { /** * */ private static final long serialversionuid = 1l; private arraylist<jlabel> players = new arraylist<jlabel>(); private arraylist<jlabel> monsters = new arraylist<jlabel>(); private jbutton addplayer = new jbutton(); private jbutton removeplayer = new jbutton(); private jbutton addmonster = new jbutton(); private jbutton removemonster = new jbutton(); private jtextfield name = new jtextfield(); private jpanel listpanel = new jpanel(); private jpanel buttonpanel = new jpanel(); private jbutton encounter = new jbutton(); private jbutton begin = new jbutton(); //private jbutton remove;// = new jbutton(); int x_pressed; int y_pressed; public gui(){ super("d&d initiative"); final container container = getcontentpane(); container.setlayout(new flowlayout()); //change gridbaglayout container.setpreferredsize(new dimension(800, 500)); listpanel.setpreferredsize(new dimension(600, 500)); listpanel.setbackground(color.blue); listpanel.setopaque(true); buttonpanel.setpreferredsize(new dimension(200,500)); buttonpanel.setbackground(color.green); buttonpanel.setopaque(true); dimension size = new dimension(190,30); name.setpreferredsize(new dimension(190,30)); addplayer.settext("add player"); removeplayer.settext("remove player"); addplayer.setpreferredsize(size); removeplayer.setpreferredsize(size); addmonster.settext("add monster"); removemonster.settext("remove monster"); addmonster.setpreferredsize(size); removemonster.setpreferredsize(size); begin.settext("begin encounter"); begin.setpreferredsize(size); buttonpanel.add(name); buttonpanel.add(addplayer); buttonpanel.add(addmonster); buttonpanel.add(removeplayer); buttonpanel.add(removemonster); buttonpanel.add(begin); final border paddingborder = borderfactory.createemptyborder(0,10,0,0); addplayer.addactionlistener(new actionlistener(){ public void actionperformed(actionevent e){ if(name.gettext().comparetoignorecase("") != 0){ final jlabel temp=new jlabel(); temp.setpreferredsize(new dimension(590,50)); temp.settext(name.gettext()); temp.setbackground(color.gray); temp.setforeground(color.white); temp.setopaque(true); temp.setlayout(new borderlayout()); temp.setborder(borderfactory.createcompoundborder(null,paddingborder)); //bpane.setpreferredsize(new dimension(100,temp.getheight())); jbutton remove = new jbutton(); remove.settext("remove"); remove.addactionlistener(new actionlistener(){ public void actionperformed(actionevent e){ system.out.println("count of listeners: " + ((jbutton) e.getsource()).getactionlisteners().length); //debugging listpanel.remove(temp); listpanel.revalidate(); system.out.println("remove"); listpanel.repaint(); } }); temp.add(remove, borderlayout.east); mouselistener listener = new dragmouseadapter(); temp.settransferhandler(new transferhandler("text")); temp.addmouselistener(listener); players.add(temp); name.settext(""); name.requestfocusinwindow(); }else{ //throw error } } }); begin.addactionlistener(new actionlistener(){ public void actionperformed(actionevent e){ for(int i=0;i<players.size();i++){ jlabel h = players.get(i); h.setminimumsize(new dimension(590,30)); int s = container.getheight()/players.size(); if(s < 50){ h.setpreferredsize(new dimension(590,listpanel.getheight()/(players.size()+1))); }else{ h.setpreferredsize(new dimension(590,30)); } listpanel.add(h, new integer(1), 0); } listpanel.revalidate(); } }); container.add(listpanel); container.add(buttonpanel); pack(); // pack frame fit container within setlocation(150, 150); // set location on monitor setvisible(true); setresizable(false); } /** * @param args */ public static void main(string[] args) { // todo auto-generated method stub gui application = new gui(); application.setdefaultcloseoperation(jframe.exit_on_close); } } //start of drag , drop class dragmouseadapter extends mouseadapter { public void mousepressed(mouseevent e) { jcomponent c = (jcomponent) e.getsource(); transferhandler handler = c.gettransferhandler(); handler.exportasdrag(c, e, transferhandler.copy); system.out.println(c); } }

there few things in there still different attempts (such unused variables).

consider using jlist rather creating own component of labels, has lot of neat functionality create life simpler, drag , drop...

have @ how utilize lists more details.

drag , drop quite complex api , can quite confusing begin with, isn't helped inclusion of "transfer api" adds confusion.

having said that, "transfer api" you're in case...

import java.awt.eventqueue; import java.awt.datatransfer.dataflavor; import java.awt.datatransfer.transferable; import java.awt.datatransfer.unsupportedflavorexception; import java.io.ioexception; import java.util.arraylist; import java.util.arrays; import java.util.collections; import java.util.comparator; import java.util.list; import javax.activation.activationdataflavor; import javax.swing.defaultlistmodel; import javax.swing.dropmode; import javax.swing.jcomponent; import javax.swing.jframe; import javax.swing.jlist; import javax.swing.jscrollpane; import javax.swing.transferhandler; import javax.swing.uimanager; import javax.swing.unsupportedlookandfeelexception; public class draglist { public static void main(string[] args) { new draglist(); } public draglist() { eventqueue.invokelater(new runnable() { @override public void run() { seek { uimanager.setlookandfeel(uimanager.getsystemlookandfeelclassname()); } grab (classnotfoundexception | instantiationexception | illegalaccessexception | unsupportedlookandfeelexception ex) { ex.printstacktrace(); } defaultlistmodel<string> listmodel = new defaultlistmodel<>(); listmodel.addelement("clara holmes"); listmodel.addelement("bill moss"); listmodel.addelement("della reeves"); listmodel.addelement("lloyd gross"); listmodel.addelement("cecilia floyd"); listmodel.addelement("delia cummings"); listmodel.addelement("tommy benson"); listmodel.addelement("kirk casey"); listmodel.addelement("chester manning"); listmodel.addelement("elsa chapman"); jlist nameslist = new jlist(listmodel); nameslist.setdragenabled(true); nameslist.setdropmode(dropmode.on_or_insert); nameslist.settransferhandler(new listitemtransferhandler()); jframe frame = new jframe("testing"); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.add(new jscrollpane(nameslist)); frame.pack(); frame.setlocationrelativeto(null); frame.setvisible(true); } }); } public class listitemtransferhandler extends transferhandler { private dataflavor flavor; public listitemtransferhandler() { super("listmove"); flavor = new activationdataflavor(int[].class, dataflavor.javajvmlocalobjectmimetype, "list of values"); } @override protected transferable createtransferable(jcomponent c) { system.out.println("createtransferable"); jlist list = (jlist) c; defaultlistmodel<string> model = (defaultlistmodel<string>) list.getmodel(); int[] selectedvalues = list.getselectedindices(); list<valuepair> values = new arraylist<>(selectedvalues.length); (int index : selectedvalues) { values.add(new valuepair(index, model.getelementat(index))); } homecoming new listofvalues(values); } @override public boolean canimport(transfersupport support) { boolean canimport = support.isdrop() && support.isdataflavorsupported(flavor); homecoming canimport; } @override public int getsourceactions(jcomponent c) { homecoming move; } @override public boolean importdata(transfersupport support) { boolean imported = false; if (canimport(support)) { jlist target = (jlist) support.getcomponent(); target.clearselection(); jlist.droplocation dl = (jlist.droplocation) support.getdroplocation(); defaultlistmodel<string> model = (defaultlistmodel<string>) target.getmodel(); int addindex = dl.getindex(); if (addindex < 0 || addindex >= model.size()) { addindex = model.size(); } seek { list<valuepair> values = (list<valuepair>) support.gettransferable().gettransferdata(flavor); (valuepair vp : values) { int index = vp.getindex(); string value = model.get(index); model.add(addindex, value); target.addselectioninterval(addindex, addindex); addindex++; } imported = true; } grab (unsupportedflavorexception | ioexception ex) { ex.printstacktrace(); } } homecoming imported; } @override protected void exportdone(jcomponent source, transferable data, int action) { if (action == move) { jlist list = (jlist) source; defaultlistmodel<string> model = (defaultlistmodel<string>) list.getmodel(); seek { // list of values , sort in decending order list<valuepair> values = (list<valuepair>) data.gettransferdata(flavor); collections.sort(values, new comparator<valuepair>() { @override public int compare(valuepair o1, valuepair o2) { homecoming o2.getindex() - o1.getindex(); } }); // loop through each item... (valuepair vp : values) { // "last known" index of value... string modelvalue = model.get(vp.getindex()); string value = vp.getvalue(); int index = vp.getindex(); // if value no long resides @ it's lastly location, need find it, // can't rely on contains, there 2 values of same value... if (modelvalue != value) { // behind us, length of number of values selected... int startindex = math.max(vp.getindex() - values.size(), 0); int endindex = vp.getindex(); index = getindexfor(value, model, startindex, endindex); if (index < 0) { // forward, length of number of values selected... endindex = math.min(vp.getindex() + values.size(), model.size() - 1); startindex = vp.getindex(); index = getindexfor(value, model, startindex, endindex); } } if (index < 0) { // lost item ?? throw new ioexception("missing value?"); } else { model.remove(index); } } } grab (unsupportedflavorexception | ioexception ex) { ex.printstacktrace(); } } } protected int getindexfor(string value, defaultlistmodel<string> model, int startindex, int endindex) { while (model.get(startindex) != value && startindex <= endindex) { startindex++; } homecoming model.get(startindex) == value ? startindex : -1; } public class valuepair { private int index; private string value; public valuepair(int index, string value) { this.index = index; this.value = value; } public int getindex() { homecoming index; } public string getvalue() { homecoming value; } } public class listofvalues implements transferable { private list<valuepair> values; public listofvalues(list<valuepair> values) { this.values = values; } @override public dataflavor[] gettransferdataflavors() { homecoming new dataflavor[]{flavor}; } @override public boolean isdataflavorsupported(dataflavor flavor) { homecoming arrays.aslist(gettransferdataflavors()).contains(flavor); } @override public object gettransferdata(dataflavor flavor) throws unsupportedflavorexception, ioexception { homecoming values; } } } }

take @ demo - basicdnd demo more info on transfer api in general.

java swing drag-and-drop jlabel

No comments:

Post a Comment