How to add an ImageIcon to a JToolBar
imageicon, java, jtoolbar, swing
Solution
I would use an `Action`. Here is the `AbstractAction` constructor
`public AbstractAction(String name, Icon icon)` - Creates an Action with the specified name and small icon.
Parameters: name - the name (Action.NAME) for the action; a value of null is ignored icon - the small icon (Action.SMALL_ICON) for the action; a value of null is ignored
The benefit of using an `Action` is that is can be reused for components with similar purposes. So say you want to have an icon button in the toolbar to open a file, and also have a `JMenuItem` in a `JMenu` that also opens a file. They could share the same action, thus sharing the same icon, action command, and action to perform.
Action action = new AbstractAction("someActionCommand", someIcon) {
@Override
public void actionPerformed(ActionEvent e) {
// do something.
}
};
toolbar.add(action);
The above will automatically put the icon for you, but not the String. In a `JMenuItem` it would put both the String and the icon.
Then just add the `Action` to the tool bar.
See more at How to use Actions
To answer you real question, as @MadProgrammer noted, you should be loading your images as an embedded resource, using
ImageIcon icon = new ImageIcon(MyClass.class.getResource("/resources/images/image.png"));
where the `/resources/images` directory is in the `src`, and `getResource()` returns a URL. Upon build, your IDE should copy the files into the class path for you.
ProjectRoot
src
resources
images
image.png
You'll come to find that when using a file from the file system, will not work upon time of deployment
Here's an example, where the `JMenuItem` and the `JToolBar` button share the same action. Notice that in the `JToolBar` all I have to do is add the `Action`, I don't need to create a button for it. The `JToolBar` automatically makes it a button, without the action command
I use this "open.gif" from the below file structure and use
ImageIcon icon = new ImageIcon(
ActionTest.class.getResource("/resources/image/open.gif"));
Here's the result
Here's the code. Enjoy!
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();
}
});
}
}
Problem
I am trying to add a icon to a toolbar but what is the best place to put it in? My desktop or should I make a new file in the project file or add all the pictures in because it is not showing and this is my code: ``` 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]); } ```