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:
|