Search code examples
javaswingimageiconjtoolbar

How to add an ImageIcon to a JToolBar


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

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"));
    

    enter image description here

    Here's the result

    enter image description here

    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();
                }
            });
        }
    }