Label comentario = new Label("Presione un botón", Label.CENTER);
si = new Button("Sí"); no = new Button("No"); add("North", comentario); add("East", si); add("West", no);de desarrollo y debugging! En Java, inclusive, ni siquiera existen las variables globales! (Aunque parezca difícil de aceptar, esto es una gran ventaja desde el punto de vista del desarrollo). En cuanto a la herencia, simplemente significa que se pueden crear nuevas clases que hereden de otras preexistentes; esto simplifica la programación, porque las clases hijas incorporan automáticamente los métodos de las madres. Por ejemplo, nuestra clase "auto" podría heredar de otra más general, "vehículo", y simplemente redefinir los métodos para el caso particular de los automóviles… lo que significa que, con una buena biblioteca de clases, se puede reutilizar mucho código inclusive sin saber lo que tiene adentro.Encapsulamiento significa que el objeto es auto-contenido, o sea que la misma definición del objeto incluye tanto los datos que éste usa (atributos) como los procedimientos (métodos) que actúan sobre los mismos. Cuando se utiliza programación orientada a objetos, se definen clases (que definen objetos genéricos) y la forma en que los objetos interactúan entre ellos, a través de mensajes. Al crear un objeto de una clase dada, se dice que se crea una instancia de la clase, o un objeto propiamente dicho. Por ejemplo, una clase podría ser "autos", y un auto dado es una instancia de la clase. La ventaja de esto es que como no hay programas que actúen modificando al objeto, éste se mantiene en cierto modo independiente del resto de la aplicación. Si es necesario modificar el objeto (por ejemplo, para darle más capacidades), esto se puede hacer sin tocar el resto de la aplicación… lo que ahorra mucho tiempo Bueno, ahora vamos a reunir las piezas que tenemos hasta ahora agregando estos métodos a nuestra clase Ventana8 para ver cómo queda la ventana completa:super.handleEvent se encarga de otros eventos dirigidos al panel, como la entrada de datos por teclado al campo de texto por ejemplo.En caso de alguna acción sobre uno de los botones, el método setText (de la clase TextField) pone en el campo de texto elDia el valor del día actual o el siguiente. 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.public boolean handleEvent (Event e) { if (e.target == hoy) elDia.setText(GetHoy()); if (e.target == diasiguiente) elDia.setText(GetManana()); return super.handleEvent(e); }El método getDescription 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 elDia, de clase TextField. Aquí hemos desarrollado también el método handleEvent:Otra manera sería armar un array con los días de cada mes, corregir los días de febrero para los años bisiestos, y comparar contra este array en lugar de usar un switch. La idea siempre es la misma: devolver un String con la fecha del día siguiente. Notar algo interesante: como estas clases se cargan y ejecutan en la máquina cliente, la fecha que aparece es la del cliente y no la del servidor (que puede ser diferente depende la hora y el lugar del mundo en que estén ambas máquinas).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 elDia y los botones hoy y diasiguiente. El método privado getHoy usa los métodos getDate, getMonth y getYear de la clase date para armar un String con la fecha actual. El método privado getManana hace lo mismo para leer la fecha actual, y le suma 1 al día para tener el día siguiente. El switch 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. Este es un poco más largo pero no más complejo. Vamos por parte: 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); } 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. 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(); } } No hay mucho para analizar aquí, creo. La variable listaPueblos es privada, pero puede consultarse cuál es la ciudad seleccionada mediante getDescription (que es public). Este método llama al método getSelectedItem de la lista, que devuelve el texto seleccionado. En el constructor, armamos el texto del título como un StringBuffer. Los objetos StringBuffer son similares a los de clase String pero pueden ser modificados. En cambio los objetos String, una vez creados, no pueden ser modificados directamente: sus métodos (concat, toLowerCase, etc.) simplemente crean un nuevo String con el nuevo valor. Esto lo hicimos para introducir esta nueva clase; por supuesto hubiera sido más fácil poner, como pueden comprobar, con el mismo resultado: String tit = "Seleccione ciudad de "+salidaOllegada+": "; add("North", new Label(tit)); Por otra parte, creamos el objeto listaPueblos como new List(4, false), 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 addItem y la agregamos al panel. Ahora ya podemos agregar las listas a nuestra ventana y poner un par de variables para guardarlas: class Ventana8 extends Frame { // hija de Frame SelecPueblo cs; // ciudad de salida SelecPueblo cl; // ciudad de llegada 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 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! } ........................... Ya pueden ir probando cómo queda, aunque por ahora mucha funcionalidad no tenemos... http://www.librosgratis.org Página 38 Agregando fechas Otro panel más nos servirá para seleccionar o entrar la fecha: 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++;