Java Swing - GUIs
TOPIC 03 – MORE ON COMPONENTS

 

LESSON NOTE – JMENUBAR, JMENU & JMENUITEM

 

 

INTRO

 

We can add classic menu bars to our Swing applications by using JMenuBar, JMenu & JMenuItem. 

 

It is quite simple to do really.  We simply create a blank menu bar and then create the menus that we want to add to the menu bar.  Because there are several steps, the code does tend to be longer.

 

JMENUBAR CONSTRUCTOR

 

We create an empty JMenuBar by simply using:

 

   JMenuBar menuBar = new JMenuBar();

 

SETTING THE MENUBAR

 

We then need to set the menu bar for the JFrame by using setJMenuBar(JMenuBar).

 

   this.setJMenuBar(menuBar);

 

Where "this" refers to the JFrame (or, in our case, the object that extends JFrame).

 

JMENU CONSTRUCTOR

 

Our menu bar needs menus to display.  We create an empty JMenu by specifying the title of the menu.  This title is what appears in the menu bar.

     

   JMenu menu1 = new JMenu("File");

 

ADDING A JMENU TO THE JMENUBAR

 

We add a menu to a menu bar by using:

 

   menuBar.add(menu1);

 

JMENUITEM CONSTRUCTOR

 

Our menu is currently empty.  We can add items to the menu by creating JMenuItem objects.  In the constructor call, we specify the heading that appears in the menu.

 

   JMenuItem menuItem = new JMenuItem("Heading");

 

ADDING JMENUITEM TO MENU

 

We then add the JMenuItem to a menu.

 

   menu1.add(menuItem);

 

EXAMPLE CODE

 

Here is an example of code that displays a menu bar that contains two menus, each with three items.  This example doesn't deal with actions yet.  More on that later.

 

 

public class MyGUI extends JFrame implements ActionListener

{

   //datafields

   JMenuBar menuBar;

   JMenu menu;

   JMenu menu2;

   JMenuItem menuItem11;  //menu1, item1

   JMenuItem menuItem12;  //menu1, item2

   JMenuItem menuItem13;  //menu1, item3

   JMenuItem menuItem21;  //menu2, item1

   JMenuItem menuItem22;  //menu2, item2

   JMenuItem menuItem23;  //menu2, item3

  

   public MyGUI()

   {

        Container cp = this.getContentPane();

        cp.setLayout(new FlowLayout());

           

        menuBar = new JMenuBar();

       

        //FIRST MENU

        menu = new JMenu("Veg");

       

        menuItem11 = new JMenuItem("Carrot");

        menu.add(menuItem11);

       

        menuItem12 = new JMenuItem("Cucumber");

        menu.add(menuItem12);

       

        menuItem13 = new JMenuItem("Onion");

        menu.add(menuItem13);

       

        menuBar.add(menu);

       

        //SECOND MENU

        menu2 = new JMenu("Fruit");

       

        menuItem21 = new JMenuItem("Banana");

        menu2.add(menuItem21);

 

        menuItem22 = new JMenuItem("Orange");

        menu2.add(menuItem22);

       

        menuItem23 = new JMenuItem("Pear");

        menu2.add(menuItem23);

    

        menuBar.add(menu2);

       

        //SET THE MENUBAR

    

        this.setJMenuBar(menuBar);

       

 

        this.setTitle("JMenuBar");

        this.setSize(300,300);

        this.setVisible(true);

   }

  

   public void actionPerformed(ActionEvent e)

   {

       //Nothing for now.

   }

    

   public static void main(String[] args)

   {

        MyGUI mg = new MyGUI();

   }

}

 

Below are three different views of the menu bar that the above code will create.

 

 

ACTION LISTENER

 

We can add an action listener to each JMenuItem.

 

   menuItem11.addActionListener(this);

 

ACTIONPERFORMED METHOD

 

Responding is done in the same way as with all JComponents.

 

   public void actionPerformed(ActionEvent e)

   {

       if (e.getSource() == menuItem11)

       {

       System.out.println(menuItem11.getText());

       }

   }

 

FULL CODE EXAMPLE

 

Here is a complete example that shows the concepts from above in action.

 

 

public class MyGUI extends JFrame implements ActionListener

{

   //datafields

   JMenuBar menuBar;

   JMenu menu;

   JMenu menu2;

   JMenuItem menuItem11;

   JMenuItem menuItem12;

   JMenuItem menuItem13;

   JMenuItem menuItem21;

   JMenuItem menuItem22;

   JMenuItem menuItem23;

  

   public MyGUI()

   {

        Container cp = this.getContentPane();

        cp.setLayout(new FlowLayout());

           

        menuBar = new JMenuBar();

       

        //FIRST MENU

        menu = new JMenu("Veg");

       

        menuItem11 = new JMenuItem("Carrot");

        menu.add(menuItem11);

       

        menuItem12 = new JMenuItem("Cucumber");

        menu.add(menuItem12);

       

        menuItem13 = new JMenuItem("Onion");

        menu.add(menuItem13);

       

        menuBar.add(menu);

       

        //SECOND MENU

        menu2 = new JMenu("Fruit");

       

        menuItem21 = new JMenuItem("Banana");

        menu2.add(menuItem21);

 

        menuItem22 = new JMenuItem("Orange");

        menu2.add(menuItem22);

       

        menuItem23 = new JMenuItem("Pear");

        menu2.add(menuItem23);

    

        menuBar.add(menu2);

       

        //SET THE MENUBAR

    

        this.setJMenuBar(menuBar);

        

        //ADD LISTENERS

        menuItem11.addActionListener(this);

        menuItem12.addActionListener(this);

        menuItem13.addActionListener(this);

        menuItem21.addActionListener(this);

        menuItem22.addActionListener(this);

        menuItem23.addActionListener(this);

 

        this.setTitle("JMenuBar");

        this.setSize(300,100);

        this.setVisible(true);

   }

  

   public void actionPerformed(ActionEvent e)

   {

       if (e.getSource() == menuItem11)

       {

         System.out.println(menuItem11.getText());

       }

       else if (e.getSource() == menuItem12)

       {

         System.out.println(menuItem12.getText());

       }

       else if (e.getSource() == menuItem13)

       {

         System.out.println(menuItem13.getText());

       }

       else if (e.getSource() == menuItem21)

       {

         System.out.println(menuItem21.getText());

       }

       else if (e.getSource() == menuItem22)

       {

         System.out.println(menuItem22.getText());

       }

       else if (e.getSource() == menuItem23)

       {

         System.out.println(menuItem23.getText());

       }

   }

    

   public static void main(String[] args)

   {

        MyGUI mg = new MyGUI();

   }

}

 

SUBMENUS

 

We can create a submenu to a menu.  We simply create a JMenu object and instead of adding it to the menu bar, add it to another menu.

 

EXAMPLE

Here is an example with a submenu.  To save room, the Listeners are not implemented.

 

public class MyGUI extends JFrame implements ActionListener

{

   //datafields

   JMenuBar menuBar;

   JMenu menu;

   JMenu menu2;

   JMenu subMenu;

   JMenuItem menuItem11;

   JMenuItem menuItem12;

   JMenuItem menuItem13;

   JMenuItem menuItem21;

   JMenuItem menuItem22;

   JMenuItem menuItem23;

   JMenuItem sMenuItem1;

   JMenuItem sMenuItem2;

   JMenuItem sMenuItem3;

  

  

   public MyGUI()

   {

        Container cp = this.getContentPane();

        cp.setLayout(new FlowLayout());

           

        menuBar = new JMenuBar();

       

        //FIRST MENU

        menu = new JMenu("Veg");

       

        menuItem11 = new JMenuItem("Carrot");

        menu.add(menuItem11);

       

        menuItem12 = new JMenuItem("Cucumber");

        menu.add(menuItem12);

       

        menuItem13 = new JMenuItem("Onion");

        menu.add(menuItem13);

       

        menuBar.add(menu);

       

        //SECOND MENU

        menu2 = new JMenu("Fruit");

       

        menuItem21 = new JMenuItem("Banana");

        menu2.add(menuItem21);

 

        menuItem22 = new JMenuItem("Orange");

        menu2.add(menuItem22);

       

        menuItem23 = new JMenuItem("Pear");

        menu2.add(menuItem23);

    

        menuBar.add(menu2);

       

        //SUBMENU

        subMenu = new JMenu("Apple");

       

        sMenuItem1 = new JMenuItem("Gala");

        subMenu.add(sMenuItem1);

 

        sMenuItem2 = new JMenuItem("MacIntosh");

        subMenu.add(sMenuItem2);

 

        sMenuItem3 = new JMenuItem("Golden Delicious");

        subMenu.add(sMenuItem3);

       

        menu2.add(subMenu);

       

        //SET THE MENUBAR

    

        this.setJMenuBar(menuBar);

       

 

        this.setTitle("JMenuBar");

        this.setSize(300,100);

        this.setVisible(true);

   }

  

   public void actionPerformed(ActionEvent e)

   {

   }

    

   public static void main(String[] args)

   {

        MyGUI mg = new MyGUI();

   }

}

 

The above example creates this:

 

 

SEPARATOR LINE

 

We can easily add a separator line in a menu by using the addSeperator() method.  This needs to be done at the right time – so after adding the menu items that go above and before adding the menu items that go after.

 

   menu.addSeparator();

 

In the example below, a separator was added right after the menu item saying "Cucumber" was added.

 



CHECK BOXES & RADIO BUTTONS IN MENUS

 

We can actually add both combo boxes and radio buttons inside menus.  We simply need to use the JCheckBoxMenuItem and the JRadioButtonMenuItem classes.  Both work exactly like their normal component class.

 

EXAMPLE

 

Here is an example that shows these two items in menus.

 

 

public class MyGUI extends JFrame implements ActionListener

{

   //datafields

   JMenuBar menuBar;

   JMenu menu;

   JCheckBoxMenuItem cb;

   JCheckBoxMenuItem cb2;

   JRadioButtonMenuItem rb;

   JRadioButtonMenuItem rb2;

  

   public MyGUI()

   {

        Container cp = this.getContentPane();

        cp.setLayout(new FlowLayout());

           

        menuBar = new JMenuBar();

       

        //MENU

        menu = new JMenu("Campeau");

       

        cb = new JCheckBoxMenuItem("is cool");

        cb.setSelected(true);

        menu.add(cb);

 

        cb2 = new JCheckBoxMenuItem("is lame");

        cb2.setSelected(false);

        menu.add(cb2);

       

        menu.addSeparator();

       

        rb = new JRadioButtonMenuItem("pass");

        menu.add(rb);

       

        rb2 = new JRadioButtonMenuItem("fail");

        menu.add(rb2);

       

        //Group rb and rb2 together

        ButtonGroup group = new ButtonGroup();

        group.add(rb);

        group.add(rb2);

       

        menuBar.add(menu);

 

        //SET THE MENUBAR

    

        this.setJMenuBar(menuBar);

       

        this.setTitle("JMenuBar");

        this.setSize(300,100);

        this.setVisible(true);

   }

  

   public void actionPerformed(ActionEvent e)

   {

 

   }

    

   public static void main(String[] args)

   {

        MyGUI mg = new MyGUI();

   }

}

 

The above code creates: