簡體   English   中英

縮放JPanel的圖像時,寬度和高度必須不為零

[英]Width and Height must be non-zero when scaling image for JPanel

我正在嘗試縮放圖像以適合我的GUI中的JPanel。 每當我在JFrame中創建ImagePanel的新實例時, ImagePanel得到一個異常,因為width和height均為0。但是,我覆蓋了getPreferredSize()因此width和height似乎應該為非零值。

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)

在面板顯示在可見GUI中之前,組件沒有大小。

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

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

Oracle文檔中

pack()方法調整框架的大小, 以便其所有內容等於或大 於其首選大小 ...”

因此,直到在包含JFrame上調用pack()為止,您的組件都不會具有任何大小,只有默認的大小為1,即

有關更多信息,請參見以下答案:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM