我正在尝试在工具栏中添加一个图标但是放入它的最佳位置是什么?我的桌面或应该在项目文件中创建一个新文件,或者添加所有图片,因为它没有显示,这是我的代码:
JToolBar toolBar = new JToolBar();
String[] iconFiles = {"pen-icon","",""};
String[] buttonLabels = {"New","Open","Save"};
icon = new ImageIcon[iconFiles.length];
Obutton = new JButton[buttonLabels.length];
for (int i = 0; i < buttonLabels.length; ++i) {
icon[i] = new ImageIcon(iconFiles[i]);
Obutton[i] = new JButton(icon[i]);
Obutton[i].setToolTipText(buttonLabels[i]);
if (i == 3)
toolBar.addSeparator();
toolBar.add(Obutton[i]);
}
答案 0 :(得分:6)
我会使用Action
。这是AbstractAction
构造函数
public AbstractAction(String name, Icon icon)
- 使用指定的名称和小图标创建一个Action。
<强>参数:强>
name - 操作的名称(Action.NAME);忽略值为null
icon - 动作的小图标(Action.SMALL_ICON);忽略null值
使用Action
的好处是可以重复用于具有类似用途的组件。因此,假设您希望工具栏中有一个图标按钮来打开文件,并且JMenuItem
中还有一个JMenu
也可以打开文件。他们可以共享相同的操作,从而共享相同的图标,操作命令和要执行的操作。
Action action = new AbstractAction("someActionCommand", someIcon) {
@Override
public void actionPerformed(ActionEvent e) {
// do something.
}
};
toolbar.add(action);
以上将自动为您设置图标,但不会自动为您设置字符串。在JMenuItem
中,它会放置字符串和图标。
然后只需将Action
添加到工具栏。
要回答真正的问题,正如@MadProgrammer所说,您应该使用
将图片加载为embedded resource ImageIcon icon = new ImageIcon(MyClass.class.getResource("/resources/images/image.png"));
/resources/images
目录位于src
,getResource()
返回一个网址。在构建时,IDE应该将文件复制到类路径中。
ProjectRoot
src
resources
images
image.png
您会发现在使用文件系统中的文件时,部署时无法正常工作
以下是一个示例,其中JMenuItem
和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();
}
});
}
}
答案 1 :(得分:5)
此类型的资源通常最好包含在应用程序上下文中(例如jar文件)。这减少了有人篡改它的机会,因为解压缩,修改和重新打包jar文件然后简单地替换文件要花费更多时间。它还可以减少您需要分发的内容,因为它变得独立。
这些被称为嵌入式资源。
在这种情况下,将它们置于此上下文中,许多人使用“资源”文件夹来存储这些类型的文件,但有时,您可能需要与该类上下文相关的内容。这取决于你。
这会引发加载这些资源的问题,因为您无法再使用File
之类的内容来引用它们。
通常,您可以使用Class#getResource(String)
,其返回URL
或Class#getResourceAsStream(String)
,返回InputStream
。这为您提供了加载这些嵌入资源所需的一切。
ImageIcon(String)
期望该值为文件引用,这意味着它不适用于嵌入式资源,但ImageIcon
提供了一个以URL
作为引用的构造函数,意味着你需要使用
icon[i] = new ImageIcon(getClass().getResource(iconFiles[i]));
加载图片。
根据您的示例,图像需要相对于类(即在与包结构相同的目录结构中)。您如何实现这一目标取决于您的开发环境。
请记住,您还可以指定getResource
的相对路径,甚至在某些上下文中指定绝对路径。绝对路径basic在搜索资源时将类路径的元素作为指定路径的前缀。