如何将图像图标设置为JButton

4

我不太擅长创建Swing应用程序。所以我有一个问题,如何将图标设置给JButton

我的项目结构如下:

enter image description here

我在MainWindow类中有一个简单的JButton,它看起来像这样:

tactButton = new JButton("next tact");

我想使用setIcon方法将图片设置为此按钮。我的代码如下:

tactButton.setIcon(new ImageIcon(getClass().getResource("/images/button_next.jpg")));

但是当我启动应用程序时,出现了异常:

java.lang.NullPointerException
    at javax.swing.ImageIcon.<init>(ImageIcon.java:205)
    at by.bulgak.conveyor.gui.MainWindow.<init>(MainWindow.java:117)
    at by.bulgak.conveyor.gui.MainWindow$1.run(MainWindow.java:46)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:682)
    at java.awt.EventQueue$3.run(EventQueue.java:680)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

所以我尝试了不同的方法:

  • 将所有图片放在与MainWindow类相同的文件夹中
  • 将图片放在项目根文件夹中
  • 尝试像这样做:tactButton.setIcon(new ImageIcon("/images/button_next.jpg"));

但是我遇到了这个异常,或者如果我使用tactButton.setIcon(new ImageIcon("/images/button_next.jpg"));,那么我只会得到一个没有图像的简单按钮。

最后,我写了绝对路径到我的图像,这很好用(但是绝对路径不是一个好主意)。你能帮我吗?

我看了这个问题如何将图像添加到JButton,并试图像那样做。

更新

创建按钮和设置图标的完整代码:

tactButton = new JButton("next tact");
tactButton.setSize(100, 100);
tactButton.setIcon(new ImageIcon(MainWindow.class.getResource("/images/button_next.jpg")));
tactButton.addActionListener(new ProcessorNextStepListener(this));
3个回答

4
如果您正在使用Maven,则不需要做任何事情。M2E会为您处理一切。
将您的源代码放在src/main/java中。
将您的资源(图片、文本文件等)放在src/main/resources中。
如果您不使用默认文件夹,则应修改pom.xml文件以指示您的源代码和资源所在位置。之后,右键单击项目,转到Maven->更新项目…并确保您勾选了“从pom.xml更新项目配置”框。
就这样。您现在可以开始使用了。

3

试一试

new ImageIcon(MainWindow.class.getResource("/images/button_next.jpg");

此外,尝试将此 .jpg 文件转换为 .png 格式 :D

同样的空指针异常 :( - Aliaksei Bulhak
嗯.. JButton 在 setIcon 之前被实例化了,对吧?当你在图像文件夹中双击 "button_next.jpg" 时,会发生什么?它能正常打开吗? - Gabriel Câmara
是的,它可以毫无问题地打开。 - Aliaksei Bulhak
2
比@Gagandeep Bali的任何教程都好。 - mKorbel
真的很好奇谁点了赞,因为它执行的功能与问题中的代码完全相同。这种问题的常见原因是图像资源没有正确地位于类路径的 jar 目录中。 - Guillaume Polet
1
@AlekseiBulgak 我看到你正在使用Maven,所以你只需要正确地使用Maven和M2E。将你的源代码和资源文件分开,并在pom.xml中正确指定它们的位置。 - Guillaume Polet

1
你是如何运行你的应用程序的?是直接从Eclipse运行,还是通过Maven构建一个jar包?
我在你的项目中看到了一个pom.xml文件,所以我猜测你是通过Maven构建的。如果是这样,Maven可能没有将任何资源文件(即除.java文件之外的所有文件)放入你的输出jar包中。Maven期望源文件和资源文件放在不同的目录中。默认情况下,这些目录是src/main/java和src/main/resources。但是,看起来你可能已经为你的项目自定义了源目录,因为我在src目录中直接看到了你的源文件。
我建议检查你生成的.jar文件,确保图像实际上已经被包含在里面了。

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