微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Java Swing的菜单栏上显示图标

如何解决在Java Swing的菜单栏上显示图标

我有一个带有Swing GUI的应用程序,我想在菜单栏中添加带有搜索按钮(lupe图标)的搜索字段。但是,lupe图标将不会显示。这是我的代码

public class Ui_Frame {

    public static void main(String[] args) {
        SwingUtilities.invokelater(Ui_Frame::createAndShowGUI);
    }
    

    private static void createAndShowGUI() {
         f = new JFrame("Myframe"); 

         ...

         JMenuBar menubar = new JMenuBar();
         Icon lupeIcon = new ImageIcon("Resources/lupe_icon.png");
         JButton j_searchButton = new JButton(lupeIcon);
         menubar.add(j_searchButton);

         ...

         f.setJMenuBar(menubar);
         f.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
         f.pack();
         f.setVisible(true);

我的项目结构就像

Project 
       Src
          Ui_Frame.java
          Resources 
                 lupe_icon.png 

结果按钮完全不显示图标:

enter image description here

我没有收到任何错误消息,它编译时没有问题。即使当我尝试从新的ImageIcon(...)捕获任何异常时,也没有得到关于错误原因的任何提示

关于我在这里做错什么的任何想法?

编辑

这是一个最小的示例:

import javax.swing.*;

public class test {

    private static JFrame f;

    public static void main(String[] args) {
        SwingUtilities.invokelater(test::createAndShowGUI);
    }

    private static void createAndShowGUI() {

        f = new JFrame("Test");
        JMenuBar menubar = new JMenuBar();

        Icon lupeIcon = new ImageIcon(test.class.getResource("/Resources/lupe_icon.png"));
        JButton j_searchButton = new JButton(lupeIcon);
        menubar.add(j_searchButton);

        f.setJMenuBar(menubar);
        f.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setSize(500,500);
        f.setVisible(true);
    }
}

如您所见,我现在按照@AndrewThompson和@SergiyMedvynskyy的建议,使用class.getResource(...)加载图像,但这并不能解决问题。还告诉我我的类不应该是静态的,但是由于我的Main必须是静态的才能运行程序,所以我被告知我应该使用SwingUtilities.invokelater(test::createAndShowGUI);启动UI 这也迫使createAndShowGUI()是静态的,我不知道如何使它不是静态的。

解决方法

对我来说,它的工作原理是在路径中不提及文件夹“ Resources”, 像这样:

Icon lupeIcon = new ImageIcon(test.class.getResource("/lupe_icon.png"));

但是,我不确定您的项目结构是否正确。

如果仍然无法使用,请尝试使用小“ r”重命名文件夹,也许还更改项目结构,这是我的结构:

\ src \ main \ java ...(所有Java文件)

\ src \ main \ resources(资源文件夹,它像软件包一样显示给我)

注意-我认为最好是检查为什么无法在调试中获取图像

,

切换到Icon lupeIcon = new ImageIcon(test.class.getResource("Resources/lupe_icon.png"));而不是new ImageIcon("Resources/lupe_icon.png");来加载图标后,我注意到尽管图像明显存在,但我得到了nullpointer-exception。经过一番谷歌搜索,我发现资源文件夹显然不仅是任何文件夹,而且还必须按照建议here标记为资源根文件夹。

标记文件夹后,一切正常:)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。