gpt4 book ai didi

java - 缩放 JPanel 图像时宽度和高度必须非零

转载 作者:行者123 更新时间:2023-12-01 09:13:53 25 4
gpt4 key购买 nike

我正在尝试缩放图像以适合 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)

最佳答案

在面板显示在可见的 GUI 中之前,组件没有大小。

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

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

关于java - 缩放 JPanel 图像时宽度和高度必须非零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40723219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com