##
CREAR MENUS Y BARRAS DE MENUS

En la actual versión del AWT que se proporciona con el JDK, sólo se permite crear menús a través de código, ya que Java todavía no dispone de un formato de recursos y tampoco hay un diseñador como pueden ser AppStudio, Delphi o X-Designer; aunque terminará habiendo uno, con seguridad.

No hay ningún método para diseñar una buena interface, todo depende del programador. Los menús son el centro de la aplicación. La diferencia entre una aplicación útil y otra que es totalmente frustrante radica en la organización de los menús, pero eso, las reglas del diseño de un buen árbol de menús, no están claras. Hay un montón de libros acerca de la ergonomía y de cómo se debe implementar la interacción con el usuario. Lo cierto es que por cada uno que defienda una idea, seguro que hay otro que defiende la contraria. Todavía no hay un acuerdo para crear un estándar, con cada Window Manager se publica una guía de estilo diferente. Así que, vamos a explicar lo básico, sin que se deba tomar como dogma de fe, para que luego cada uno haga lo que mejor le parezca.

La interface MenuContainer solamente se puede implementar sobre un Frame. Un applet que desee tener un menú, debe crear un Frame en primer lugar. El código de la función que vamos a ver, crea una barra de menús y se llama desde el constructor del Frame. La función es private porque no queremos que se pueda llamar desde ninguna otra clase.

        private void InicializaMenus() {
            mbarra = new MenuBar();
            Menu m = new Menu( "Archivo" );
            m.add( new MenuItem( "Nuevo") );
            m.add( new MenuItem( "Abrir") );
            m.add( new MenuItem( "Guardar") );
            m.add( new MenuItem( "Guardar como") );
            m.add( new MenuItem( "Imprimir") );
            m.addSeparator();
            m.add( new MenuItem( "Salir") );
            mbarra.add( m );

            m = new Menu( "Ayuda" );
            m.add( new MenuItem( "Ayuda!" ) );
            m.addSeparator();
            m.add( new MenuItem( "Acerca de..." ) );
            mbarra.add( m );

            setMenuBar( mbarra );
            }

El menú que crea esta función tendrá la apariencia que muestra la figura siguiente:

Los eventos generados por las opciones de un menú se manejan del mismo modo que los Botones, Listas, etc. En el caso de menús, es el evento ACTION_EVENT de la clase java.awt.MenuItem el que se genera y en evt.target se nos indica la opción seleccionada.

        case Event.ACTION_EVENT:
            {
            if( evt.target instanceof MenuItem )
                {
                if( "Nuevo".equals( evt.arg ) )
                    AplicacionAWT aAwt = new AplicacionAWT();;
                if( "Abrir".equals( evt.arg ) )
                    System.out.println( "Opcion -Abrir-" );
                if( "Guardar".equals( evt.arg ) )
                    System.out.println( "Opcion -Guardar-" );
                if( "Guardar como".equals( evt.arg ) )
                    System.out.println( "Opcion -Guardar como-" );
                if( "Imprimir".equals( evt.arg ) )
                    System.out.println( "Opcion -Imprimir-" );
                if( "Salir".equals( evt.arg ) )
                    System.exit( 0 );
                if( "Ayuda!".equals( evt.arg ) )
                    System.out.println( "No hay ayuda" );
                if( "Acerca de".equals( evt.arg ) )
                    System.out.println( "Opcion -Acerca de-" );
                }
            }

En el código anterior hemos tratado los eventos del menú. Para más seguridad, aunque no sea estrictamente necesario, lo primero que hacemos es asegurarnos de que el objeto evt.target es realmente un objeto MenuItem, es decir, procede de la barra de menús; y después comprobamos la opción que se ha seleccionado.

Como todo, también se puede rizar el rizo y conseguir reproducir los sistemas de menús que estamos acostumbrados a ver en las aplicaciones que manejamos habitualmente. Un ejemplo de ello son los menús en cascada, semejantes al que muestra la figura y que ha sido generado mediante la aplicación Cascada.java.

Básicamente se utiliza la técnica ya descrita, pero en vez de crear un nuevo MenuItem se crea un nuevo Menu, lo que origina el menú en cascada.

No obstante, y volviendo al diseño de interfaces, no debe abusarse de este tipo de menús, porque pueden crear mucha más confusión al usuario. Siempre se debe tener en mente que los usuarios tienen que navegar habitualmente por una gran cantidad de menús en las más diversas aplicaciones, por lo que no debemos esconderles demasiado las opciones que les pueden interesar.

|  | ##### [Anterior] [Indice] [Siguiente]