4

我正在编写一个程序,该程序需要我有一个顶部带有图像的按钮,但是,到目前为止,我还不能让它工作。我检查了该站点上的其他几篇文章,包括如何将图像添加到 JButton
我的代码:

public class Tester extends JFrame
{
    public Tester()
    {
        JPanel panel = new JPanel();
        getContentPane().add(panel);
        panel.setLayout(null);

        setTitle("Image Test");
        setSize(300,300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JButton button = new JButton();
        try 
        {
            Image img = ImageIO.read(getClass().getResource("Images\\BBishopB.gif"));
            button.setIcon(new ImageIcon(img));
        } 
        catch (IOException ex) {}

        button.setBounds(100,100,100,100);
        panel.add(button);
    }

    public static void main(String[] args)
    {
        Tester test = new Tester();
        test.setVisible(true);
    }
}

当此代码运行时,会出现错误:线程“main”中的异常 java.lang.IllegalArgumentException: input == null! 此错误发生在以下行:

Image img = ImageIO.read(getClass().getResource("Images\\BBishopB.gif"));

我不认为此错误是由于 java 代码找不到该文件,因为我的 Images 文件夹位于 src 文件夹中(我使用的是 Eclipse),正如上面链接所推荐的那样。
有没有人对问题可能有任何想法?
谢谢。

4

5 回答 5

9

在使用 Eclipse 时,您不会将图像保存在src 文件夹中,而是Source Folder为此目的创建一个。请参阅此链接,了解如何在 Eclipse 中将图像添加到资源文件夹

于 2012-10-02T14:17:14.233 回答
2

使用它来创建按钮。

JButton button = new JButton(new ImageIcon(getClass().getClassLoader()
                                          .getResource("Images/BBishopB.gif")));

而你正在做的是将 设置Image为图标。这不起作用,因为该setIcon()方法需要实现Icon接口的对象。希望这可以帮助。

于 2012-10-02T14:07:46.367 回答
2

尝试在包名前加一个斜杠,getResource()如下所示:

Image img = ImageIO.read(getClass().getResource("/Images/BBishopB.gif"));
于 2012-10-02T14:14:56.757 回答
1

您可以直接找到图像:

JButton jb = new JButton(new ImageIcon("pic.png")); //pic is in project root folder
//Tip: After placing the image in project folder, refresh the project in Eclipse.

或者,如果图像将在 JAR 中,我通常会创建一个函数来为我进行检索,以便我可以重新使用它。

public static ImageIcon retrieveIcon(String path){
    java.net.URL imgUrl = 'classpackage'.'classname'.class.getResource(path);
    ImageIcon icon = new ImageIcon(imgUrl);
    return icon;
}

那我就做

JButton jb = new JButton(retrieveIcon("/pic.png"));
于 2012-10-02T14:22:06.067 回答
1
Image img = ImageIO.read(getClass().getResource("Images\\BBishopB.gif"));

这条线试图一次做太多事情,这使得当你遇到错误时很难追踪到错误。我建议拆分它:

URL imgURL = getClass().getResource("Images\\BBishopB.gif");
Image img = ImageIO.read(imgURL);

现在您可以使用 Eclipse 调试器检查 的返回值imgURL,这是最有可能用于 NPE 的候选对象。尽管这并没有告诉您为什么会收到错误消息,但它大大缩小了问题的范围。

于 2012-10-03T04:08:03.993 回答