2012-06-03 3 views
3

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?

+4

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. –

+0

@Andrew Thompson hmmm vous avez répondu à cette question – mKorbel

+0

@mKorbel J'ai offert quelques conseils. (shrugs) –

Répondre

4

Vous devez utiliser un tampon pour éliminer le scintillement. Pour les images, il y a le tampon BufferedImage:

BufferedImage bf = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB); 

Ensuite, vous dessinez votre image à l'écran comme ceci:

g.drawImage(bf, 0, 0, null); 
+0

1) Utilisez un 'ImageObserver' plutôt que' null' quand vous en avez un. 2) Les composants Swing sont à double tampon par défaut. –

+0

Merci! travaillera sur cela. – md1hunox

6

vacillante non, le code de travail. Repaint() n'appelle pas simplement la méthode paint().

Une méthode repaint() appelle la méthode update() et la méthode update() par défaut puis appelle la méthode paint(). Il suffit donc de remplacer la méthode update(). Aussi peint comme BufferedImage comme mentionné ci-dessus correctement.

Cela devrait fonctionner maintenant. Cela a bien fonctionné ici. J'ai seulement utilisé un chemin d'image différent.

import java.awt.Graphics; 
import java.awt.Image; 
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 static final long serialVersionUID = 1L; 
    private Image TestImage; 
    private BufferedImage bf; 
    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); 
    } 

    public void update(Graphics g){ 
      paint(g); 
    } 

    public void paint(Graphics g){ 

     bf = new BufferedImage(this.getWidth(),this.getHeight(), BufferedImage.TYPE_INT_RGB); 

    try{ 
    animation(bf.getGraphics()); 
    g.drawImage(bf,0,0,null); 
    }catch(Exception ex){ 

    } 
} 

    public void animation(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) { 
    } 
}