我試圖縮放圖像以適合我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)
你可以顯示堆棧跟蹤嗎? – MordechayS
@MordechayS是的,我剛剛添加了棧跟蹤 – tpm900
'getPreferredSize()'是一個請求,而不是一個保證。當你第一次創建'JPanel'時,它不是組件層次結構的一部分,所以它沒有機會調整大小。在面板添加到父容器並進行佈局後,您需要調用'scaleImage'。或者,您可以使用首選大小作爲參數,而不是實際大小。 – resueman