在 Java Swing 的菜单栏上显示图标
Displaying icon on menu bar in Java Swing
我有一个带 Swing G 的应用程序UI,我想在菜单栏中添加一个带有搜索按钮(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
生成的按钮根本不显示任何图标:
我没有收到任何错误消息,编译没有问题。即使我试图从 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);
}
}
如您所见,我现在按照@AndrewThompson 和@SergiyMedvynskyy 的建议使用 class.getResource(...) 加载图像,但这并不能解决问题。我还被告知我的 类 不应该是静态的,但是因为我的 Main 需要是静态的才能让我能够 运行 该程序并且我被告知我应该启动 UI 和 SwingUtilities.invokeLater(test::createAndShowGUI);
这也强制 createAndShowGUI() 是静态的,我不知道如何让它不是静态的。
对我来说,它在路径中没有提到文件夹“Resources”的情况下工作,
像那样:
Icon lupeIcon = new ImageIcon(test.class.getResource("/lupe_icon.png"));
但是,我不确定您的项目结构是否正确。
如果还是不行,尝试用小 'r' 重命名文件夹,也许还更改项目结构,这是我的结构:
\src\main\java... (all java files)
\src\main\resources (resources folder, it displayed for me like a package)
注意 - 我认为最好检查为什么你无法在调试中获取图像
在切换到 Icon lupeIcon = new ImageIcon(test.class.getResource("Resources/lupe_icon.png"));
以加载图标而不是 new ImageIcon("Resources/lupe_icon.png");
后,我注意到我得到的是 nullpointer-exceptions,尽管图像显然在那里。经过一番谷歌搜索后,我发现资源文件夹显然不仅仅是任何文件夹,而且必须按照建议 here.
标记为资源根文件夹
标记文件夹后一切正常:)
我有一个带 Swing G 的应用程序UI,我想在菜单栏中添加一个带有搜索按钮(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
生成的按钮根本不显示任何图标:
我没有收到任何错误消息,编译没有问题。即使我试图从 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);
}
}
如您所见,我现在按照@AndrewThompson 和@SergiyMedvynskyy 的建议使用 class.getResource(...) 加载图像,但这并不能解决问题。我还被告知我的 类 不应该是静态的,但是因为我的 Main 需要是静态的才能让我能够 运行 该程序并且我被告知我应该启动 UI 和 SwingUtilities.invokeLater(test::createAndShowGUI);
这也强制 createAndShowGUI() 是静态的,我不知道如何让它不是静态的。
对我来说,它在路径中没有提到文件夹“Resources”的情况下工作, 像那样:
Icon lupeIcon = new ImageIcon(test.class.getResource("/lupe_icon.png"));
但是,我不确定您的项目结构是否正确。
如果还是不行,尝试用小 'r' 重命名文件夹,也许还更改项目结构,这是我的结构:
\src\main\java... (all java files)
\src\main\resources (resources folder, it displayed for me like a package)
注意 - 我认为最好检查为什么你无法在调试中获取图像
在切换到 Icon lupeIcon = new ImageIcon(test.class.getResource("Resources/lupe_icon.png"));
以加载图标而不是 new ImageIcon("Resources/lupe_icon.png");
后,我注意到我得到的是 nullpointer-exceptions,尽管图像显然在那里。经过一番谷歌搜索后,我发现资源文件夹显然不仅仅是任何文件夹,而且必须按照建议 here.
标记文件夹后一切正常:)