Cuando leas esta lección, observarás código para añadir componentes a los contenedores. Esto es así porque para que cualquier objeto Component pueda dibujarse en la pantalla, excepto una ventana, primero debes añadirlo a un objeto Container. Este Contenedor es a su vez un Componente, y también debe ser añadido a otro Contenedor. Las Ventanas, como los Marcos y los Cuadros de Diálogos son contendores de alto nivel; y son los únicos componentes que no son añadidos a otros contendores.La clase Container define tres métodos para añadir componentes: un método add() con un argumento y dos métodos add() con dos argumentos. El que se necesitará utilizar depende el controlador de disposición que el contenedor está utilizando. Aprenderás todo sobre los controladores de disposición más adelante en esta lección. Ahora, estamos enseñando lo suficiente para que puedas leer los extractos de código de esta lección.
El método add() con un argumento sólo requiere que especifique el componente a añadir. El primer método add() con dos argumentos permite añadir un argumento especificando la posición en la que debería ser añadido el componente. El entero -1 especifica que el contenedor añade el componente al final de la lista de componentes (al igual que lo hace el método de un sólo argumento). Esta forma de add() con dos argumentos no se utiliza frecuentemente, por eso si se refiere al "método add() con dos argumentos", casi siempre se refiere al segundo método que se describe en el siguiente párrafo. Todos los controladores de disposición FlowLayout, GridLayout, y GridBagLayout trabajan con estos métodos add().
El segundo método add() con dos argumentos especifica el componente que se va a añadir. El primer argumento es una cadena dependiente del controlador. BorderLayout (el controlador de disposición por defecto para las subclases de Window) requiere que se especifique "North", "South", "East", "West", o "Center". CardLayout sólo requiere que se especifique una cadena que identifique de alguna forma el componente que está siendo añadido.
Nota: Añadir componentes a un contenedor elimina el componente de otro contenedor si es que estuviera. Por esta razón, no se puede tener un componente en dos contenedores, incluso si los dos contenedores no se muestran nunca al mismo tiempo.
Todos los componentes, excepto los menús, están implementados como subclases de la clase Component . De esta clase heredan una enorme cantidad de funcionalidades. Por ahora, ya deberías saber que la clase Component proporciona lo básico para el dibujo y el manejo de eventos. Aquí tienes una lista más completa sobre las funcionalidades proporcionadas por la clase Component:
- Soporte básico para dibujo.
- Component proporciona los métodos paint(), update(), y repaint(), que permiten a los componentes dibujarse a sí mismos en la pantalla. Puedes ver la página Dibujo para más información.
- Manejo de Eventos.
- Component define el método handleEvent() de propósito general y un grupo de métodos como action() que maneja tipos de eventos especificos. Component también tiene soporte para el foco del teclado, que permite controlar los componentes mediante el teclado. Puedes ver la página Manejo de Eventos para más información.
- Apariencia del Control: fuente.
- Component proporciona métodos para obtener y cambiar la fuente actual, y obtener información sobre ella. Puedes ver la página Trabajando con Texto para más información.
- Apariencia del Control: color.
- Component proporciona los siguientes métodos para obtener y cambiar los colores de fondo y de primer plano: setForeground(Color), getForeground(), setBackground(Color), y getBackground(). El color de primer plano es el utilizado por todo el texto del componete, así como cualquier dibujo del cliente que realice el componente. El color de fondo es el color que hay detrás del texto o los gráficos. Para aumentar el rendimiento el color de fondo debería contrastar con el color de primer plano.
- Manejo de Imágenes.
- Component proporciona lo básico para mostrar imágenes. Observa que la mayoría de los componentes no pueden contener imágenes, ya que su apariencia está implementada en código especifico de la plataforma. Sin embargo, los lienzos y la mayoría de los contenedores, pueden mostrar imágenes. Puedes ver la página Utilizar imágenes para más información sobre el trabajo con imágenes.
- Tamaño y posición en la pantalla.
- El tamaño y posición de todos los componetes (excepto para las ventanas) están sujetos a los caprichos de los controladores de disposición. Sin embargo, todos los componentes tienen al menos una forma de decir su tamaño, pero no su posición. Los métodos preferredSize() y minimumSize() permiten a los componentes informar al controlador de disposición de los tamaños mínimo y preferido. La clase Component también proporciona métodos para obtener o cambiar (sujeto a la supervisión del controlador de disposición) el tamaño y la posición actuales del componente.
La apariencia de la mayoría de los componentes es específica de la plataforma. Los botones son diferentes en un sistema Motif y en un sistema Macintosh, por ejemplo.No se puede cambiar fácilmente la apariencia de un componente en grandes rasgos. Pero si puede hacer cambios menores, como la fuente o el color del fondo, utilizando los métodos y variables que afectan a la apariencia proporcionados por una clase Component y sus subclases. Sin embargo, no se podrá cambiar completamente la apariencia de un componente incluso creando una nueva subclase de la clase Component, ya que la mayoría de la implementación del componetes específica de la plataforma sobreescribe cualquier dibujo que realice el componente. Para cambiar la apariencia de un componente, se debe inplementar una subclase de la clase Canvas que tenga el aspecto que se quiera pero el mismo comportamiento que el usuario esperaría del componente.
Aunque no puede cambiar en gran medida el aspecto del componente, si puede cambiar su comportamiento. Por ejemplo, si en un campo de texto sólo son válidos los valores numéricos, podría implementar una subclase de TextField que examine todos los eventos del teclado, interceptando los que no sean válidos. Esto es posible porque la implementación del componente independiente de la plataforma obtiene el evento antes de que lo haga la implementación dependiente de la plataforma. Puedes ver la página Manejo de Eventos para más detalles.