在缩放JPanel图像时,宽度和高度必须为非零

时间:2016-11-21 15:04:42

标签: java image swing jpanel

我正在尝试缩放图像以适应GUI中的JPanel。每当我在JFrame中创建ImagePanel的新实例时,我都会得到一个异常,因为宽度和高度都是0.但是,我覆盖getPreferredSize()所以看起来宽度和高度应该是非 - 零价值。

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)

2 个答案:

答案 0 :(得分:1)

在可视GUI中显示面板之前,组件的大小不大。

因此,解决方案是使用paintComponent(...)方法动态缩放图像。

请注意,您可以直接使用drawImage(...)方法执行此操作。阅读API有一种方法,可以在绘制图像时指定图像的宽度/高度。

答案 1 :(得分:0)

来自Oracle&#39; s docs

  

&#34; pack()方法调整框架以使其所有内容都处于或   高于他们的首选尺寸 ......&#34;

因此,在您收录pack()的{​​{1}}之前,您的组件除了默认值之外没有任何尺寸 -

有关详细信息,请参阅以下答案: