##
PANELES

La clase Panel es el más simple de los Contenedores de Componentes gráficos. En realidad, se trataba de crear una clase no-abstracta (Container sí lo es) que sirviera de base a los applet y a otras pequeñas aplicaciones. La clase Panel consta de dos métodos propios: el constructor, cuyo fin es crear un nuevo Panel con un LayoutManager de tipo FlowLayout (el de defecto), y el método addNotify() que, sobrecargando la función del mismo nombre en la clase Container, llama al método createPanel() del Toolkit adecuado, creando así un PanelPeer. El AWT enviará así al Panel (y por tanto al applet) todos los eventos que sobre él ocurran. Esto que puede parecer un poco rebuscado, obedece al esquema arquitectónico del AWT; se trata del bien conocido esquema de separación interface/implementación que establece por un lado una clase de interface y por otro distintas clases de implementación para cada una de las plataformas elegidas.

El uso de Paneles permite que las aplicaciones puedan utilizar múltiples layouts, es decir, que la disposición de los componentes sobre la ventana de visualización pueda modificarse con mucha flexibilidad. Permite que cada Contenedor pueda tener su propio esquema de fuentes de caracteres, color de fondo, zona de diálogo, etc.

Podemos, por ejemplo, crear una barra de herramientas para la zona superior de la ventana de la aplicación o incorporarle una zona de estado en la zona inferior de la ventana para mostrar información útil al usuario. Para ello vamos a implementar dos Paneles:

    class BarraHerram extends Panel {
        public BarraHerram() {
            setLayout( new FlowLayout() );
            add( new Button( "Abrir" ) );
            add( new Button( "Guardar" ) );
            add( new Button( "Cerrar" ) );

            Choice c = new Choice();
            c.addItem( "Times Roman" );
            c.addItem( "Helvetica" );
            c.addItem( "System" );
            add( c );
            add( new Button( "Ayuda" ) );
            }
        }

    class BarraEstado extends Panel {
        Label texto;
        Label mas_texto;

        public BarraEstado() {
            setLayout( new FlowLayout() );
            add( texto = new Label( "Creada la barra de estado" ) );
            add( mas_texto = new Label( "Información adicional" ) );
            }

        public void verEstado( String informacion ) {
            texto.setText( informacion );
            }
        }

Ahora, para dar funcionalidad, debemos crear los objetos correspondientes a la barra de herramientas y a la barra de estado con new; al contrario que en C++, en Java todos los objetos deben ser creados con el operador new:

        add( "North",tb = new ToolBar() );
        add( "South",sb = new StatusBar() );

También vamos a incorporar un nuevo evento a nuestro controlador, para que maneje los eventos de tipo ACTION_EVENT que le llegarán cuando se pulsen los botones de la barra de herramientas o se realice alguna selección, etc.

        case Event.ACTION_EVENT:
            {
            be.verEstado( evt.arg.toString() );
            return true;
            }

Cuando la aplicación reciba este tipo de evento, alterará el contenido de la barra de estado para mostrar la información de la selección realizada o el botón pulsado.

Al final, la apariencia de la aplicación en pantalla es la que presenta la figura anterior.

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