繁体   English   中英

图像未加载到JFrame内的JPanel中

[英]Image not loading in JPanel that is within a JFrame

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

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;
    }
}
}

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

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”是在“窗口”可见并且我多次检查“图像路径”后从数据库中检索的代码。

如果向其中添加了“ main runnable”方法,则LoadImage.java可以独立工作并加载图像,但是我似乎无法在所需的面板中显示图像。 请提出有关如何解决我的问题的建议,我们将不胜感激!

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

  • Component的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完成绘制后,将其丢弃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM