2009-12-01 40 views
0

我的一位朋友要求我幫助他與Swing,並且我達到了無法解決問題的程度。 所以,首先我有一個ImagePanel圖像面板沒有重新繪製,除非系統事件

public class ImagePanel extends JPanel { 

    private Image img; 

    public void setImage(String img) { 
    setImage(new ImageIcon(img).getImage()); 
    } 

    public void setImage(Image img) { 
    int width = this.getWidth(); 
    int height = (int) (((double) img.getHeight(null)/img.getWidth(null)) * width); 
    this.img = img.getScaledInstance(width, height, Image.SCALE_SMOOTH); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
    g.drawImage(img, 0, 0, null); 
    } 
} 

而一個FileChooser,應打開所選圖像到ImagePanel。它簡單地稱爲ImagePanelsetImage。但圖像沒有畫。沒有重新組合,驗證和無效的幫助。

但是,當調整大小(使用鼠標)JFrame時,圖像被繪製。 所以,問題是 - 什麼方法調用大小(使用鼠標),這使得ImagePanel成功重新繪製。

+0

您是否設置了JFrame?如果你這樣做,你可以發佈代碼嗎? – 2009-12-01 20:57:04

+0

JFrame由NetBeans生成,所以我發現粘貼生成的代碼很奇怪。當然,ImagePanel被添加到JFrame中。 – Bozho 2009-12-01 21:20:21

回答

3

IconImage使用MediaTracker異步加載圖像。在你調用repaint,invalidate等的地方,圖像還沒有完成加載。

在你的paintComponent,與

g.drawImage(img, 0, 0, this); 

組件類有ImageObserver的的實現,將調用當圖像完成加載重繪更換

g.drawImage(img, 0, 0, null); 

0

調用重繪方法(documentation link)將導致面板重新粉刷。這會導致底層的繪畫調用,這也是導致JPanel在調整大小時繪製的原因。

+0

當我手動調用repaint時,無論是JFrame還是Image面板,都沒有任何反應。 – Bozho 2009-12-01 20:49:12

+0

您是否重複調用setImage以及調整大小,還是隻調用一次setImage然後調整窗口大小?也許你可以發佈更多的代碼。 – 2009-12-01 21:29:53

1

設置圖像並按照代碼進行繪畫不會改變組件的實際大小。根據包含幀的佈局和設置,可能會發生一些不同的事情 - 您的ImagePanel初始大小爲0x0,因此在放大幀並將更多空間分配給ImagePanel之前不會顯示;或者ImagePanel被手動調整爲不適合JFrame起始大小的大尺寸,在這種情況下,ImagePanel可能無法顯示,直到調整大小後有足夠的大小可用。

+0

謝謝。最初是調整大小的代碼,但我在嘗試中刪除了它。現在,結合Davon的答案,它是有效的。我希望我有兩個綠色的蜱蟲:) – Bozho 2009-12-01 21:37:24

相關問題