我会使用一个Action
. 这是AbstractAction
构造函数
public AbstractAction(String name, Icon icon)
- 创建一个具有指定名称和小图标的动作。
参数:
name - 动作的名称(Action.NAME);null 值被忽略
icon - 动作的小图标 (Action.SMALL_ICON);忽略 null 值
使用 an 的好处Action
是可以重复用于具有类似目的的组件。所以说你想在工具栏中有一个图标按钮来打开一个文件,并且还有一个JMenuItem
可以JMenu
打开文件的按钮。它们可以共享相同的动作,从而共享相同的图标、动作命令和要执行的动作。
Action action = new AbstractAction("someActionCommand", someIcon) {
@Override
public void actionPerformed(ActionEvent e) {
// do something.
}
};
toolbar.add(action);
上面会自动为您放置图标,而不是字符串。在 aJMenuItem
中,它会同时放置字符串和图标。
然后只需添加Action
到工具栏。
在如何使用操作中查看更多信息
正如@MadProgrammer 指出的那样,要回答您真正的问题,您应该将图像加载为嵌入式资源,使用
ImageIcon icon = new ImageIcon(MyClass.class.getResource("/resources/images/image.png"));
/resources/images
目录在哪里src
,并getResource()
返回一个 URL。构建后,您的 IDE 应为您将文件复制到类路径中。
ProjectRoot
src
resources
images
image.png
您会发现,当使用文件系统中的文件时,在部署时将无法正常工作
这是一个示例,其中 theJMenuItem
和JToolBar
按钮共享相同的操作。请注意,JToolBar
我所要做的就是添加Action
,我不需要为它创建一个按钮。JToolBar
自动使其成为按钮,无需操作命令
我从下面的文件结构中使用这个“open.gif”并使用
ImageIcon icon = new ImageIcon(
ActionTest.class.getResource("/resources/image/open.gif"));
这是结果
这是代码。享受!
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;
public class ActionTest {
public ActionTest() {
ImageIcon openIcon = new ImageIcon(
ActionTest.class.getResource("/resources/image/open.gif"));
ImageIcon saveIcon = new ImageIcon(
ActionTest.class.getResource("/resources/image/save.gif"));
ImageIcon newIcon = new ImageIcon(
ActionTest.class.getResource("/resources/image/new.gif"));
Action openAction = new AbstractAction("Open", openIcon) {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Open File");
}
};
Action saveAction = new AbstractAction("Save", saveIcon) {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Save File");
}
};
Action newAction = new AbstractAction("New", newIcon) {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("New File");
}
};
JMenuItem openMenuItem = new JMenuItem(openAction);
JMenuItem saveMenuItem = new JMenuItem(saveAction);
JMenuItem newMenuItem = new JMenuItem(newAction);
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
fileMenu.add(openMenuItem);
fileMenu.add(saveMenuItem);
fileMenu.add(newMenuItem);
menuBar.add(fileMenu);
JToolBar toolBar = new JToolBar();
toolBar.add(Box.createHorizontalGlue());
toolBar.setBorder(new LineBorder(Color.LIGHT_GRAY, 1));
toolBar.add(newAction);
toolBar.add(openAction);
toolBar.add(saveAction);
JFrame frame = new JFrame("Toolbar and Menu Test");
frame.setJMenuBar(menuBar);
frame.add(toolBar, BorderLayout.PAGE_START);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ActionTest();
}
});
}
}