📄 java8.htm
字号:
Por otra parte, creamos el objeto <FONT FACE="Arial">listaPueblos</FONT>
como <FONT FACE="Arial">new List(4, false)</FONT>, que indica
que la lista va a tener 4 renglones y sólo se puede seleccionar
un ítem por vez. Agregamos luego 6 ítems mediante
<FONT FACE="Arial">addItem</FONT> y la agregamos al panel.
<P>
Ahora ya podemos agregar las listas a nuestra ventana y poner
un par de variables para guardarlas:<BR>
<PRE>
<FONT SIZE=2>class Ventana8 extends Frame { // hija de Frame
<B>SelecPueblo cs; // ciudad de salida
SelecPueblo cl; // ciudad de llegada
</B>button ok; // también el botón de compra de pasajes
boolean enApplet; // y otra para indicar si es un applet o no
Ventana8 (String titulo, boolean enApplet) { // un constructor
super(titulo); // llama al de Frame
this.enApplet = enApplet; // guardamos esto
<B>cs = new SelecPueblo("SALIDA"); // CIUDAD DE SALIDA
add ("Center", cs);
cl = new SelecPueblo("LLEGADA"); // CIUDAD DE LLEGADA
add ("East", cl);
</B>ok = new Button("Viaje: de ? a ? el ?/?/?");
add("South",ok);
pack(); // dimensionamos la ventana
show(); // y la mostramos!
}</FONT>
</PRE>
<P>
...........................<BR>
<P>
Ya pueden ir probando cómo queda, aunque por ahora mucha
funcionalidad no tenemos...
<H3>Agregando fechas</H3>
<P>
Otro panel más nos servirá para seleccionar o entrar
la fecha:<BR>
<PRE>
<FONT SIZE=2>import java.util.*;
import java.awt.*;
class DiaPartida extends Panel {
private TextField elDia;
private Button hoy;
private Button diasiguiente;
DiaPartida() {
setLayout (new GridLayout (4,1));
elDia = new TextField();
elDia.setText(GetHoy());
hoy = new Button ("Hoy");
diasiguiente = new Button ("Mañana");
add (new Label ("Día salida: "));
add (elDia);
add (hoy);
add (diasiguiente);
}
private String GetHoy() {
Date d = new Date();
int dia = d.getDate();
int mes = d.getMonth();
int ano = d.getYear();
return dia+"/"+mes+"/"+ano;
}
private String GetManana() {
Date d = new Date();
int dia = d.getDate();
int mes = d.getMonth();
int ano = d.getYear();
dia = dia++;
switch (mes) {
case (1):
case (3):
case (5):
case (7):
case (8):
case (10): if (dia>31) {
dia = 1;
mes++;
}
break;
case (12): if (dia>31) {
dia = 1;
mes = 1;
ano++;
}
break;
case (4):
case (6):
case (9):
case (11): if (dia>30) {
dia = 1;
mes++;
}
break;
default: if (dia>28) { // ojo, hay que corregir para bisiestos!
dia = 1;
mes++;
}
}
return dia+"/"+mes+"/"+ano;
}
public String getDescription() {
return elDia.getText();
}
public boolean handleEvent (Event e) {
if (e.target == hoy)
elDia.setText(GetHoy());
if (e.target == diasiguiente)
elDia.setText(GetManana());
return super.handleEvent(e);
}
}<BR>
</FONT>
</PRE>
<P>
Este es un poco más largo pero no más complejo.
Vamos por parte:<BR>
<PRE>
<FONT SIZE=2>DiaPartida() {
setLayout (new GridLayout (4,1));
elDia = new TextField();
elDia.setText(GetHoy());
hoy = new Button ("Hoy");
diasiguiente = new Button ("Mañana");
add (new Label ("Día salida: "));
add (elDia);
add (hoy);
add (diasiguiente);
}<BR>
</FONT>
</PRE>
<P>
El constructor crea un panel con cuatro campos en forma de grilla
vertical, donde mostrará el texto "Día salida:
", el campo de entrada de texto <FONT FACE="Arial">elDia</FONT>
y los botones <FONT FACE="Arial">hoy</FONT> y <FONT FACE="Arial">diasiguiente</FONT>.
<P>
El método privado <FONT FACE="Arial">getHoy</FONT> usa
los métodos <FONT FACE="Arial">getDate</FONT>, <FONT FACE="Arial">getMonth</FONT>
y <FONT FACE="Arial">getYear</FONT> de la clase date para armar
un <FONT FACE="Arial">String</FONT> con la fecha actual. El método
privado <FONT FACE="Arial">getManana</FONT> hace lo mismo para
leer la fecha actual, y le suma 1 al día para tener el
día siguiente. El <FONT FACE="Arial">switch</FONT> siguiente
verifica que si pasó de fin de mes tome el primer día
y el mes siguiente (o el primer día del año siguiente
si es en diciembre). Notar que no se consideraron los años
bisiestos en febrero para no complicar el método, pero
no es difícil de corregir.
<P>
Otra manera sería armar un <I>array</I> con los días
de cada mes, corregir los días de febrero para los años
bisiestos, y comparar contra este <I>array</I> en lugar de usar
un <I>switch</I>. La idea siempre es la misma: devolver un <FONT FACE="Arial">String</FONT>
con la fecha del día siguiente.
<P>
Notar algo interesante: como estas clases se cargan y ejecutan
en la máquina <I>cliente</I>, la fecha que aparece es la
del <I>cliente</I> y no la del <I>servidor</I> (que puede ser
diferente depende la hora y el lugar del mundo en que estén
ambas máquinas).
<P>
El método <FONT FACE="Arial">getDescription</FONT> es público
y se usa para acceder a la fecha que se ha ingresado desde las
demás clases; simplemente devuelve el contenido del campo
<FONT FACE="Arial">elDia</FONT>, de clase <I>TextField</I>.
<P>
Aquí hemos desarrollado también el método
<FONT FACE="Arial">handleEvent</FONT>:<BR>
<PRE>
<FONT SIZE=2>public boolean handleEvent (Event e) {
if (e.target == hoy)
elDia.setText(GetHoy());
if (e.target == diasiguiente)
elDia.setText(GetManana());
return super.handleEvent(e);
}<BR>
</FONT>
</PRE>
<P>
En caso de alguna acción sobre uno de los botones, el método
<FONT FACE="Arial">setText</FONT> (de la clase <I>TextField</I>)
pone en el campo de texto <FONT FACE="Arial">elDia</FONT> el valor
del día actual o el siguiente.
<P>
Notar que sólo hemos considerado que haya algún
evento y no un tipo de evento en particular; en realidad el método
va a actuar por ejemplo tanto al presionar el mouse sobre el botón
como al soltarlo. Pero esto no nos molesta.
<P>
<FONT FACE="Arial">super.handleEvent</FONT> se encarga de otros
eventos dirigidos al panel, como la entrada de datos por teclado
al campo de texto por ejemplo.
<H3>Juntando todo hasta aquí</H3>
<P>
Bueno, ahora vamos a reunir las piezas que tenemos hasta ahora
agregando estos métodos a nuestra clase <FONT FACE="Arial">Ventana8</FONT>
para ver cómo queda la ventana completa:<BR>
<PRE>
<FONT SIZE=2>class Ventana8 extends Frame { // hija de Frame
SelecPueblo cs; // ciudad de salida
SelecPueblo cl; // ciudad de llegada
<B>DiaPartida dp; // día de salida
</B>button ok; // botón de compra de pasajes
boolean enApplet; // para indicar si es un applet o no
Ventana8 (String titulo, boolean enApplet) { // un constructor
super(titulo); // llama al de Frame
this.enApplet = enApplet; // guardamos esto
<B>dp = new DiaPartida(); // DIA DE SALIDA
add ("West", dp);
</B>cs = new SelecPueblo("SALIDA"); // CIUDAD DE SALIDA
add ("Center", cs);
cl = new SelecPueblo("LLEGADA"); // CIUDAD DE LLEGADA
add ("East", cl);
ok = new Button("Viaje: de ? a ? el ?/?/?");
add("South",ok);
pack(); // dimensionamos la ventana
show(); // y la mostramos!
}</FONT>
</PRE>
<P>
...........................<BR>
<P>
Nos detenemos aquí por ahora; compilen y prueben las clases
y en la próxima agregaremos a <FONT FACE="Arial">Ventana8</FONT>
métodos para procesar el texto del botón de compra
y para actuar cuando se lo presiona.<BR>
<BR>
<P>
Jorge Bourdette<P>
<A HREF=mailto:jpb@amarillas.com>jpb@amarillas.com</A>
</BODY>
</HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -