?? java8.htm
字號:
<HTML>
<HEAD>
<TITLE>Java desde Cero</TITLE>
</HEAD>
<BODY background=/iconos/1.gif TEXT=000000 LINK=FF0000 VLINK=A62A2A>
<H1>Una ventana con vida<BR>
</H1>
<P>
Antes que nada, vamos a crear una página HTML para cargar
nuestra clase Ejemplo8, que será un applet (aunque también
la podremos ejecutar en forma standalone con "<FONT FACE="Arial">java
Ejemplo8</FONT>"), por ejemplo:<BR>
<PRE>
<FONT SIZE=2><!-- Archivo Ejemplo8.htm - HTML de ejemplo -->
<HTML>
<HEAD>
<TITLE>Ejemplo 8 - Ventana de datos</TITLE>
</HEAD>
<BODY>
Aqu&iacute; se tiene que abrir una ventana de entrada de datos
<applet code="Ejemplo8.class" width=170 height=150>
</applet>
</BODY>
</HTML><BR>
</FONT>
</PRE>
<P>
Nuestro applet será muy sencillo, ya que utilizará
clases que iremos definiendo en este capítulo; por empezar
sólo creará una ventana que definiremos en la clase
<FONT FACE="Arial">Ventana8</FONT>:<BR>
<PRE>
<FONT SIZE=2>// Archivo: Ejemplo8.java
// Compilar con "javac Ejemplo8.java"
import java.awt.*;
import java.applet.*;
public class Ejemplo8 extends Applet {
public static void main (String arg[]) { // para poder llamarla con "java Ejemplo8"
new Ventana8("Ejemplo Standalone", true);
}
public void init() { // se ejecuta al abrirse un applet
new Ventana8("Ejemplo Applet", false);
}
}<BR>
</FONT>
</PRE>
<P>
Con los parámetros que le pasamos a la clase <FONT FACE="Arial">Ventana8</FONT>
le indicamos el título de la ventana y si se carga como
applet o no (ya que el método de cierre varía).
<BR>
<H2>Viajando con Java</H2>
<P>
Ahora vamos a trabajar con nuestra clase <FONT FACE="Arial">Ventana8</FONT>,
una ventana que nos permita seleccionar una fecha y dos ciudades
(desde y hasta) que simula una ventana de compra de pasajes de,
por ejemplo, una terminal de ómnibus.
<P>
El ejemplo está basado en uno del libro "Programación
Java" de Macary y Nicolas, aunque algo mejorado y ampliado.
<P>
En nuestra ventana podremos entrar una fecha a mano o directamente
mediante los botones Hoy y Mañana, elegiremos la ciudad
de salida y la de llegada de dos listas, y presionaremos luego
un botón que nos mostrará los servicios disponibles,
nos permitirá comprar los pasajes, etc.
<P>
A medida que entramos los datos, en el botón se irá
mostrando el detalle de lo que se fue seleccionando.
<P>
Nuestra ventana quedará más o menos así:
<BR>
<P>
<IMG SRC="/img00002.gif"><BR>
<P>
Empecemos por armar la estructura de la clase Ventana8:<BR>
<PRE>
<FONT SIZE=2>import java.awt.*;
class Ventana8 extends Frame { // hija de Frame
// aquí agregaremos luego
// algunas variables para guardar datos
// (ciudades de salida y llegada, fecha)
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
// aquí crearemos los botones, listas, etc
// con sus valores iniciales
// y los pondremos en la ventana.
// por ejemplo:
ok = new Button("Viaje: de ? a ? el ?/?/?");
add("South",ok);
pack(); // dimensionamos la ventana
show(); // y la mostramos!
}
public boolean handleEvent(Event e) { // para manejar los eventos
if (e.id == Event.WINDOW_DESTROY) { // cerrar la ventana
if (enApplet) dispose();
else System.exit(0);
}
// aquí miraremos si se presionó un botón
// o se eligió algo de una lista
// y actuaremos en consecuencia
return super.handleEvent(e); // los demás eventos los maneja Frame
}
void ActualizaBoton() {
// aquí pondremos un método que servirá
// para actualizar el botón de compra de pasajes,
// ya que el texto del mismo se actualiza cada
// vez que se selecciona una ciudad o se cambia la fecha
}
void Activar() {
// y aquí un método para cuando se presione
// dicho botón, que se supone que va a consultar
// una base de datos y abrir una ventana
// para vendernos el pasaje
}
}<BR>
</FONT>
</PRE>
<P>
Nuestro programa ya funciona! Aunque un poquito incompleto, claro...
<P>
Igual vamos a analizarlo un poco el constructor, que es lo más
interesante aquí.
<P>
Primero llamamos al constructor de la clase madre, que se encarga
de crear la ventana:<BR>
<PRE>
<FONT SIZE=2>Ventana8 (String titulo, boolean enApplet) { // un constructor
super(titulo); // llama al de Frame<BR>
</FONT>
</PRE>
<P>
Esto sería como llamar a <FONT FACE="Arial">super.Frame(titulo)</FONT>,
o bien <FONT FACE="Arial">Frame(titulo)</FONT>, ya que el método
constructor tiene el mismo nombre de la clase. Luego, con:<BR>
<PRE>
<FONT SIZE=2>this.enApplet = enApplet; // guardamos esto<BR>
</FONT>
</PRE>
<P>
asignamos a nuestra variable <FONT FACE="Arial">enApplet</FONT>
de la clase el valor del parámetro que se pasó al
constructor, que se llama igual. El prefijo <FONT FACE="Arial">this</FONT>,
que se refiere a la instancia particular de la clase, permite
diferenciar uno de otro (esto es válido tanto para variables
como para métodos).<BR>
<PRE>
<FONT SIZE=2>ok = new Button("Viaje: de ? a ? el ?/?/?");
add("South",ok);<BR>
</FONT>
</PRE>
<P>
Aquí hemos creado un botón ubicado al pie de la
ventana (por ahora lo único que pusimos), y luego dimensionamos
la ventana y la mostramos:<BR>
<PRE>
<FONT SIZE=2>pack(); // dimensionamos la ventana
show(); // y la mostramos!<BR>
</FONT>
</PRE>
<H3>Preparando listas</H3>
<P>
Ahora vamos a empezar a crear otros objetos para ir completando
nuestra aplicación. Comencemos con las listas de ciudades.
<P>
Para eso, vamos a crear un objeto descendiente de <FONT FACE="Arial">Panel</FONT>
que simplemente contenga una lista de ciudades predefinidas y
un título que diga "Seleccione ciudad de", y
a continuación "salida" o "llegada".
<P>
También agregaremos un método <BR>
<PRE>
<FONT SIZE=2>import java.awt.*;
class SelecPueblo extends Panel {
private List listaPueblos;
SelecPueblo (String salidaOllegada) {
setLayout (new BorderLayout (20,20));
// armamos el título, que va a ser un Label:
StringBuffer titulo = new StringBuffer();
titulo.append("Seleccione ciudad de ");
titulo.append(salidaOllegada);
titulo.append(": ");
add("North", new Label(titulo.toString()));
// armamos la lista de ciudades, que va a ser un List:
listaPueblos = new List (4, false);
listaPueblos.addItem("Buenos Aires");
listaPueblos.addItem("La Plata");
listaPueblos.addItem("Azul");
listaPueblos.addItem("Rosario");
listaPueblos.addItem("Cordoba");
listaPueblos.addItem("Bahía Blanca");
add("South", listaPueblos);
}
public String getDescription() {
return listaPueblos.getSelectedItem();
}
}<BR>
</FONT>
</PRE>
<P>
No hay mucho para analizar aquí, creo. La variable <FONT FACE="Arial">listaPueblos</FONT>
es privada, pero puede consultarse cuál es la ciudad seleccionada
mediante <FONT FACE="Arial">getDescription</FONT> (que es public).
Este método llama al método <FONT FACE="Arial">getSelectedItem</FONT>
de la lista, que devuelve el texto seleccionado.
<P>
En el constructor, armamos el texto del título como un
<FONT FACE="Arial">StringBuffer</FONT>. Los objetos <FONT FACE="Arial">StringBuffer</FONT>
son similares a los de clase <FONT FACE="Arial">String</FONT>
pero pueden ser modificados. En cambio los objetos <FONT FACE="Arial">String</FONT>,
una vez creados, no pueden ser modificados directamente: sus métodos
(<FONT FACE="Arial">concat</FONT>, <FONT FACE="Arial">toLowerCase</FONT>,
etc.) simplemente crean un nuevo <FONT FACE="Arial">String</FONT>
con el nuevo valor.
<P>
Esto lo hicimos para introducir esta nueva clase; por supuesto
hubiera sido más fácil poner, como pueden comprobar,
con el mismo resultado:<BR>
<PRE>
<FONT SIZE=2>String tit = "Seleccione ciudad de "+salidaOllegada+": ";
add("North", new Label(tit));<BR>
</FONT>
</PRE>
<P>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -