Note that there are some explanatory texts on larger screens.

plurals
  1. POStop flickering in swing when i repaint too much
    primarykey
    data
    text
    <p>I am making an RPG with a tilemap. To generate the tilemap i loop through a 2 dimensional array but that means that when I repaint I have to do that each time. If I repaint too much the screen flickers how could I stop this.</p> <pre><code>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 up = 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); for (int x = 0; x &lt; map.length; x++) { for (int y = 0; y &lt; 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]; for (int i = 0; i &lt; lines; i++) { String line = br1.readLine(); String[] parts = line.split(" "); for (int y = 0; y &lt; 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: 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: up = false; break; case KeyEvent.VK_DOWN: down = false; break; case KeyEvent.VK_LEFT: left = false; break; case KeyEvent.VK_RIGHT: right = false; break; } } } } </code></pre> <p>Thank you for your help</p> <h2>Edit</h2> <p>Using <code>javax.swing.Timer</code> removes all flickering even with a 10 ms delay.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload