2010-05-18 3 views
2

Je travaille pour la première fois avec des images dans un JFrame, et j'ai quelques problèmes. J'ai réussi à mettre une image sur mon JFrame, et maintenant je veux après 2 secondes enlever mon image du JFrame. Mais au bout de 2 secondes, l'image ne disparaît pas, sauf si je redimensionne le cadre ou si je minimise et ensuite maximise le cadre. Aide moi si tu peux. Merci.JFrame ne se rafraîchit pas après la suppression d'une image

Voici le code:

 File f = new File("2.jpg"); 

System.out.println ("Image" + f.getAbsolutePath()); BufferedImage image = ImageIO.read (f); MyBufferedImage img = new MyBufferedImage (image); img.resize (400, 300); img.setSize (400, 300); img.setLocation (50, 50); getContentPane(). Add (img);

this.setSize (600, 400); this.setLocationRelativeTo (null); this.setVisible (true);

Thread.sleep (2000); System.out.println ("2 secondes plus");

getContentPane(). Remove (img);

Voici la classe MyBufferedImage.

public class MyBufferedImage extends JComponent{ 
private BufferedImage image; 

private int nPaint; 
private int avgTime; 

private long previousSecondsTime; 

public MyBufferedImage(BufferedImage b) { 
    super(); 

    this.image = b; 

    this.nPaint = 0; 
    this.avgTime = 0; 

    this.previousSecondsTime = System.currentTimeMillis(); 
} 

@Override 
public void paintComponent(Graphics g) { 
    Graphics2D g2D = (Graphics2D) g; 
    g2D.setColor(Color.BLACK); 
    g2D.fillRect(0, 0, this.getWidth(), this.getHeight()); 

    long currentTimeA = System.currentTimeMillis(); 


    //g2D.drawImage(this.image, 320, 0, 0, 240, 0, 0, 640, 480, null); 
    g2D.drawImage(image, 0,0, null); 
    long currentTimeB = System.currentTimeMillis(); 
    this.avgTime += currentTimeB - currentTimeA; 
    this.nPaint++; 

    if (currentTimeB - this.previousSecondsTime > 1000) { 
     System.out.format("Drawn FPS: %d\n", nPaint++); 
     System.out.format("Average time of drawings in the last sec.: %.1f ms\n", (double) this.avgTime/this.nPaint++); 
     this.previousSecondsTime = currentTimeB; 
     this.avgTime = 0; 
     this.nPaint = 0; 
    } 
} 

}

Répondre

1

simplement appeler this.repaint() après avoir enlevé l'image et tout ira bien;)

0

Avez-vous essayé d'appeler

getContentPane() revalider();

après l'appel à supprimer?

+0

Il n'y a pas de méthode de revalidation, essayez d'utiliser getContentPane() valider(). Ou éventuellement (sur le JFrame) faites ceci.validateTree(); –

+0

Doh! En outre, ils veulent faire attention à l'ajout et à l'enlèvement des choses de l'EDT –

0

Vous devez probablement invalider le composant frame pour forcer un redrawing.

Probablement votre meilleur pari est de regarder les méthodes de mise à jour/repeindre.

0

Vous devez vous assurer que vous supprimez votre image de votre composant dans le fil d'expédition des événements. Donnez à ce essayer:

SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
       getContentPane().remove(img); 
     } 
} 

Votre img sera soit besoin d'être un final global ou déclaré une portée locale pour que cela fonctionne. Jetez un oeil à concepts on Swing Threads si vous n'êtes pas déjà familier.

Remarque: L'appel remove sur Container appellera invalidate() si le volet de contenu est considéré comme valide.

0

Donnez SwingUtilities.updateComponentTreeUI(this); un tir

+0

Merci beaucoup, maintenant cela fonctionne. Cela fonctionne avec SwingUtilities.updateComponentTreeUI (this), ceci.repaint ou this.update (getGraphics()). Bonne journée! – user343908

Questions connexes