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...
- swing animation running extremely slow - able go 500 elements 4500 elements moving on screen @ 1 time - talks resource management well
- java bouncing ball
- how make line animation smoother?
- the images not loading
and because kleo scares me (and it's idea), should take @ how use key bindings, solve focus issues keylistener
Comments
Post a Comment