## Cómo Utilizar la Clase Menu

El siguiente applet muestra muchas de las caracteristicas de los menús que querras utilizar. La ventana tiene una barra de menú que contiene cinco menús. Cada menú contiene una o más opciones. El Menú 1 es un menú de arranque, pulsando la línea punteada, el usuario crea una nueva ventana que contiene las mismas opciones de menú que el menu 1. (Actualmente, los menús de arranque solo están disponibles para la plataforma Solaris, no para Windows 95/NT o MacOS.) El menú 2 sólo contiene un botón de radio. El menú 3 contiene un separador entre su segunda y tercera opciones. El menú 4 contiene un submenú. El menú 5 es la ventana del menú de ayuda, que dependiendo de la plataforma) generalmente significa que se sitúa a la izquierda. Cuando el usuario pulsa en cualquier opción del menú la ventana muestra una cadena de texto indicando qué opción ha sido pulsada y en que menú se encuentra.

La razón por la que el applet trae una ventana para demostrar los menús es que el AWT límita donde se pueden utilizar los menús. Los menús sólo pueden existir en las barras de menú, y las barras de menú sólo están disponibles en las ventanas (especificamente, en los Frames).

Si los menús no están disponibles o no son apropiados en tu programa deberías buscar otras formas de presentar opciónes al usuario:checkbox, choice, y list.

La funcionalidad de los menús del AWT la proporcionan varias clases. Estas clases no descienden de la clase Component, ya que muchas plataformas ponen muchos límites a las capacidades de los menús. En su lugar, las clases menu descienden de la clase MenuComponent. El AWT proporciona las siguientes subclases de MenuComponent para soportar los menús:

MenuItem
  Cada opción de un menú está representada por un objeto MenuItem.
CheckboxMenuItem
  Cada opción de un menú que contiene un botón de radio está representada por un objeto CheckboxMenuItem. CheckboxMenuItem es una subclase de MenuItem.
Menu
  Cada menú está representado por un objeto Menu. Esta clase está implementada como una subclase de MenuItem para se puedan crear submenús fácilmente añadiendo un menú a otro.
MenuBar
  Las barras de menú están implementadas por la clase MenuBar. Esta clase representa una noción dependiente de la plataforma de un grupo de manús adheridos a una ventana. Las barras de menú no no pueden utilizarse con la clase Panel.

Para poder contener un MenuComponent, un objeto debe adherirse al interface MenuContainer. Las clases Frame, Menu y MenuBar son las únicas del aWT que actualmente implementan MenuContainer.

Aquí tienes el código para la ventana del applet anterior. Esto código puede ejecutarse como una aplicación solitaria o, con la ayuda de la clase AppletButton, como un applet. Aquí tiene el código que trata con los menús:

    public class MenuWindow extends Frame {
        . . .
        public MenuWindow() {
            MenuBar mb;
            Menu m1, m2, m3, m4, m4_1, m5;
            MenuItem mi1_1, mi1_2, mi3_1, mi3_2, mi3_3, mi3_4,
                     mi4_1_1, mi5_1, mi5_2;
            CheckboxMenuItem mi2_1;

            ...//Añade la salida mostrada a esta ventana...

             //Construye la barra de menú.
            mb = new MenuBar();
            setMenuBar(mb);

             //Construye el primer menú en la barra de menñus.
            //Especificando elsegundo argumento como ture
            //hace de este un menú de arranque.
            m1 = new Menu("Menu 1", true);
            mb.add(m1);
            mi1_1 = new MenuItem("Menu Item 1_1");
            m1.add(mi1_1);
            mi1_2 = new MenuItem("Menu Item 1_2");
            m1.add(mi1_2);

            //Construye el menñu de ayuda.
            m5 = new Menu("Menu 5");
            mb.add(m5);             //Sólo seleccionandolo no funciona, debe añadirlo.
            mb.setHelpMenu(m5);
            mi5_1 = new MenuItem("Menu Item 5_1");
            m5.add(mi5_1);
            mi5_2 = new MenuItem("Menu Item 5_2");
            m5.add(mi5_2);

            //Construye el segundo menú en la barra de menús.
            m2 = new Menu("Menu 2");
            mb.add(m2);
            mi2_1 = new CheckboxMenuItem("Menu Item 2_1");
            m2.add(mi2_1);

            //Construye el tercer menú en la barra de menús.
            m3 = new Menu("Menu 3");
            mb.add(m3);
            mi3_1 = new MenuItem("Menu Item 3_1");
            m3.add(mi3_1);
            mi3_2 = new MenuItem("Menu Item 3_2");
            m3.add(mi3_2);
            m3.addSeparator();
            mi3_3 = new MenuItem("Menu Item 3_3");
            m3.add(mi3_3);
            mi3_4 = new MenuItem("Menu Item 3_4");
            mi3_4.disable();
            m3.add(mi3_4);

            //Construye el cuarto menú en la barra de menús.
            m4 = new Menu("Menu 4");
            mb.add(m4);
            m4_1 = new Menu("Submenu 4_1");
            m4.add(m4_1);
            mi4_1_1 = new MenuItem("Menu Item 4_1_1");
            m4_1.add(mi4_1_1);
        }
        . . .
        public boolean action(Event event, Object arg) {
            String str = "Action detected";

            if (event.target instanceof MenuItem) {
                MenuItem mi=(MenuItem)(event.target);
                str += " on " + arg;
                if (mi instanceof CheckboxMenuItem) {
                        str += " (state is "
                               + ((CheckboxMenuItem)mi).getState()
                               + ")";
                }
                MenuContainer parent = mi.getParent();
                if (parent instanceof Menu) {
                    str += " in " + ((Menu)parent).getLabel();
                } else {
                    str += " in a container that isn't a Menu";
                }
            }
            str += ".\n";
            ...//Muestra la Cadena de texto en al área de salida...
            return false;
        }

Ozito