We would, of course, like to have menus in our frames.

Here’s how to do it.

A Simple Menu Example

Here’s a simple menu example:

package swingExamples;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;

public class SimpleMenu extends JFrame
{
  public SimpleMenu(String title)
  {
    setTitle(title);
    // Create menu bar with menu
    JMenu fileMenu = new JMenu("File");
    fileMenu.add("New...");
    fileMenu.add("Open...");
    fileMenu.add("Save");
    fileMenu.add("Save As...");
    fileMenu.addSeparator();
    fileMenu.add("Quit");
    
    JMenuBar menuBar = new JMenuBar();
    menuBar.add(fileMenu);
    setJMenuBar(menuBar);
  }
  
  public static void main(String[] args)
  {
    SimpleMenu frame = new SimpleMenu("SimpleMenu");
    frame.setSize(300, 200);
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    frame.setVisible(true);
  }
}

which produces:

Of course, you can click on the menu items all you want, but they won’t do anything for you. 

For that you need events…

A More Complex Menu Example

If you want to add other menus (including a popup menu), and actually hook up some of the actions, here’s how you might do it.

Here, we make some more complex menu structures, including a pop-up menu.  We show a simple example of how to hook up a menu item (the Help -> About MenuTest… item) so that it will respond appropriately.

package swingExamples;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.ButtonGroup;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButtonMenuItem;

public class ComplexMenu extends JFrame 
    implements ActionListener
{
  public ComplexMenu(String title)
  {
    super(title);

    // Create menu bar with menus
    JMenuBar menuBar = new JMenuBar();
    setJMenuBar(menuBar);

    // File menu
    JMenu fileMenu = new JMenu("File");
    menuBar.add(fileMenu);
    fileMenu.add("New...");
    fileMenu.add("Open...");
    fileMenu.add("Save");
    fileMenu.add("Save As...");
    fileMenu.addSeparator();
    m_quit = new JMenuItem("Quit");
    m_quit.addActionListener(this);
    fileMenu.add(m_quit);

    // Edit menu
    JMenu editMenu = new JMenu("Edit");
    menuBar.add(editMenu);
    editMenu.add("Cut");
    editMenu.add("Copy");
    editMenu.add("Paste");

    // Shape menu
    JMenu shapeMenu = new JMenu("Shape");
    menuBar.add(shapeMenu);
    shapeMenu.add(getShapesSubMenu());
    shapeMenu.add("Properties...");

    // Help menu
    JMenu helpMenu = new JMenu("Help");
    menuBar.add(helpMenu);
    helpMenu.add("Help Overview...");
    helpMenu.add("Help Topics...");
    m_about = new JMenuItem("About MenuTest...");
    m_about.addActionListener(this);
    helpMenu.add(m_about);

    // Create the popup menu.
    JPopupMenu popupMenu = new JPopupMenu();
    addShapes(popupMenu);
    // Add listener to components that 
    // can bring up popup menus.
    MouseListener popupListener = 
         new PopupListener(popupMenu);
    addMouseListener(popupListener);
  }

  private JMenu getShapesSubMenu()
  {
    JMenu shapesSubMenu = new JMenu("Shapes");
    addShapes(shapesSubMenu);

    return shapesSubMenu;
  }

  private void addShapes(JComponent menu)
  {
    ButtonGroup group = new ButtonGroup();

    JRadioButtonMenuItem square = 
          new JRadioButtonMenuItem("Square", true);
    group.add(square);
    menu.add(square);
    JRadioButtonMenuItem circle = 
          new JRadioButtonMenuItem("Circle");
    group.add(circle);
    menu.add(circle);
    JRadioButtonMenuItem triangle = 
          new JRadioButtonMenuItem("Triangle");
    group.add(triangle);
    menu.add(triangle);
    menu.add(getPropertiesSubMenu());
  }

  private JMenu getPropertiesSubMenu()
  {
    ButtonGroup group = new ButtonGroup();
    JMenu propertiesSubMenu = new JMenu("Properties");

    JRadioButtonMenuItem solid = 
          new JRadioButtonMenuItem("Solid", true);
    group.add(solid);
    propertiesSubMenu.add(solid);
    JRadioButtonMenuItem outline = 
          new JRadioButtonMenuItem("Outline");
    group.add(outline);
    propertiesSubMenu.add(outline);

    return propertiesSubMenu;
  }

  public void actionPerformed(ActionEvent event)
  {
    Object obj = event.getSource();
    if (obj == m_quit)
    {
      System.exit(0);
    }
    else if (obj == m_about)
    {
      showAboutBox();
    }
  }

  private void showAboutBox()
  {
    JOptionPane.showMessageDialog(
        this,
        "  MenuTest 1.0\n" +
        "       by\n" +
        "   Bryan J. Higgs\n" +
        "  October 31, 2000\n" +
        "  HAPPY HALLOWEEN!",
        "About MenuTest",
        JOptionPane.INFORMATION_MESSAGE);
  }

  public static void main(String[] args)
  {
    ComplexMenu frame = new ComplexMenu("MenuTest");
    frame.setSize(300, 200);
    frame.setVisible(true);
  }

  /////////////// Inner classes /////////////////

  class PopupListener
      extends MouseAdapter
  {
    PopupListener(JPopupMenu menu)
    {
      m_popup = menu;
    }

    public void mousePressed(MouseEvent e)
    {
      maybeShowPopup(e);
    }

    public void mouseReleased(MouseEvent e)
    {
      maybeShowPopup(e);
    }

    private void maybeShowPopup(MouseEvent e)
    {
      if (e.isPopupTrigger())
      {
        m_popup.show(e.getComponent(),
                     e.getX(), e.getY());
      }
    }

    ///////////// Private Data /////////////
    private JPopupMenu m_popup;
  }

  ///////// Private Data ///////
  private JMenuItem m_quit;
  private JMenuItem m_about;
}

Here’s what it produces: