Java 带有Netbeans的自定义JPanel

Java 带有Netbeans的自定义JPanel,java,swing,netbeans,Java,Swing,Netbeans,我正在创建一个自定义JPanel组件,我想在设计时显示一个背景图像。我的问题是:如何从当前项目加载图像文件 答复: 我不知道,但是JLabel可以很好地处理当前项目中的图像。 现在我将使用JLabel。谢谢大家。我最近在这方面遇到了一些麻烦 如果您打算像我一样将程序打包为可运行的JAR文件,我建议您使用以下代码。它要求所有图像都位于项目根目录中名为media的文件夹中 imgURL = getClass().getResource("/media/Image_to_be_loaded.jpg")

我正在创建一个自定义JPanel组件,我想在设计时显示一个背景图像。我的问题是:如何从当前项目加载图像文件

答复: 我不知道,但是JLabel可以很好地处理当前项目中的图像。
现在我将使用JLabel。谢谢大家。

我最近在这方面遇到了一些麻烦

如果您打算像我一样将程序打包为可运行的JAR文件,我建议您使用以下代码。它要求所有图像都位于项目根目录中名为media的文件夹中

imgURL = getClass().getResource("/media/Image_to_be_loaded.jpg");
if (imgURL != null) {
    image = new ImageIcon(imgURL, "");
    imageLabel = new JLabel(baeLogo);
} else {
    imageLabel = new JLabel("No icon found");
}

但是,我注意到,这段代码只有在从JAR文件运行时才起作用。当我直接从eclipse运行时,它始终显示未找到图标。要加载图像,可以使用以下方法:

ImageIcon loadImageIcon(String name) {
    URL imgURL = getClass().getResource(path);
    if (imgURL != null) {
        return new ImageIcon(imgURL);
    } else {
        System.err.println("Couldn't find file: " + path);
        return null;
    }
}
其中,参数名称具有以下约束:

如果名称以/开头,则资源的绝对名称是名称中/后面的部分。 否则,绝对名称为以下形式:修改的\u包\u名称/名称, 其中,修改后的_package_name是此对象的包名,带有/替换。。 有关详细信息,请参阅

例如,如果将此方法放在MyPanel.java文件中,并且具有以下包结构

swing/
  | - panel/
  |      | - MyPanel.java
  | - resources/
         | - my_image.jpg
可能比name参数更重要

../resources/my_image.jpg或/swing/panel/resources/my_image.jpg

但是swing/panel/resources/my_image.jpg和/resources/my_image.jpg都不是

更新: 下面是一个工作示例。在NetBeans UI设计器中,您可以进行模拟

package swing.panel;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ImagePanel extends JPanel {

    private Image img;

    public ImagePanel(String img) {
        this(new ImageIcon(img).getImage());
    }

    public ImagePanel(Image img) {
        this.img = img;
        Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
        setPreferredSize(size);
        setMinimumSize(size);
        setMaximumSize(size);
        setSize(size);
        setLayout(null);
    }

    @Override
    public void paintComponent(Graphics g) {
        g.drawImage(img, 0, 0, null);
    }

    /** Returns an ImageIcon, or null if the path was invalid. */
    private static ImageIcon loadImageIcon(String path) {
        URL imgURL = ImagePanel.class.getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL);
        } else {
            System.err.println("Couldn't find file: " + path);
                return null;
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run(){
                ImagePanel panel =
                        new ImagePanel(loadImageIcon("../resources/image.png").getImage());

                JFrame frame = new JFrame();
                frame.getContentPane().add(panel);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

在GUI设计器中显示某些内容的关键在于,当调用表单的默认构造函数时,它将出现在那里。如果您可以像其他人建议的那样作为资源访问映像,那么它将在Netbeans尝试运行类以在设计器中进行表单预览时使用的构建/类层次结构中可用。将此图像加载到表单的默认无参数构造函数中,它将显示在设计器中。

您可以尝试使用media/image\u to\u be\u loaded.jpg,而不使用/。有/没有路径规则是不同的。没有区别。不过谢谢你。getClass实际上调用了类加载器上的一个方法。我猜Eclipse运行一些自定义类加载器,它不知道包的根在哪里。。。试着以这样的方式发布一个问题,让其他人从中受益。你最好不要像以前那样编辑你的问题,而是把它作为一个答案,并对你的解决方案进行适当的描述。读这本书。