【问题标题】:Image not loading in JPanel that is within a JFrame图像未加载到 JFrame 内的 JPanel 中
【发布时间】:2013-06-26 16:48:22
【问题描述】:

我有一个 JFrame,它有 4 个不同的面板。下图中右侧的黑框是图像面板。我正在尝试编写一个类,它允许我将图像加载到程序中任何其他类中的任何面板中。

http://sdrv.ms/14TEq2T

LoadImage.java

package sf;

import java.awt.*;
import java.awt.image.*;
import javax.swing.ImageIcon;

public class LoadImage extends Component {

BufferedImage img;

public void paint(Graphics g) {
    g.drawImage(img, 0, 0, null);
}

public LoadImage(String filename) {
   try {         
       System.out.println(filename);
       img = new ImgUtils().scaleImage(380, 360, filename);           
   } catch (Exception e) {
       System.out.println("File not found");
   }

}

class ImgUtils {

    public BufferedImage scaleImage(int WIDTH, int HEIGHT, String filename) {
        BufferedImage bi = null;

        try {
            ImageIcon ii = new ImageIcon(filename);
            bi = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = (Graphics2D) bi.createGraphics();
            g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
            g2d.drawImage(ii.getImage(), 0, 0, WIDTH, HEIGHT, null);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

        return bi;
    }
}
}

我用于在其他类中加载图像的代码。

private void getProductImage() {

    try {
        String path = getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
        String decodedPath = URLDecoder.decode(path, "UTF-8");
        String newPath = decodedPath.replace("build/classes/", "src/productImages/");

        productImagePanel.add(new LoadImage(newPath + imageCode + ".jpg"));
        revalidate();
        pack();


    } catch (Exception e) {
        e.printStackTrace();
    }
}

“imageCode”是窗口可见后从数据库中检索的代码,我已经多次检查了图像的路径。

LoadImage.java 独立工作,如果添加了“主可运行”方法,则加载图像,但是我似乎无法在我想要的面板中显示图像。请就如何解决我的问题提出建议,感谢任何帮助!

【问题讨论】:

    标签: java image swing jpanel preferredsize


    【解决方案1】:

    您的问题很可能是您试图将图像作为组件加载到 JPanel。问题包括:

    • 组件的 preferredSize 很可能是 [0, 0],因此它可能会尝试显示图像,但太小而无法这样做。
    • JPanel 中可能已经添加了其他组件
    • JPanel 的布局可能不适合新添加的组件。
    • 您不应在没有明确需要的情况下将重量级(组件)与重量级(大多数其他非顶级 Window Swing 组件)混合使用。

    我建议:

    • 在创建 JPanel 时将 JLabel 添加到仅显示 JPanel 的图像中。
    • 为您的 productImagePanel 提供一个接受 Image 或 ImageIcon 的方法,然后从 Image 创建 ImageIcon 或使用提供的 ImageIcon 设置 JLabel 的图标。
    • 确保 JPanel 使用允许 JLabel 完全显示自身的布局。布局管理器教程可以帮助解决这个问题。
    • 显示 JPanel 的那个或所有图像都是为了显示图像而不是其他任何东西,摆脱它,而是单独使用 JLabel,然后直接将您的图标添加到它。

    顺便说一句:您应该处理 创建的任何 Graphics 和 Graphics2D 对象(但不是 JVM 提供给您的任何对象)。这意味着当您在 ImageUtilities 中使用 g2d 完成绘图后,将其丢弃。

    【讨论】:

    • 感谢您的意见。我熟悉使用 JLabel 的图标来显示图像。我试图避免使用 JLabel 来显示图像,但如果我无法通过这些方法获得任何结果,我会使用它..
    • 另外,LoadImage.java 中的 Imgutils 类正在调整图像大小以适应 JPanel 的大小,我认为大小不是问题。此外,当 Frame 初始化并显示时,Panel 是空的,没有其他组件。
    • @HMH:您可以将图像加载到 JPanel 中并使用 JPanel 的 paintComponent 方法绘制它,但同样,如果您这样做,我会从一开始就将 JPanel 添加到 GUI 中仅更改图像部分本身。换句话说,绘图组件不应该改变,但它所绘制的图像可能被允许改变。但同样,我敢打赌您的组件的大小是 0,0 或 1,1。您可以通过在paint 方法中添加System.out.println(getSize()) 来测试您知道的这一点。此外,如果没有必要,您应该避免混合使用重量较重和重量较轻的组件。
    • JPanel 在窗口出现之前已经添加到 GUI 中,就像你说的那样(面板大小:400、400 和图像的大小:380、360,这就是 LoadImage 中 ImgUtils 类的用途.java)。 “更改图像部分”是我需要帮助的事情。我会按照你的建议尝试“paintComponent”方法,谢谢。
    • @HovercraftFullOfEels 尝试了您对paintComponent 的建议,但不幸的是它没有奏效。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    相关资源
    最近更新 更多