swing - Sliding Puzzle Java Shuffle issue -


i trying shuffle pieces 15 piece sliding puzzle when click shuffle button. unfortunately, don't know how "grab" jpanel buttons because dynamic , don't "passed" action listener: here's loop creates & adds buttons:

   pos = new int[][] {                          {0, 1, 2, 3},                          {4, 5, 6, 7},                          {8, 9, 10, 11},                          {12, 13, 14, 15}                     };       centerpanel = new jpanel();     centerpanel.setlayout(new gridlayout(4, 5, 0, 0));      add(box.createrigidarea(new dimension(0, 5)), borderlayout.north);         add(centerpanel, borderlayout.center);      int counter = 0;     ( int = 0; < 4; i++) {         ( int j = 0; j < 4; j++) {             if ( j == 3 && == 3) {                 label = new jlabel("");                 centerpanel.add(label); // empty label             } else {                 counter++;                 button = new jbutton();                 button.settext(string.valueof(counter));                 button.addactionlistener(this);                 centerpanel.add(button);              }         }     } 

then add shuffle button:

    southpanel = new jpanel(new flowlayout());     jbutton shufflebutton = new jbutton("shuffle");     southpanel.add(shufflebutton);     shufflebutton.addactionlistener(this); 

then shuffle code i have 4 random moves have far (and know awful , don't know better). moves label pushes buttons down in order :(

     public void actionperformed(actionevent e) {      //get empty label location             int labelx = label.getx();     int labely = label.gety();      int labelposx = labelx / sizelabel.width;     int labelposy = labely / sizelabel.height;      int labelindex = pos[labelposx][labelposy];                            // button location             buttonx = label.getx() - size.width;             buttony = label.gety();              // button position             buttonposx = buttonx / size.width;             buttonposy = buttony / size.height;             buttonindex = pos[buttonposy][buttonposx];              // if label can moved             if ((labely == buttony && (labelx - buttonx) == size.width )) {                  system.out.println("label moves left");                 labelindex = buttonindex + 1;                  centerpanel.add(label,buttonindex);                  // here need "grab button" , put                  // in label index ???                  labely = label.gety();                 labelx = label.getx();              } 

any appreciated!! tried using component getcomponent(int) don't know how implement it. think perfect...

rely more on maintaining kind of reference jlabels trying maintain information labels carry.

for example, place jlabels list , shuffle list, removing labels , adding them again.

import java.awt.borderlayout; import java.awt.dimension; import java.awt.eventqueue; import java.awt.gridlayout; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.util.arraylist; import java.util.collections; import java.util.list; import javax.swing.jbutton; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jpanel; import javax.swing.uimanager; import javax.swing.unsupportedlookandfeelexception;  public class shuffle {      public static void main(string[] args) {         new shuffle();     }      public shuffle() {         eventqueue.invokelater(new runnable() {             @override             public void run() {                 try {                     uimanager.setlookandfeel(uimanager.getsystemlookandfeelclassname());                 } catch (classnotfoundexception | instantiationexception | illegalaccessexception | unsupportedlookandfeelexception ex) {                 }                  final puzzelpane puzzelpane = new puzzelpane();                 jbutton shuffle = new jbutton("shuffel");                 shuffle.addactionlistener(new actionlistener() {                     @override                     public void actionperformed(actionevent e) {                         puzzelpane.shuffle();                     }                 });                  jframe frame = new jframe("testing");                 frame.setdefaultcloseoperation(jframe.exit_on_close);                 frame.setlayout(new borderlayout());                 frame.add(puzzelpane);                 frame.add(shuffle, borderlayout.south);                 frame.pack();                 frame.setlocationrelativeto(null);                 frame.setvisible(true);             }         });     }      public class puzzelpane extends jpanel {          private list<jlabel> labels;          public puzzelpane() {             setlayout(new gridlayout(3, 3));             labels = new arraylist<>(9);             (int index = 0; index < 9; index++) {                 jlabel label = new jlabel(string.valueof(index));                 label.sethorizontalalignment(jlabel.center);                 labels.add(label);             }             shuffle();         }          @override         public dimension getpreferredsize() {             return new dimension(200, 200);         }          public void shuffle() {             removeall();             collections.shuffle(labels);             (jlabel label : labels) {                 add(label);             }             revalidate();         }     }  } 

you use arrays same idea...


Comments

Popular posts from this blog

PHPMotion implementation - URL based videos (Hosted on separate location) -

javascript - Using Windows Media Player as video fallback for video tag -

c# - Unity IoC Lifetime per HttpRequest for UserStore -