J'ai trouvé la solution pour mon previous question qui m'a atterri dans un nouveau problème.Image scintille sur repaint()
Dans le code suivant, je déplace une image autour d'une JFrame à l'aide des touches fléchées. mais chaque fois que j'appuie sur une touche fléchée, l'image semble scintiller, ce qui est tout à fait perceptible quand on appuie continuellement sur une touche.
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
public class TestProgram extends JFrame implements KeyListener {
private BufferedImage TestImage;
private int cordX = 100;
private int cordY = 100;
public TestProgram() {
setTitle("Testing....");
setSize(500, 500);
imageLoader();
setVisible(true);
}
public void imageLoader() {
try {
String testPath = "test.png";
TestImage = ImageIO.read(getClass().getResourceAsStream(testPath));
} catch (IOException ex) {
ex.printStackTrace();
}
addKeyListener(this);
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawImage(TestImage, cordX, cordY, this);
}
public static void main(String[] args) {
new TestProgram();
}
public void keyPressed(KeyEvent ke) {
switch (ke.getKeyCode()) {
case KeyEvent.VK_RIGHT: {
cordX+=5;
}
break;
case KeyEvent.VK_LEFT: {
cordX-=5;
}
break;
case KeyEvent.VK_DOWN: {
cordY+=5;
}
break;
case KeyEvent.VK_UP: {
cordY-=3;
}
break;
}
repaint();
}
public void keyTyped(KeyEvent ke) {}
public void keyReleased(KeyEvent ke) {}
}
Y at-il une solution pour éviter cela?
EDIT: ci-dessus est le code de travail complet. Je trouve qu'il est difficile d'y incorporer doublebuffer. quelqu'un peut-il m'aider dans cette partie?
1) Pour une meilleure aide plus rapidement, postez un [SSCCE] (http://sscce.org/). 2) Ne pas étendre le cadre. 3) Ne pas peindre dans les conteneurs de niveau supérieur (comme 'JFrame') au lieu d'étendre un' JPanel' 3) Réglez la taille préférée du panneau et appelez 'pack()' plutôt que de définir la taille de l'image 4) Pour un non-TLC, remplace 'paintComponent()' plutôt que 'paint()' 5) Démarrez et modifiez l'interface graphique sur l'EDT. 6) Pour les applications Swing., Pensez à utiliser des raccourcis clavier au lieu d'un KeyListener. 7) Au moment du déploiement, vous devrez probablement accéder à l'image par URL. –
@Andrew Thompson hmmm vous avez répondu à cette question – mKorbel
@mKorbel J'ai offert quelques conseils. (shrugs) –