HTMLpointHTMLpoint HTMLpoint.com


 Listas y selecciones



A menudo en las interfaces de nuestro Apliques nos sucede que el usuario tiene que hacer una o más selecciones entre varias posibilidades. Para esto tenemos que hacer una lista de las posibilidades y después leer la opción.
Para hacerlo podemos utilizar las listas, que representan una serie de objetos y dan la posibilidad de elegir. Pensemos, por ejemplo, en un aplique que gestiona las reservas de visitas guiadas de algunas localidades y que nos obligue a elegir una.
Además de las form conocidas para el Nombre, Apellidos, etc.. tendremos la lista de las localidades. Analicemos cómo podemos implementarla. Para construir la lista utilizaremos uno de los tres constructores:

List() , crear una nueva lista
List(int rows), crea una nueva lista con rows líneas
List(int rows, boolean multipleMode), crea una nueva lista con rows líneas, y se le dice que, según el valor booleano multipleMode, se podrán elegir uno o más elementos de la lista.

En nuestro caso utilizaremos la tercera forma de constructor.

List lista=new List(0,true);

Algunos métodos que podemos utilizar en las listas son:

void add(String item) e void add(String item, int index), para colgar, al final de la lista o en cierta posición, un nuevo componente.

void addActionListener(ActionListener l), para asociar un ActionListener a la lista.
void addItemListener(ItemListener l), para asociar un ItemListener a la lista.
String getItem(int index), para tener el elemento en posición indicada.
int getItemCount() , para obtener el número de los elementos.
String[] getItems(), para obtener todos los elementos.
EventListener[] getListeners(Class listenerType) , para obtener los oyentes asociados a la lista del tipo que queremos.
Dimension getMinimumSize(), da el tamaño mínimo de la lista.
Dimension getPreferredSize(), da el tamaño preferido para la lista.
int getRows() , dice el número de líneas al momento visibles en la lista.
Int getSelectedIndex(), da el índice del elemento seleccionado.
int[] getSelectedIndexes(), da los índices de los elementos seleccionados.
String getSelectedItem(), da el objeto seleccionado.
String[]getSelectedItems(), da los objetos seleccionados.
Object[] getSelectedObjects(), da la lista de los elementos seleccionados en un vector de objetos.
boolean isIndexSelected(int index), dice si el índice está seleccionado.
boolean isMultipleMode(), dice si, en la lista, se pueden seleccionar más elementos.
void makeVisible(int index), visualiza el item en la posición indicada.
void remove(int position), void remove(String item), elimina los elementos indicados por el índice o la etiqueta.
void removeAll(), elimina todos los elementos de la lista.
void removeActionListener(ActionListener l) e void removeItemListener(ItemListener l), eliminan los oyentes de sucesos definidos para la lista.
void replaceItem(String newValue, int index), modifica el elemento especificado.
void select(int index), selecciona el elemento indicado en la lista.
void setMultipleMode(boolean b), dice a la lista si es posible seleccionar sólo un elemento o más de uno.

Veamos el ejemplo sobre el uso de las listas.

import java.awt.*;
import java.awt.event.*;

public class listas extends Frame
{

List lista=new List(0,true);
Label text=new Label("Maravillas que se pueden visitar en la localidad elegida");

public listas()
{
super("Elegir itinerario");

lista.add("Bienvenido");
lista.add("Foiano de Val Fortore");
lista.add("Baselice");
lista.add("San Bartolomeo en Galdo");
lista.add("San Marco de los Cavoti");
lista.add("Montefalcone en Val Fortore");
lista.add("Pesco Sannita");
lista.add("Colle Sannita");
lista.add("Castelvetere en Val Fortore");
lista.add("Castelfranco en Miscano");
lista.add("Ginestra de los Schiavoni");
lista.add("San Giorgio la Molara");
lista.add("Molinara");
lista.add("Pietrelcina");
lista.add("Fragneto Monforte");
lista.add("Circello");
lista.add("Campolattaro");

add(lista,BorderLayout.CENTER);
add(text,BorderLayout.SOUTH);

addWindowListener(new listeWindowListener());
lista.addItemListener(new escuchaLista());

setSize(350,100);

setResizable(false);

show();

}


public static void main(String [] arg)
{

new listas();

}


class listeWindowListener implements WindowListener
{

public void windowActivated(WindowEvent e)
{}

public void windowClosed(WindowEvent e)
{}

public void windowClosing(WindowEvent e)
{


String[] s=lista.getSelectedItems();
int i=0;
System.out.println("Itinerario seleccionado");
try
{
while (true)
{

System.out.println(s[i++]);

}

}
catch (ArrayIndexOutOfBoundsException er)
{System.out.println("Qué lo pases bien...");}
System.exit(0);
}

public void windowDeactivated(WindowEvent e)
{}

public void windowDeiconified(WindowEvent e)
{}

public void windowIconified(WindowEvent e)
{}

public void windowOpened(WindowEvent e)
{}

}


class escuchaLista implements ItemListener
{

public void itemStateChanged(ItemEvent e)
{

int índice=((Integer) e.getItem()).intValue();

if (índice==0) text.setText("Rocca de los Rettori, arco de Trajano, anfiteatro Romano, ciudad espectáculo");
if (índice==1) text.setText("localidad San Giovanni, Campanario, via Roma, lago, fiesta S.Giovanni, fiesta del emigrante");
if (índice==2) text.setText("óasis ds San Leonardo");
if (indice==3) text.setText("casco histórico");
if (índice==4) text.setText("casco histórico");
if (índice==5) text.setText("casco histórico");
if (índice==6) text.setText("casco histórico");
if (índice==7) text.setText("casco histórico");
if (índice==8) text.setText("casco histórico");
if (índice==9) text.setText("Bosque");
if (índice==10) text.setText("casco histórico");
if (índice==11) text.setText("Lago de San Giorgio");
if (índice==12) text.setText("casco histórico");
if (índice==13) text.setText("Piana Romana, casco histórico, casas de Padre Pío");
if (índice==14) text.setText("Encuentro internacional de globos, Palacio Ducal");
if (índice==15) text.setText("casco histórico");
if (índice==16) text.setText("Dique de Campolattaro");

}

}

}

Por lo tanto, las listas son unos buenos GUI para que el usuario ponga en marcha una opción entre las muchas posibilidades.
Hay otro GUI que sirve para esto, que prácticamente es una lista que aparece y desaparece, en el sentido de que se puede ver sólo el objeto seleccionado y que los demás se ven sólo cuando hay que hacer la selección, tipo menú, mientras en las listas se pueden ver siempre.
El GUI del que estoy hablando es el Choice (selección), cuyo funcionamiento es parecido al de las listas.
El constructor es uno sin parámetros, mientras los métodos son:

void add(String item), añade una posibilidad al final de las selecciones posibles.
void addItem(String item), como la add
void addItemListener(ItemListener l), asocia un oyente de sucesos para la Choice.
String getItem(int index), devuelve la elección posible que se encuentra en el índice .
int getItemCount(), da el número de posibilidades para la Choice.
EventListener[] getListeners(Class listenerType), da todos los oyentes asociados a la Choice.
int getSelectedIndex(), devuelve el índice de la lista seleccionada en la Choice.
String getSelectedItem(), devuelve la opción seleccionada en la Choice.
Object[] getSelectedObjects(), da todos los item seleccionados.
void insert(String item, int index), introduce una seleccióm en la posición indicada de la Choice.

void remove(int position), void remove(String item), void removeAll() , para eliminar las selecciones posibles de la lista.

void removeItemListener(ItemListener l), elimina el oyente de sucesos de tipo ItemListener asociado a la Choice.

void select(int pos), void select(String str), para seleccionar una opción.

Escribamos un pequeño programa que utilice las Choice. Pero, como hasta ahora hemos creado unas aplicaciones a ventana, creemos un aplique, y visto que es GUI, se pueden utilizar en los dos tipos de programas.
Hablando de aplique, como no lo hemos hacho hasta ahora, creemos un aplique que lee los parámetros que le pasan los archivos html que lo invoca. Es lo que hacen prácticamente la mayor parte de los apliques del sito HTMLpoint.
En el aplique, como ejemplo, he puesto un pequeño control sobre el campo autor. Esto me sirve para enseñaros cómo se puede hacer. Puede resultar útil si se crea un aplique y lo distribuimos de forma que sea obligatorio el parámetro del autor y su valor. También sirve para evitar que otros puedan hacerse creadores del aplique y, por lo tanto, pretender los derechos de la creación del aplique.

El control no es complicado, un hacker lo evitaría fácilmente. Sin embargo un hacker no tiene ningún interés en destruir un programa free, sólo para eliminar los derechos de autor. En cambio, para un usuario normal es imposible poner en marcha el programa sin especificar el nombre del autor. El nombre puede incluso ser un número de serie si queremos vender un programa.

El archivo html, se llamará Choice.html, y su contenido es:

<html>
<head>
<title>
Ejemplo de uso de la java.awt.Choice y del cambio de los parámetros a un aplique
</title>
</head>
<body>
<APPLET code="Selecciones.class" width=350 height=100>
<param name=loc1 value="Bienvenido">
<param name=loc2 value="Foiano de Val Fortore">
<param name=loc3 value="Baselice">
<param name=loc4 value="San Bartolomeo en Galdo">
<param name=loc5 value="San Marco de los Cavoti">
<param name=loc6 value="Montefalcone in Val Fortore">
<param name=loc7 value="Pesco Sannita">
<param name=loc8 value="Colle Sannita">
<param name=loc9 value="Castelvetere en Val Fortore">
<param name=loc10 value="Castelfranco en Miscano">
<param name=loc11 value="Ginestra de los Schiavoni">
<param name=loc12 value="San Giorgio la Molara">
<param name=loc13 value="Molinara">
<param name=loc14 value="Fragneto Monforte">
<param name=loc15 value="Circello">
<param name=loc16 value="Campolattaro">
<param name=autore value="Pietro Castellucci">

</APPLET>
</body>
</html>

Mientras que el código del aplique, editado en el archivo llamado Selecciones.java, es:

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Selecciones extends Applet
{


Label text=new Label("Maravillas que se pueden visitar en la localidad seleccionada");
Choice scelte=new Choice();
public void init()
{

// Control de los derechos de autor:
String autor=getParameter("autor");
if (autor==null) System.exit(0);
if (autor.compareTo("Pietro Castellucci")!=0)
{
System.out.println("Parámetro autor no valido, introducir como valor Pietro Castellucci");
System.exit(0);
}


String p=getParameter("loc1");
if (p==null) p="Localidad 1 no definida";
scelte.add(p);

p=getParameter("loc2");
if (p==null) p="Localidad 2 no definida";
scelte.add(p);

p=getParameter("loc3");
if (p==null) p="Localidad 3 no definida";
scelte.add(p);

scelte.add(p);

p=getParameter("loc4");
if (p==null) p="Localidad 4 no definida";
scelte.add(p);

p=getParameter("loc5");
if (p==null) p="Localidad 5 no definida";
scelte.add(p);

p=getParameter("loc6");
if (p==null) p="Localidad 6 no definida";
scelte.add(p);

p=getParameter("loc7");
if (p==null) p="Localidad 7 no definida";
scelte.add(p);

p=getParameter("loc8");
if (p==null) p="Localidad 8 no definida";
scelte.add(p);

p=getParameter("loc9");
if (p==null) p="Localidad 9 no definida";
scelte.add(p);

p=getParameter("loc10");
if (p==null) p="Localidad 10 no definida";
scelte.add(p);

p=getParameter("loc11");
if (p==null) p="Localidad 11 no definida";
scelte.add(p);

p=getParameter("loc12");
if (p==null) p="Localidad 12 no definida";
scelte.add(p);

p=getParameter("loc13");
if (p==null) p="Localidad 13 no definida";
scelte.add(p);

p=getParameter("loc14");
if (p==null) p="Localidad 14 no definida";
scelte.add(p);

p=getParameter("loc15");
if (p==null) p="Localidad 15 no definida";
scelte.add(p);

p=getParameter("loc16");
if (p==null) p="Localidad 16 no definida";
scelte.add(p);

p=getParameter("loc17");
if (p==null) p="Localidad 17 no definida";
scelte.add(p);

scelte.addItemListener(new escuchaChoice());


// Visualizzo la Choice

add(selecciones, BorderLayout.CENTER);
add(text, BorderLayout.SOUTH);

}

class escuchaChoice implements ItemListener
{

public void itemStateChanged(ItemEvent e)
{

int indice=scelte.getSelectedIndex();

if (indice==0) text.setText("Rocca dei Rettori, arco de Trajano, anfiteatro Romano");
if (indice==1) text.setText("localidad San Giovanni, Campanario, via Roma, lago");
if (índice==2) text.setText("óasi de San Leonardo");
if (índice==3) text.setText("casco histórico");
if (índice==4) text.setText("casco histórico");
if (índice==5) text.setText("");
if (índice==6) text.setText("");
if (índice==7) text.setText("");
if (índice==8) text.setText("");
if (índice==9) text.setText("Bosque");
if (índice==10) text.setText("");
if (índice==11) text.setText("Lago de San Giorgio");
if (índice==12) text.setText("");
if (índice==13) text.setText("Piana Romana, casco histórico, casas de Padre Pío");
if (índice==14) text.setText("Encuentro internacional de globos, palcio Ducale");
if (índice==15) text.setText("");
if (índice==16) text.setText("Dique de Campolattaro");
}
}
}

El último componente GUI que veremos en esta lección es el ScrollPane, es decir, un panel en el que es posible introducir un componente tan grande como queramos, y que tiene que ser visualizado a trozos.
El ScrollPane usa dos Scrollbar, una horizontal y otra vertical, para seleccionar la parte del GUI que queremos ver. Fijaos que la Scrollbar es un objeto también, por lo tanto, se puede introducir y gestionar en las proprias aplicaciones. En el ScrollPane se puede elegir si visualizar las Scrollbar siempre, nunca o sólo cuando sea necesario.
Un ScrollPane típico es el que utilizamos para visualizar un archivo de texto.
Hay dos tipos de constructores para el objeto:

ScrollPane(int sbp), crea un ScrollPane que pueda visualizar las Scrollbar definidas por spb.

Los valores posibles son :
ScrollPane.SCROLLBARS_ALWAYS siempre a la vista
ScrollPane.SCROLLBARS_AS_NEEDED a la vista sólo si lo necesitamos
ScrollPane.SCROLLBARS_NEVER nunca a la vista

ScrollPane(), crea un ScrollPane que pueda visualizar ScrollPane.SCROLLBARS_AS_NEEDED.

Entre los métodos, además de los que sirven para gestionar el ScrollPane, encontramos los de Container y de Component. En efecto, ScrollPane es una extensión de Container, por lo tanto, si lo vemos como un contenedor, se puede ver como un componente.




  Volver al inicio de la página