Arrêter le scintillement dans les swing quand j'ai repeint trop

Je fais un RPG avec une tilemap. Pour générer la tilemap je boucle par un 2 dimensions, tableau, mais cela signifie que lorsque je repeindre je dois le faire à chaque fois. Si je repeindre trop de l'écran scintille comment ai-je pu l'en empêcher.

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 < map.length; x++) 
{
for (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];
for (int i = 0; i < lines; i++)
{
String line = br1.readLine();
String[] parts = line.split(" ");
for (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:
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;
}
}
}
}

Merci pour votre aide

Modifier

À l'aide de javax.swing.Timer supprime tous scintillement, même avec un 10 ms de retard.

+1 pour votre nom de paquet.
en effet belle - mais de ne pas se conformer aux conventions de nommage java <g>
Ok je vais le changer pour com.sexyCyborgFromAnOtherDimension.
le domaine n'est pas le point: les noms de paquets ne devraient pas contenir des lettres majuscules 🙂
plusieurs machines de mal avec votre code (peut-être sans rapport avec le problème) a) remplacer paintComponent pour la peinture custom (pas peinture) b) ne pas modifier l'état du composant dans une méthode de peinture c) favoriser les Raccourcis clavier sur KeyListeners Autres que: 10ms ressemble à un très serrée boucle...

OriginalL'auteur sanchixx | 2013-07-31