在Java Swing中在菜单栏上显示图标
在Java Swing中在菜单栏上显示图标
我有一个带有Swing GUI的应用程序,我想在菜单栏中添加一个带有搜索按钮(放大镜图标)的搜索字段。然而,放大镜图标不会显示。这是我的代码:
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
结果按钮根本没有显示图标:
[图片](https://i.stack.imgur.com/9qL5o.png)
我没有收到任何错误消息,它可以编译而没有问题。即使我尝试从new 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); } }
如您所见,我现在使用class.getResource(...)加载图像,这是由@AndrewThompson和@SergiyMedvynskyy建议的,但这并没有解决问题。还有人告诉我我的类不应该是静态的,但由于我的Main需要是静态的,这样我才能运行程序,并且我被告知我应该使用`SwingUtilities.invokeLater(test::createAndShowGUI);`来启动UI,这也强制createAndShowGUI()是静态的,我不知道如何使它不是静态的。
在Java Swing中在菜单栏上显示图标的问题出现的原因是项目结构不正确。解决方法是检查项目结构,并确保资源文件夹正确命名为"Resources"。如果问题仍然存在,可以尝试将文件夹名称改为小写字母"r",并重新调整项目结构。以下是一个示例的项目结构:
\src\main\java...(所有Java文件) \src\main\resources(资源文件夹,显示为一个包)
此外,建议在调试过程中检查为何无法获取图像。还可以查看名为"IconManager"的库,链接为:github.com/oleg-cherednik/IconManager。这是我几年前专门为解决这个问题而创建的库。
在Java Swing中菜单栏中显示图标的问题出现的原因是资源文件夹没有被正确标记为资源根文件夹。解决方法是将资源文件夹标记为资源根文件夹。
在切换到Icon lupeIcon = new ImageIcon(test.class.getResource("Resources/lupe_icon.png"));
加载图标的方式后,我发现尽管图像明显存在,但我仍然收到了空指针异常。经过一些搜索,我发现资源文件夹显然不仅仅是一个普通的文件夹,而是必须标记为资源根文件夹,如这里建议的那样。标记了文件夹之后一切正常工作 🙂