JFrame not updating after deleting image

This is my first time working with images in a JFrame and I have some problems. I managed to place an image on my JFrame and now I want to remove my image from the JFrame after 2 seconds. But after 2 seconds the image does not disappear unless I resize the frame or hide it and enlarge the frame after that. Help me if you can. Thanks.

Here is the 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 seconds");

getContentPane () remove (IMG) ;.

Here is the MyBufferedImage class:

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;
    }
}

      

}

+2


a source to share


5 answers


just call this.repaint()

after deleting the image and you will be fine;)



+1


a source


Have you tried calling

getContentPane (). revalidate ();



after the call to delete?

0


a source


You will probably need to invalidate the redrawing frame component.

Probably your best bet is to look at the update / repaint methods.

0


a source


You have to make sure you remove your image from your component in the Thread Dispatch Thread. Try:

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

      

Yours img

must either be global or declared final

in local scope for this to work. Take a look at the concepts on Swing Threads if you're not already familiar.

Note. Calling remove

on the Container

cause invalidate()

, if the contents of the panel will be considered valid.

0


a source


Give SwingUtilities.updateComponentTreeUI(this);

a Shot

0


a source







All Articles