Java Swing在MigLayout中添加图像代码似乎不起作用?

Java Swing在MigLayout中添加图像代码似乎不起作用?,java,image,swing,javax.imageio,miglayout,Java,Image,Swing,Javax.imageio,Miglayout,因此,我有自己的自定义JFrame,我试图在其中创建一个自动调整大小的图像,以包含在我的JFrame的内容JPanel,frameContent中。我的JPanel布局管理器是migloayout,因此我想我应该再次创建JPanel的子级,名为ImagePanel。下面是我的ImagePanel类的最终外观: class ImagePanel extends JPanel{ private static final long serialVersionUID = -56020320216

因此,我有自己的自定义
JFrame
,我试图在其中创建一个自动调整大小的图像,以包含在我的
JFrame
的内容
JPanel
frameContent
中。我的
JPanel
布局管理器是
migloayout
,因此我想我应该再次创建
JPanel
的子级,名为
ImagePanel
。下面是我的
ImagePanel类
的最终外观:

class ImagePanel extends JPanel{
    private static final long serialVersionUID = -5602032021645365870L;
    private BufferedImage image;

    public ImagePanel() {
        try {                
            image = ImageIO.read(new File(getClass().getResource("../res/Title.png").toURI()));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, getWidth(), getHeight(), null);      
    }

}
现在由于某种原因,它看起来并不是真的在“工作”。当我设置主
JFrame
的内容时,我调用:

framecontent.add(new ImagePanel(),  "pos 5% 5% 95% 45%");
这并不是说它没有添加组件,因为有了这段代码,我可以看到以下屏幕:

请注意它是如何在灰色背景下勾勒出该区域的,这意味着正在运行
paintComponent(g)
方法,并且程序也没有输出任何错误,这很奇怪,这意味着它正在查找我的图像,只是没有放置它

以下是我的文件层次结构的外观:

Project Folder >
    src >
        res >
            Title.png (Picture I want to retrieve)
        guiwork >
            Working.class (Class that is running instructions/ main)
已将其全部修复,以下是自动调整大小的结果:

请注意它是如何在灰色背景下勾勒出该区域的,这意味着正在运行paintComponent(g)方法,并且该程序也没有输出任何错误,这很奇怪,这意味着它正在查找我的图像,而不是放置它

不是这样,因为空映像不会抛出错误。为了证明这一点,在paintComponent方法中测试image变量,您可能会发现它实际上为null

i、 例如,试试这个:

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    System.out.println("image is null: " + (image == null)); // TODO: Delete this
    g.drawImage(image, getWidth(), getHeight(), null);      
}
解决方案:不要将资源更改为文件,而是按原样使用资源,并确保在正确的位置查找资源


编辑
chit,您正在绘制超出组件边界的图像:

g.drawImage(image, getWidth(), getHeight(), null);  
尝试:


编辑2
如果您尝试一个简单的测试程序,比如:

import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;

public class TestImage {
   public TestImage() throws IOException {
      String path = "/res/Title.png";
      BufferedImage img = ImageIO.read(getClass().getResource(path));
      ImageIcon icon = new ImageIcon(img);
      JOptionPane.showMessageDialog(null, icon);
   }
   public static void main(String[] args) {
      try {
         new TestImage();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

并确保将其放置在与当前类相同的位置。它运行吗?

对于那些可能无法理解气垫船答案的人:

假设您有一个面板,希望在其中添加一个可缩放的图像,下面的代码将为您执行此操作

import net.miginfocom.swing.MigLayout;
import javax.swing.*;
import java.awt.*;

public class MasterSlidePanel extends JPanel {
    private ImageIcon imageIcon;
    private JLabel image;

    public MasterSlidePanel() {
        super(new MigLayout("", "2% [] 2%", "2% [] 2%"));
    }

    @Override
    protected void paintComponent(Graphics g) {
        image.setIcon(new ImageIcon(imageIcon.getImage().getScaledInstance(image.getWidth(), image.getHeight(), Image.SCALE_SMOOTH)));
        super.paintComponent(g);
    }

    public void setImage(SlidePanel panel) {
        imageIcon = <Where you get the imageIcon>;
        image = new JLabel();
        image.setMinimumSize(new Dimension(10, 10));
        image.setPreferredSize(new Dimension(10, 10));
        this.add(image, "width 96%, height 96%");
    }
}
import net.miginfocom.swing.migloayout;
导入javax.swing.*;
导入java.awt.*;
公共类MasterSlidePanel扩展了JPanel{
私人图像图标;
私有JLabel图像;
公共主幻灯片面板(){
超级(新的MIG布局(“,”2%[]2%“,”2%[]2%”);
}
@凌驾
受保护组件(图形g){
setIcon(新的ImageIcon(ImageIcon.getImage().getScaledInstance(image.getWidth(),image.getHeight(),image.SCALE_-SMOOTH));
超级组件(g);
}
公共无效设置图像(滑动面板){
图像图标=;
image=新的JLabel();
图像。设置最小尺寸(新尺寸(10,10));
image.setPreferredSize(新维度(10,10));
添加(图像,“宽度96%,高度96%”;
}
}
我们在面板中添加了两个新成员:image和imageIcon。当应用程序需要绘制面板时,会加载imageIcon的缩放图标并将其提供给image

为了防止0高度/宽度错误,我们向JLabel添加了一个minimumsize

希望这有帮助


信用卡仍然会被放在装满鳗鱼的气垫船上。

@tanishalfelven:嗯,它输出了什么?@tanishalfelven:请看我的编辑,开头是“哦,chit”。@tanishalfelven:你根本不应该在这里使用文件。正如我提到的,坚持使用资源。类的
getResource()
返回URL,而
ImageIO.read(…)
接受URL参数。使用它。@tanishalfelven:关于路径,您可能希望发布一个与类文件相关的路径图像。@tanishalfelven:请参阅上一条注释上方的注释。如果您使用的是Eclipse,请显示包资源管理器的图像,向我们显示您的图像相对于类文件/项目的位置。
import net.miginfocom.swing.MigLayout;
import javax.swing.*;
import java.awt.*;

public class MasterSlidePanel extends JPanel {
    private ImageIcon imageIcon;
    private JLabel image;

    public MasterSlidePanel() {
        super(new MigLayout("", "2% [] 2%", "2% [] 2%"));
    }

    @Override
    protected void paintComponent(Graphics g) {
        image.setIcon(new ImageIcon(imageIcon.getImage().getScaledInstance(image.getWidth(), image.getHeight(), Image.SCALE_SMOOTH)));
        super.paintComponent(g);
    }

    public void setImage(SlidePanel panel) {
        imageIcon = <Where you get the imageIcon>;
        image = new JLabel();
        image.setMinimumSize(new Dimension(10, 10));
        image.setPreferredSize(new Dimension(10, 10));
        this.add(image, "width 96%, height 96%");
    }
}