Java para programadores (6.2):La clase Components

La clase Canvas

Un objeto de tipo Canvas es únicamente un objeto de forma rectangular en su pantalla. Un objeto que pertenezca directamente a la clase Canvas,–al contrario que un objeto que pertenezca a alguna de sus subclases– no es muy útil. El motivo es que Canvas recibe los eventos de teclado y ratón, pero no hace nada con ellos. Tienen un método paint(), pero no dibuja nada. Es por esto que la clase Canvas generalmente es usada como base para las subclases, y los objetos útiles se crean desde las subclases. Una subclase de Canvas deberá sobregrabar el método paint() y puede que también los métodos de control de eventos de ratón y teclado como mouseDown() y keyDown()

Igual que pasa con el resto de componentes, el sistema llamara al método paint() del área canvas, cuando dicha área necesite volver a ser dibujada. Cuando el contenido del área deba ser modificado fuera del método paint(), el contexto gráfico para el área debe ser obtenido llamando al método getGraphics().Todos los métodos gráficos comentados en la Sección 5.4 pueden ser usados en este área.

Es posible dibujar en cualquier componente, y es muy común el dibujar directamente en los applets y en las ventanas. Probablemente deberemos considerar como buen estilo, sin embargo, el restringir todos los dibujos a las subclases de Canvas. Cuando solo una parte del applet o de la ventana se utiliza para dibujar, el empleo de un área canvas se hace casi inevitable. El problema se complica si quiere dibujar , por ejemplo, en una zona donde debajo haya una fila de botones. El área canvas en este caso puede ser el componente del centro de BorderLayout que se comento en la sección anterior.

Canvas es la única clase comentada en esta sección para la que deberá definir subclases. Para el resto de clases podrá crear directamente un objeto de la clase, y emplearlo.


La clase Label

Labels es realmente el tipo de componente mas sencillo. Un objeto de este tipo, es únicamente una única línea de texto. Este texto, no puede ser editado por el usuario, aunque sí puede ser cambiado por su programa. El constructor para Label especifica el texto a presentar:

 

Label mensaje = new Label("Hola Mundo!");

 

Puede cambiar el texto presentado en la etiqueta (label) llamando al método de label setText():

mensaje.setText("Adiós Mundo!");

Dado que la clase  Label es una  subclase de Component,Labels hereda un montón de comportamientos desde Components. En particular , las etiquetas tienen color de fondo (background), color de primer plano o de texto (foreground) y fuentes. Puede estableces estas propiedades llamando a los métodos definidos en la clase Component. Generalmente, lo deberá realizar justo después de haber creado la etiqueta (label).

Label mensaje = New Label("Hola Mundo!");
mensaje.setForeground(Color.red);  // presentara texto en rojo
mensaje.setBackground(Color.black); // en fondo negro
mensaje.setFont(new Font("TimesRoman", Font.BOLD, 18));

La clase Button

Un objeto de la clase Button en clásico botón pulsador. El usuario puede pulsar el botón por medio del ratón. La etiqueta del botón se indica en el momento en que se crea:

Button BotonParaMarcha = new Button("Arrancar");

La etiqueta del botón se puede cambiar usando el método setLabel():

BotonParaMarcha.setLabel("Parar")

Cuando el usuario pulsa el botón, su programa debe responder realizando alguna acción. El mismo botón responde generando un evento. Su programa debe detectar el evento y reaccionar ante él; todo esto se comentara en la siguiente sección.

También puede ser que a veces nos interese que el botón este desactivado (disabled) porque la acción que representa no es correcta en ese momento o no tiene sentido hacerla. En este caso es posible llamar al método del botón disable(). Este método bloquea las respuestas  a eventos del botón y cambia su apariencia para indicarle al usuario que esta desactivado. Para volver a activar el botón, deberá llamar al método enable(). Estos métodos están definidos realmente en la clase Component y se pueden utilizar además de para los botones, también para otros tipos de componentes.


Las clases Checkbox y CheckboxGroup

Un Checkbox es un componente que tiene dos estados: marcado (checked) y desmarcado (unchecked). El usuario puede cambiar el estado del  checkbox realizando un clic sobre él. El estado del checkbox se representa por un valor boolean que indica si está marcado (True) o desmarcado (False). La etiqueta del checkbox se indica cuando se llama al constructor:

Checkbox verTiempo = new Checkbox("Ver hora actual");

La etiqueta de un checkbox puede modificarse utilizando el método setLabel(String). También podemos modificar el estado con el método setState(Boolean). Por ejemplo, si quiere que el checkbox verTiempo aparezca como marcado, deberemos decir "verTiempo.setState(true)", y para desmarcarlo "verTiempo.setState(false);”   Puede averiguar el estado actual del checkbox llamando al método getState() que le devolverá un valor boleano. Si cambia el estado debido a que el usuario hace clic sobre el checkbox, se genera un evento. Su programa puede detectar y reaccionar ante el evento. Sin embargo, a menudo es mas sencillo ignorar estos eventos y comprobar el estado de la caja cuando sea necesario, empleando el método getState().

Los botones radio (radio buttons) están muy relacionados con los checkbox. Los botones Radio, aparecen en grupo. Unicamente un botón del grupo puede estar activo en un momento determinado. En Java un botón Radio es un objeto del tipo Checkbox que es parte de un grupo. El grupo entero de los botones se representa por un objeto perteneciente a la clase CheckboxGroup. La clase CheckBoxGrouptiene los siguientes métodos

public void setCurrent(Checkbox caja);
public Checkbox getCurrent();

para seleccionar uno de los botones del grupo, y determinar que botón esta seleccionado en un momento determinado. (El método getCurrent() devuelve null si ninguna de las cajas del grupo están seleccionadas en aquel momento).

Para crear un grupo de RadioButtons, debe crear primero un objeto del tipo CheckboxGroup. Para crear los botones individuales, utilice el constructor

Checkbox(String etiqueta,CheckboxGroup nombre-grupo,boolean estado);

El tercer parámetro de este constructor especifica el estado inicial   del checkbox. Recuerde que solo uno de los checkbox del grupo puede estar activado (True). Por ejemplo:

CheckboxGroup grupoColor = new CheckboxGroup();
Checkbox rojo = new Checkbox ("Rojo", grupoColor, False);
Checkbox azul = new Checkbox ("Azul", grupoColor, False);
Checkbox verde = new Checkbox ("Verde", grupoColor, True);
Checkbox negro = new Checkbox ("Negro", grupoColor, False);

Estas instrucciones crean cuatro Radiobuttons llamados “Rojo”, “Azul”, “Verde”, y “Negro”. Inicialmente se deja seleccionado el tercer botón, A pesar de eso, puede seguir añadiendo  botones al contenedor de forma individualizada. El CheckboxGroup en si mismo no es un componente y no puede ser añadido al contenedor. Para emplear estos botones de forma efectiva en su programa, probablemente deseara almacenar cualquier objeto Checkbox o CheckboxGroup  en una variable instanciable.


La clase Choice (Selección)

Un CheckBoxGroup es una de las maneras de permitir al usuario el seleccionar una opción de entre una lista predeterminada de opciones. La clase Choice representa otra forma de hacer lo mismo. Un objeto de este tipo presenta las opciones en formato de menú emergente. El menú presenta una lista de elementos. Normalmente, solo esta visible el elemento seleccionado, sin embargo, cuando el usuario hace clic en el menú, se presenta la lista entera y el usuario puede seleccionar uno de los ítems desde la lista.

Cuando se construye el objeto Choice, inicialmente no tiene elementos; estos se deberán añadir utilizando el método addItem(String). El método countItems() devuelve un int que define el numero de elementos que hay en la lista, y el método

public String getItem(int index)

toma el elemento que se encuentra en la posición index de la lista. (los elementos se numeran empezando en cero, no en uno). Otros métodos útiles son:

public int getSelectedIndex(); //numero  elemento seleccionado
public String getSelectedItem(); // texto elemento seleccionado
Public void select (int index); // seleccionar index
public void select (String itenName); // seleccionar itenName

El propósito de estos métodos parece obvio (observe que podemos referirnos a cualquier elemento por la posición que ocupa o por el texto que contiene).

Por ejemplo, el código siguiente crea un objeto del tipo Choice que contiene las opciones Rojo, Azul, Verde y Negro:

Choice colorElegido = new Choice();
colorElegido.addItem("Rojo");
colorElegido.addItem("Azul");
colorElegido.addItem("Verde");
colorElegido.addItem("Negro");

La clase List

Un objeto de tipo List es muy similar a un elemento Choice. Sin embargo, List se presenta en pantalla como una lista de elementos desplazables. Además, es posible crear listas en donde los usuarios puedan elegir mas de un elemento al mismo tiempo. El constructor para un objeto List tiene la siguiente forma:

List(int elementosVisibles,boolean multipleSeleccionPermitida);

El primer parámetro indica cuantos elementos de la lista son visibles a la vez; si la lista contiene mas elementos que los indicados, el usuario podrá utilizar las barras de desplazamiento para moverse a lo largo de la lista. El segundo parámetro determina si el usuario puede o no seleccionar mas de un elemento a la vez.

La clase List incluye el método addItem(String) para añadir elementos al final de la lista. También se pueden añadir elementos en una posición determinada usando el método addItem(String,int).(los elementos están numerados empezando en cero). El método countItems() devuelve un int que indica el numero de elementos que hay en la lista. El método delItem(int) borra el elemento que se encuentra en la posición indicada. Y el método select(int) se puede emplear para dejar seleccionado el elemento de la posición indicada en la lista.

Si únicamente esta seleccionado un elemento de la lista, el método getSelectedIndex() devuelve el índice del elemento y getSelectedItem() devuelve el elemento. Sin embargo, si no hay elementos seleccionados o hay mas de uno, getSelectedIndex() devuelve -1, y getSelectedItem() devuelve null. En este caso, deberá emplear los métodos getSelectedItems() y getSelectedIndexes() para determinar cuantos elementos se han seleccionados. (Sin embargo, estos métodos devuelven series (arrays), que no estudiaremos hasta el Capítulo 7)


Las clases TextField y TextArea

TextField y TextAreas son cajas donde el usuario puede escribir y editar texto. La diferencia entre ellas es que TextField contiene una única línea de texto editable, mientras que TextArea presenta múltiples líneas e incluye barras de scroll para que el usuario pueda desplazarse por todo el contenido de área. (También es posible hacer que tanto TextField como TextArea sean accesibles únicamente como lectura, de tal forma que el usuario las pueda leer pero no modificar.)

Tanto TextField como TextArea son subclases de TextComponent, que a su vez es subclase de Component. La clase TextComponent soporta la idea de la selección. La selección es un subconjunto de caracteres incluyendo todos los caracteres desde la posición de inicio hasta la de fin. La selección, aparece iluminada en pantalla. El usuario selecciona texto arrastrando el ratón sobre el mismo. Alguno de los métodos mas útiles incluidos en la clase TextComponent y que pueden ser empleados tanto en TextField como en TextArea son:

Public void setText(String newText); //cambia el texto
Public String getText(); // devuelve una copia del texto
Public String getSelectedText(); // devuelve el texto seleccionado
Public select(int inicio,int fin); //cambia el área de selección
    //quedando seleccionados los incluidos en el rango
    // empezando a contar desde cero
Public int getSelectionStart(); // toma el punto inicial seleccionado
Public int getSelectionEnd(); //Toma el final de la selección
Public void setEditable(boolean PuedeEditarse);
    //Determina de el texto puede ser o no editado 
    // por el usuario

La clase TextField no aporta ningún método útil mas a este conjunto. El constructor para TextField toma la forma

TextField(int columnas);

donde columnas, especifica el numero de caracteres que deben ser visibles en el campo de texto. Esto se utiliza para determinar la anchura del campo de texto. (Dado que los caracteres pueden ser de distinto tamaño, el numero de caracteres visibles en un campo de texto, puede no coincidir exactamente con el numero de columnas.). La indicación del numero de columnas, no es obligatoria, si no se indica, el campo de texto se expandirá a toda el área disponible. En este caso, puede emplear el constructor TextField(), sin parámetros. También puede utilizar los siguientes constructores para indicar el contenido inicial:

TextField(String contenido);
TextField(String contenido, int columnas);

Los constructores para TextArea son:

TextArea();
TextArea(int líneas, int columnas);
TextArea(String contenido);
TextArea(String contenido, int líneas, int columnas);

El parámetro líneas, especifica cuantas líneas  serán visibles en el área de texto. Esto, determinara la altura del área. Es común el utilizar el área de texto como componente central de BorderLayout. En este caso, es mejor no especificar el numero de líneas ni de columnas, permitiendo así  que el área se expanda para llenar todo el espacio central del contenedor.

La clase TextArea añade algunos procedimientos bastante útiles a los ya heredados de TextComponent.

public void appendText(String text);
    // añade el texto indicado al final del contenido actual
public void insertText(String text, int pos);
    //inserta texto empezando en la posición indicada
public void replaceText(String text, int inicio, int fin);
    //borra el área de texto especificado por inicio/fin
    // y en su lugar inserta el nuevo texto

La clase ScrollBar

Finalmente hemos llegado a la clase ScrollBar. Esencialmente, ScrollBar permite al usuario el seleccionar un valor entero de entre un rango de valores. Las barras pueden ser horizontales o verticales y tienen los siguientes componentesCurso de Java ScrollBar

La posición del “tab” especifica el valor seleccionado en cada momento. El usuario puede mover el tab arrastrándolo con el ratón, o pulsando sobre alguna de las otras partes de la barra. En algunas plataformas, el tamaño de la barra indica que porción de la región de scroll es visible en cada momento.

Una barra de scroll tiene cuatro valores enteros asociados:

  • min, que especifica el punto de partida del rango de posibles valores

  • max, que especifica el punto de final del rango de posibles valores

  • value, que define el valor seleccionado en cada momento, en alguna parte dentro del rango definido por mínimo y máximo

  • visible, que especifica el tamaño del tab

Estos valores se deben indicar cuando se crea la barra. El constructor toma la forma

ScrollBar(int orientación,int value,int visible, int min, int max);

La orientación que especifica si la barra es horizontal o vertical, puede tener uno de los siguientes valores, definidos por constantes  Scrollbar.HORIZONTAL. o Scrollbar.VERTICAL. Puede establecer el value de la barra en cualquier momento con el método setValue(int).Si quiere establecer cualquier otro valor, lo puede hacer utilizando el método:

public void setValues(int value, int visible, int min, int max);

Los métodos getValue(), getVisible(), getMinimum(), y getMaximun(), permiten leer el valor de cada uno de los parámetros.

La siguiente pregunta es, cuanto se ha de mover el tab en la región de scroll cuando el usuario pulsa las flechas arriba/abajo  o página adelante/atrás?. La cantidad que value cambia cuando el usuario pulsa flecha arriba/abajo, se denomina incremento. La cantidad que cambia cuando el usuario pulsa pagina adelanta/atrás, se llama incremento de pagina. Por defecto, ambos valores valen 1. Pueden establecerse utilizando los siguientes métodos:

public void setLineIncrement(int incrementoLinea);
public void setPageIncrement(int incrementoPagina);

Veamos un ejemplo. Supongamos que quiere utilizar un área de dibujo muy grande. que es demasiado grande para caber en la pantalla. Puede decidir presentar solo una parte del área y proporcionar barras de scroll para permitir al usuario que se desplace por toda el área. Vamos a decir que el tamaño real del área es de 1000 por 1000 pixeles, y la región que puede presentar es de 200 por 200. Vamos a ver como podría establecer la barra vertical, la horizontal, seria básicamente lo mismo.

El visible de la barra de scroll deberá ser 200, dado que es la cantidad de pixeles que quiere presentar. El value de scroll representa la coordenada vertical del pixel que esta situado en la parte superior del display. (Cuando el valor cambie, deberá redibujar el área de display). El valor mínimo será 0, y el máximo será 800 ( El máximo no puede ser 1000 porque cuando el scroll llegue al máximo, la coordenada de la base debe ser 1000, luego la coordenada de la parte superior deberá ser 1000-200 = 800)

El incremento de pagina para el scroll deberá ser algún valor ligeramente inferior a 200, pongamos 190.Así, cuando el usuario utilice al avance/retroceso pagina, el área de display avanzara un valor casi igual a su tamaño. El incremento de línea podría ser 1, y seria correcto, pero puede que sea muy pequeño. Un incremento de línea de 15, puede que tenga mas sentido, dado que el display avanzara 15 pixeles cuando el usuario pulse las flechas arriba/abajo. Como es natural, todos estos valores deberán ser recalculados si el área de display cambia de tamaño.


Ya esta. He explicado todas las subclases de Component, y he mencionado bastantes de los métodos mas útiles de esas clases.  Toma su tiempo el usar esos componentes para conseguir algo valido. Como siempre, deberá practicar, experimentar, y buscar así mismo la información que necesite.

Acerca de Miguel Garcia

Programador, Desarrollador web, Formador en distintas areas de informatica y director de equipos multidisciplinares.
Esta entrada fue publicada en Formacion, Java y etiquetada , , , . Guarda el enlace permanente.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.