【问题标题】:How set image icon to JButton如何将图像图标设置为 JButton
【发布时间】:2013-02-02 22:00:04
【问题描述】:

我不太擅长创建 Swing 应用程序。所以我有疑问如何将图标设置为JButton

我的项目结构如下:

我在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")); 我有没有图像的简单按钮。

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

我查看了How do I add an image to a 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));

【问题讨论】:

    标签: java image swing packaging imageicon


    【解决方案1】:

    试试

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

    另外,尝试将此 .jpg 转换为 .png :D

    【讨论】:

    • 同样的 NullPointerException :(
    • Hm.. JButton 在 setIcon 之前被实例化,对吧?当您双击图像文件夹中的“button_next.jpg”时,会发生什么?它打开没有问题?
    • 是的,它打开没有任何问题。
    • @AlekseiBulgak 我看到你使用 Maven,所以你只需要使用 Maven 和 M2E 正常工作。拆分您的来源和资源并在您的 pom.xml 中正确指出它们
    【解决方案2】:

    如果您使用的是 Maven,那么您不需要做任何事情。 M2E 将为您处理一切。

    把你的源代码放在src/main/java

    将您的资源(图片、文本文件等)放入src/main/resources

    如果您不使用默认文件夹,则应修改pom.xml 文件以指示您的源和资源所在的位置。之后,右键单击您的项目,转到 Maven-->Update project... 并确保选中“从 pom.xml 更新项目配置”框

    就是这样。你应该很高兴。

    【讨论】:

      【解决方案3】:

      您是如何运行您的应用程序的?直接来自 Eclipse,还是通过 Maven 构建一个 jar?

      我在你的树中看到一个 pom.xml 文件,所以我怀疑你是通过 Maven 构建的。在这种情况下,Maven 可能不会将任何资源文件(即除了 .java 文件之外的任何文件)放入您的输出 jar 中。 Maven 期望源文件与资源位于不同的目录中。默认情况下,这些目录是 src/main/java 和 src/main/resources。但是,看起来您可能已经为您的项目自定义了源目录,因为我直接在 src 目录中看到了您的源文件。

      我会检查您生成的 .jar 文件,以确保图像实际上最终在其中。

      【讨论】:

        猜你喜欢
        • 2016-01-21
        • 1970-01-01
        • 1970-01-01
        • 2013-03-03
        • 1970-01-01
        • 2011-06-08
        • 1970-01-01
        • 1970-01-01
        • 2013-04-24
        相关资源
        最近更新 更多