JFrame не обновляется после удаления изображения - PullRequest
2 голосов
/ 18 мая 2010

Я впервые работаю с изображениями в JFrame, и у меня есть некоторые проблемы. Мне удалось поместить изображение в мой JFrame, и теперь я хочу через 2 секунды удалить мое изображение из JFrame. Но через 2 секунды изображение не исчезнет, ​​если я не изменю размер кадра или не уменьшу, а после этого увеличу кадр. Помоги мне, если сможешь. Спасибо.

Вот код:

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

System.out.println ("Изображение" + f.getAbsolutePath ()); BufferedImage image = ImageIO.read (f); MyBufferedImage img = new MyBufferedImage (изображение); img.resize (400, 300); img.setSize (400, 300); img.setLocation (50, 50); . GetContentPane () добавить (IMG);

this.setSize (600, 400); this.setLocationRelativeTo (нуль); this.setVisible (истина);

Thread.sleep (2000); System.out.println («2 секунды больше»);

getContentPane () удалить (IMG);.

Вот класс 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;
    }
}

}

Ответы [ 5 ]

1 голос
/ 18 мая 2010

просто позвоните this.repaint() после удаления изображения и все будет хорошо;)

0 голосов
/ 18 мая 2010

Дайте SwingUtilities.updateComponentTreeUI(this); выстрел

0 голосов
/ 18 мая 2010

Возможно, вам нужно сделать недействительным компонент кадра, вызывая перерисовку.

Вероятно, вам лучше всего посмотреть на методы обновления / перекраски.

0 голосов
/ 18 мая 2010

Вы должны убедиться, что вы удаляете свое изображение из компонента в ветке отправки событий. Попробуйте это:

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

Ваш img должен быть либо глобальным, либо объявленным final в локальной области действия, чтобы это работало. Взгляните на концепции Swing Threads , если вы еще не знакомы.

Примечание. Вызов remove на Container вызовет invalidate(), если панель содержимого считается действительной.

0 голосов
/ 18 мая 2010

Вы пробовали звонить

getContentPane (). Revalidate ();

после звонка убрать?

...