java - Stop flickering in swing when i repaint too much -


i making rpg tilemap. generate tilemap loop through 2 dimensional array means when repaint have each time. if repaint screen flickers how stop this.

package sexycyborgfromanotherdimension;  import java.awt.color; import java.awt.graphics; import java.awt.graphics2d; import java.awt.renderinghints; import java.awt.event.keyadapter; import java.awt.event.keyevent; import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstreamreader; import java.util.timer; import java.util.timertask;  import javax.swing.jpanel;  @suppresswarnings("serial") public class game extends jpanel {     keylis listener;     int mapx = 20;     int mapy = 20;     boolean = false;     boolean down = false;     boolean right = false;     boolean left = false;     string[][] map;      public game()     {         super();         try          {             map = load("/maps/map1.txt");         }           catch (ioexception e)          {             // todo auto-generated catch block             e.printstacktrace();         }          listener = new keylis();         this.setfocusable(true);         this.requestfocus();         this.addkeylistener(listener);          timer timer = new timer();         timertask task = new timertask()          {             @override             public void run()              {                 if(up)                 {                     mapy++;                     repaint();                 }                  if(down)                 {                     mapy--;                     repaint();                 }                  if(right)                 {                     mapx--;                     repaint();                 }                  if(left)                 {                     mapx++;                     repaint();                 }             }         };         timer.scheduleatfixedrate(task, 0, 10);     }      public void paint(graphics g)      {         super.paintcomponent(g);         setdoublebuffered(true);         graphics2d g2 = (graphics2d)g;         g2.setrenderinghint(renderinghints.key_antialiasing, renderinghints.value_antialias_on);         (int x = 0; x < map.length; x++)          {             (int y = 0; y < map[x].length; y++)              {                 switch(map[x][y])                 {                 case "0":                     g.setcolor(color.green);                     break;                 case "1":                     g.setcolor(color.gray);                     break;                 }                  g.fillrect(y*20+mapx, x*20+mapy, 20, 20);             }         }         g.setcolor(color.black);         g.fillrect(400, 400, 20, 20);     }      string[][] load(string file) throws ioexception     {         bufferedreader br = new bufferedreader(new inputstreamreader(getclass().getresourceasstream(file)));         int lines = 1;         int length = br.readline().split(" ").length;         while (br.readline() != null) lines++;         br.close();         bufferedreader br1 = new bufferedreader(new inputstreamreader(getclass().getresourceasstream(file)));         string[][] map = new string[lines][length];         (int = 0; < lines; i++)         {             string line = br1.readline();             string[] parts = line.split(" ");             (int y = 0; y < length; y++)             {                 map[i][y] = parts[y];             }         }         br1.close();         return map;     }      private class keylis extends keyadapter      {            @override         public void keypressed(keyevent e)          {             switch (e.getkeycode())             {             case keyevent.vk_up:                 = true;                 break;             case keyevent.vk_down:                 down = true;                 break;             case keyevent.vk_left:                 left = true;                 break;             case keyevent.vk_right:                 right = true;                 break;             }         }          @override         public void keyreleased(keyevent e)          {             switch (e.getkeycode())             {             case keyevent.vk_up:                 = false;                 break;             case keyevent.vk_down:                 down = false;                 break;             case keyevent.vk_left:                 left = false;                 break;             case keyevent.vk_right:                 right = false;                 break;             }         }     } } 

thank help

edit

using javax.swing.timer removes flickering 10 ms delay.

a number of small things jump out @ me.

firstly. might better using javax.swing.timer instead of java.util.timer, @ least allow events flow little better.

secondly, 10 milliseconds short time period, seriously, don't need 100fps, 60fps 17 milliseconds, use 40 milliseconds 25fps. might give edt breathing room respond repaint requests.

thirdly, should using paintcomponent instead of paint. it's low enough in call chain guaranteed double buffered

fourthly, should avoid calling method might reschedule repaint (like setdoublebuffered example, in constructor if must, but, swing components double buffered default)

fifthly, possible, paint "static" or slow changing content backing buffer , paint instead. increase speed @ paint can work doesn't stuck in lot of small loops.

you may want take @ painting in awt , swing more details paint process

some additional examples...

and because kleo scares me (and it's idea), should take @ how use key bindings, solve focus issues keylistener


Comments

Popular posts from this blog

basic authentication with http post params android -

vb.net - Virtual Keyboard commands -

css - Firefox for ubuntu renders wrong colors -