2010-05-18 4 views
2

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

Вот код:

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

System.out.println ("Picture" + f.getAbsolutePath()); BufferedImage image = ImageIO.read (f); MyBufferedImage img = new MyBufferedImage (изображение); 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 секунды спустя»);

getContentPane(). Remove (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; 
    } 
} 

}

ответ

1

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

0

Вы пробовали вызова

getContentPane() перепроверить();

после звонка на удаление?

+0

Там нет способа перепроверить, попробуйте использовать getContentPane() проверки(). Или, возможно, (на JFrame) сделать this.validateTree(); –

+0

Doh! Кроме того, они хотят следить за добавлением и удалением вещей из EDT. –

0

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

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

0

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

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

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

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

0

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

+0

Большое спасибо, теперь это работает. Он работает с SwingUtilities.updateComponentTreeUI (это), это.repaint или this.update (getGraphics()). Хорошего дня! – user343908

Смежные вопросы