自定义JPanel与Netbeans

时间:2011-06-17 14:29:11

标签: java swing netbeans

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

答案: 我不知道,但JLabel与当前项目的图像配合得很好。 所以我现在将使用JLabel。谢谢大家。

3 个答案:

答案 0 :(得分:0)

我最近遇到了一些麻烦。

如果您打算将程序打包为可运行的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运行时,它始终显示“找不到图标”

答案 1 :(得分:0)

要加载图片,您可以使用此方法:

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

参数name具有以下约束:

  • 如果名称以/开头,则资源的绝对名称是/后面的名称部分。
  • 否则,绝对名称的格式如下:modified_package_name/name, 其中modified_package_name是此对象的包名称,/替换为.

有关详细信息,请参阅description of getResource(String name) method

例如,如果将此方法放在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 Designer中,您可以进行模拟。

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

答案 2 :(得分:0)

他们在GUI设计器中显示的关键是,当调用Form的默认构造函数时,它将存在。如果您可以作为资源访问图像(正如其他人建议的那样),那么在尝试运行您的类以在设计器中进行表单预览时,Netbeans将使用它在构建/类层次结构中。将此图像加载到Form的默认无参数构造函数中,它应该显示在设计器中。