2016-11-21 76 views
0

我試圖縮放圖像以適合我GUI中的JPanel。每當我在JFrame中創建一個ImagePanel的新實例時,我會得到一個異常,因爲寬度和高度均爲0.但是,我忽略了getPreferredSize(),因此寬度和高度看起來應該是非零值。當爲JPanel縮放圖像時,寬度和高度必須爲非零

public class ImagePanel extends JPanel { 

private Image image; 

public ImagePanel() { 
    try { 
     image = ImageIO.read(new File("resources/opening.jpg")); 
     image = scaleImage(image); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.drawImage(image, 0, 0, this); 
} 

public void setImage(Image i) { 
    image = scaleImage(i); 
} 

@Override 
public Dimension getPreferredSize() { 
    return new Dimension(500, 500); 
} 

public Image scaleImage(Image i) { 
    return i.getScaledInstance(getWidth(), getHeight(), Image.SCALE_SMOOTH); 
} 
} 

這裏是堆棧跟蹤:

Exception in thread "main" java.lang.IllegalArgumentException: Width (0) and height (0) must be non-zero 
at java.awt.image.ReplicateScaleFilter.<init>(ReplicateScaleFilter.java:102) 
at java.awt.image.AreaAveragingScaleFilter.<init>(AreaAveragingScaleFilter.java:77) 
at java.awt.Image.getScaledInstance(Image.java:172) 
at ImagePanel.scaleImage(ImagePanel.java:40) 
at ImagePanel.<init>(ImagePanel.java:18) 
at GUIFrame.<init>(GUIFrame.java:44) 
at main.main(main.java:6) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
+0

你可以顯示堆棧跟蹤嗎? – MordechayS

+0

@MordechayS是的,我剛剛添加了棧跟蹤 – tpm900

+0

'getPreferredSize()'是一個請求,而不是一個保證。當你第一次創建'JPanel'時,它不是組件層次結構的一部分,所以它沒有機會調整大小。在面板添加到父容器並進行佈局後,您需要調用'scaleImage'。或者,您可以使用首選大小作爲參數,而不是實際大小。 – resueman

回答

1

直到面板被顯示在一個可見GUI的部件不具有大小。

因此,解決方案是在paintComponent(...)方法中動態縮放圖像。

請注意,您可以直接使用drawImage(...)方法執行此操作。閱讀API有一種方法,允許您在繪製圖像時指定圖像的寬度/高度。

0

Oracledocs

「的pack()方法尺寸幀,使得其所有內容均達到或 其優選尺寸以上...」

因此,直到您在包含JFrame的電話上撥打pack() - 您的組件將不會有任何大小,除了默認的大小 - 即

看到這些解答獲得更多信息:

相關問題