swing - Java Game - Not Painting until After Thread.sleep -


i'm coding game , i'm trying have if click on first button on front page, shows transition screen 5 seconds, , shows game. here code:

import java.awt.graphics; import java.awt.graphics2d; import java.awt.renderinghints; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.keyevent; import java.awt.event.keylistener; import java.awt.event.mouseevent; import java.awt.event.mouselistener; import java.awt.image.bufferedimage; import java.io.file; import javax.imageio.imageio; import javax.swing.jframe; import javax.swing.jpanel; public class forgottenmain extends jpanel implements keylistener,mouselistener{     /**      *       */     private static final int timer_delay = 35;     private static final long serialversionuid = -4926251405849574401l;     public static bufferedimage attic,flashlight,player,killer,frontpage,transition;     public static boolean onfrontpage,up,down,left,right,inattic,ontransition;     public static int px,py,kx,ky;     public static thread th1,th2;     public static jframe frame = new jframe("forgotten");     public static void main(string[] args){         onfrontpage = true;         px = 600;         py = 400;         forgottenmain fm = new forgottenmain();         frame.add(fm);         frame.setsize(1200,800);         frame.setdefaultcloseoperation(jframe.exit_on_close);         frame.setlocationrelativeto(null);         frame.setresizable(false);         frame.setvisible(true);         frame.add(new forgottenmain());         fm.repaint();     }     public forgottenmain(){         init();     }     public void init(){         setsize(1200,800);         setvisible(true);         frame.addkeylistener(this);         frame.addmouselistener(this);         try{                 player = imageio.read(new file("char.png"));             flashlight = imageio.read(new file("flashlightimage.png"));             attic = imageio.read(new file("attic.png"));             killer = imageio.read(new file("killer.png"));             frontpage = imageio.read(new file("frontpageoutline.png"));             transition = imageio.read(new file("transitionoutline.png"));         } catch (exception e){             e.printstacktrace();         }           // gameloop           new javax.swing.timer(timer_delay, new actionlistener() {                  public void actionperformed(actionevent e) {                     gameloop();                  }               }).start();        }     @override     public void paintcomponent(graphics g){         super.paintcomponent(g);         graphics2d g2 = (graphics2d) g;         int fx = px - 1033;         int fy = py - 635;         kx = 500;         ky = 500;         // removes flickering of images         g2.setrenderinghint(renderinghints.key_antialiasing, renderinghints.value_antialias_on);         // resets screen make sure shows character once         g2.clearrect(0, 0, 1200, 800);         // draws background attic         if(inattic == true){             system.out.println("drawing attic");             g2.drawimage(attic,0,0,this);         }         if(onfrontpage == true){             g2.drawimage(frontpage, 0, 0, this);         }          // draws player         if(onfrontpage == false && ontransition == false){             g2.drawimage(player, px, py, this);             // draws serial killer             g2.drawimage(killer, kx, ky, this);             // draws flashlight             g2.drawimage(flashlight, fx, fy, this);         }         if(ontransition == true){             g2.drawimage(transition, 0, 0, this);             system.out.println("drawing transition");             try {                 system.out.println("sleeping 5 seconds");                 thread.sleep(5000);             } catch (interruptedexception e) {                 // todo auto-generated catch block                 e.printstacktrace();             }             system.out.println("done sleeping.");             ontransition = false;             inattic = true;         }         system.out.println(px + " " + py);     }     public void gameloop(){      }     @override     public void mouseclicked(mouseevent arg0) {         system.out.println("mouselocation: " + arg0.getx() + ", " + arg0.gety());     }     @override     public void mouseentered(mouseevent arg0) {      }     @override     public void mouseexited(mouseevent arg0) {      }     @override     public void mousepressed(mouseevent e) {         if(e.getx() > 499 && e.gety() > 343 && e.getx() < 748 && e.gety() < 391){             onfrontpage = false;             ontransition = true;             repaint();         }     }     @override     public void mousereleased(mouseevent arg0) {      } 

my problem is, in paint method, in if statement testing if ontransition equal true, it's supposed draw image transition, wait 5 seconds, , draw game.

however, right it's waiting 5 seconds, drawing transition screen , game. reason out of order.

how can fix this? have tried alternate methods of waiting 5 seconds, example using currenttimemillis();, have same outcome.

you have serious problems:

  • you add panels twice
  • you have circuitous use of frame etc

beyond following work: have realize don't have control of painting process. therefore should launch new thread count sleep , let paint work uninhibited.

(also have removed static - if want them can try put them in - if doesnt work throw them out)

class f extends jpanel implements mouselistener{     /**      *       */     private static final int timer_delay = 35;     private static final long serialversionuid = -4926251405849574401l;     public bufferedimage attic,flashlight,player,killer,frontpage,transition;     public boolean onfrontpage,up,down,left,right,inattic,ontransition;     public int px,py,kx,ky;     public static thread th1,th2;     public jframe frame = new jframe("forgotten");     public f(){         init();     }     public void init(){         setsize(1200,800);         setvisible(true);         onfrontpage = true;         px = 600;         py = 400;         frame.add(this);         frame.setsize(1200,800);         frame.setdefaultcloseoperation(jframe.exit_on_close);         frame.setlocationrelativeto(null);         frame.setresizable(false);         frame.setvisible(true);          frame.addmouselistener(this);         try{     //            player = imageio.read(new file("char.png")); //            flashlight = imageio.read(new file("flashlightimage.png")); //            attic = imageio.read(new file("attic.png")); //            killer = imageio.read(new file("killer.png"));             attic = imageio.read(new file(...));             frontpage = imageio.read(new file(...));             transition = imageio.read(new file(...));         } catch (exception e){             e.printstacktrace();         }     }      @override     public void paintcomponent(graphics g){         super.paintcomponent(g);         graphics2d g2 = (graphics2d) g;         int fx = px - 1033;         int fy = py - 635;         kx = 500;         ky = 500;         // removes flickering of images         g2.setrenderinghint(renderinghints.key_antialiasing, renderinghints.value_antialias_on);         // resets screen make sure shows character once         g2.clearrect(0, 0, 1200, 800);         // draws background attic         if(inattic == true){             system.out.println("drawing attic"+system.currenttimemillis());             g2.drawimage(attic,0,0,this);         }         if(onfrontpage == true){             g2.drawimage(frontpage, 0, 0, this);         }          // draws player         if(onfrontpage == false && ontransition == false){             g2.drawimage(player, px, py, this);             // draws serial killer             g2.drawimage(killer, kx, ky, this);             // draws flashlight             g2.drawimage(flashlight, fx, fy, this);         }         if(ontransition == true){             graphics gt=transition.getgraphics();             gt.setcolor(color.red);             gt.drawstring("xxx"+system.currenttimemillis(), 10, 100);             g2.drawimage(transition, 0, 0, this);             ontransition = false;             inattic = true;         }         system.out.println(px + " " + py);     }     public void gameloop(){      }     @override     public void mouseclicked(mouseevent arg0) {         system.out.println("mouselocation: " + arg0.getx() + ", " + arg0.gety());     }     @override     public void mouseentered(mouseevent arg0) {      }     @override     public void mouseexited(mouseevent arg0) {      }     @override     public void mousepressed(mouseevent e) {             onfrontpage = false;             ontransition = true;      thread th=new thread() {       public void run() {             repaint();              system.out.println("drawing transition"+system.currenttimemillis());             try {                 system.out.println("sleeping 5 seconds"+system.currenttimemillis());                 thread.sleep(5000);             } catch (interruptedexception e) {                 // todo auto-generated catch block                 e.printstacktrace();             }             system.out.println("done sleeping."+system.currenttimemillis());             repaint();       }     };     th.start();       }     @override     public void mousereleased(mouseevent arg0) {      }  } 

Comments