如何在JButton上添加图片?

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

当这段代码运行时,会出现一个错误:Exception in thread "main" java.lang.IllegalArgumentException: input == null! 该错误发生在以下代码行:
Image img = ImageIO.read(getClass().getResource("Images\\BBishopB.gif"));

我不认为这个错误是由于Java代码找不到文件造成的,因为我的Images文件夹在src文件夹中(我使用Eclipse),正如上面链接所建议的那样。
有没有人有什么想法,可能是什么问题呢?
谢谢。


请在您的项目层次结构中提供图像路径。 - CAMOBAP
1
你是否实际检查了 getResource() 的返回值? - vstm
这是图像路径:C:\Documents and Settings\student\My Documents\Dropbox\ADVCS_Workspace\Chess_Program\src\Images - Tristan Hull
@TristanHull,图像位于何处并不重要。重要的是图像相对于相应的类文件的位置。很可能您的图像未被找到。所以首先要做的是:尝试查看图像是否被找到。此外,永远不要捕获异常而不在某个地方打印堆栈跟踪或留下异常的痕迹。这会使您的代码非常难以调试。 - Guillaume Polet
请查看我在Stack Overflow上与您的问题相关的答案。还有这个与如何将图像添加到您的项目相关的答案,以及这里是一个工作示例,包含您的项目的所有目录结构(它需要是这样的)。 - nIcE cOw
除非你要处理一个存档文件,否则不需要使用getResource()。请参见下面的答案。 - davidXYZ
5个回答

9
在使用Eclipse时,您不应将图像放在src文件夹中,而是应为此目的创建一个源文件夹。有关如何在Eclipse中将图像添加到资源文件夹的详细信息,请参考此链接。

1
+1 不错的链接 :) 是的,我认为可能是他没有正斜杠。 - David Kroukamp
更让我担心的是,不使用源文件夹来处理所说的东西,因为OP说图像在src文件夹中,而我认为这不是正确的方式。 - nIcE cOw
1
资源文件夹只是惯例。您不必使用特殊的“资源文件夹”来读取图像。您的路径只需要正确即可。 - davidXYZ
当你开始运行程序时,确实会这样。无论在你的资源文件夹中有什么内容,它都会自动转移到bin文件夹中。因此,当你使用Eclipse创建你的.jar文件时,你不必担心指定的路径是否有效。 - nIcE cOw
非常感谢,我一定会尝试的。 - Tristan Hull
1
那个回答一开始很好,但最后的大声喊叫让我头疼了.. :( - Andrew Thompson

2
使用此代码创建按钮。
JButton button = new JButton(new ImageIcon(getClass().getClassLoader()
                                          .getResource("Images/BBishopB.gif")));

你所做的是将 Image 设置为图标,但这样不起作用,因为 setIcon() 方法需要实现 Icon 接口的对象。希望能对你有所帮助。

如果找不到图像,这将无法解决他的问题。你回答的第二部分是不正确的,因为他正在将图像读取为Image,然后将该Image包装在ImageIcon中。所以代码的那一部分是正确的。 - Guillaume Polet
@GuillaumePolet 这部分直接从URL创建ImageIcon,而不涉及ImageIO和其他不必要的部分。 - Sri Harsha Chilakapati
你说过并且我引用一下:“这不起作用是因为setIcon()方法需要实现Icon接口的对象”。那个陈述是不正确的。 - Guillaume Polet
@GuillaumePolet请看这个链接http://docs.oracle.com/javase/7/docs/api/javax/swing/AbstractButton.html#setIcon(javax.swing.Icon)。这证明了我的说法。 - Sri Harsha Chilakapati
你说“它不起作用”,这是不正确的。而且,你的回答并不能解决问题。 - Guillaume Polet
显示剩余2条评论

2
尝试在getResource()中的包名前加上正斜杠,像这样:

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

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

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的最有可能的候选项。尽管这并不能告诉您为什么会出现错误消息,但它大大缩小了问题的范围。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接