2013-10-06 61 views
1

我試圖顯示一段時間後內容已更改的圖像。我在JLabel中顯示它,但問題是當我重新加載此映像時,它不會在JLabel中更改,因爲看起來JLabel#setIcon(new ImageIcon("myImagePath.png"));將緩存映像存儲在內存中,並且當我更改它時查找名稱並且未從硬盤加載它。刷新JLabel中的相同圖像

即使我使用兩個圖像來翻轉其數據內容被改變?任何人都知道如何解決這個問題?但每次加載具有不同名稱的圖像都可以正常工作?

線條創建問題: E.g.在按鈕單擊事件我的形象改變

jlabel.setIcon("d:\\img.png"); 
jlabel.repaint(); 
+2

只是一個說明。你應該閱讀http://sscce.org,因爲你在那裏與SSCCE非常遙遠。 –

+0

我見過[http://stackoverflow.com/questions/10445665/jlabel-refresh-icon-with-updated-image]但沒有幫助 –

+2

我發現[this](http://stackoverflow.com/q/ 10318502/1057230),這可能會有所幫助。否則,請參閱此[回答](http://stackoverflow.com/a/15187181/1057230),有所幫助。雖然如前所述,沒有SSCCE,但很難說:-) –

回答

5

我已經解決了這個問題,通過使用ImageIO的

try { 
    BufferedImage bufImg=ImageIO.read(new File("d:\\img.png")); 
    jlabel.setIcon(new ImageIcon(bufImg)); 
    //jlabel.repaint(); 
    //works even without repaint 
} 
catch (IOException ex) { 
    System.out.println("Unable to read image file"); 
} 

感謝尼斯牛還與mKorbel's answer工作作爲

ImageIcon img=new ImageIcon("D:\\img.png"); 
img.getImage().flush(); 
jlabel.setIcon(img); 

但不要不知道setIcon()有什麼問題,如果我不打img#getImage()#flush();。任何人都知道?

你也可以注意到,

  1. ImageIO是有點慢
  2. img.getImage().flush();調用這個閃爍的圖像
  3. 但如果我每次有不同的文件名,無需調用img.getImage().flush();jlabel.setIcon(img);去圖像不閃爍。
+0

該應用程序使用的圖像將稍後成爲其一部分部署,因此稱爲嵌入式資源。然後,以「URL」而不是「File」來訪問它們將是明智的。不要使用'Absolute Path'來代替''Class/package'使用'Relative Path',使用'ClassName.class.getResource(「/ pathToImage/image.extension」)',如[info ](http://stackoverflow.com/tags/embedded-resource/info)[tag:embedded-resource],請觀看信息頁面上提供的鏈接。其餘的你最喜歡並保持微笑:-) –

+2

'但不知道setIcon()是什麼問題。任何人都知道?' - 什麼問題?圖像被緩存,因此您需要創建一個新的圖標,正如mKobel的答案所展示的那樣。 – camickr

+0

@nIcE cOw:我知道這件事,但我的問題是獲取外部圖像,可能會從網上下載並在* temp *中寫入同一文件。然後顯示 –