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]); } ```

Original source