Ejercicios PLJ
Ejercicios PLJ
Programación en Lenguaje
Java
Sesiones de Ejerci c ios
Sesión 1 ______________________________________________________________ 5
Sesión 2 _____________________________________________________________ 13
Sesión 3 _____________________________________________________________ 21
Sesión 4 _____________________________________________________________ 27
Sesión 5 _____________________________________________________________ 35
Sesión 6 _____________________________________________________________ 39
Sesión 7 _____________________________________________________________ 45
Sesión 8 _____________________________________________________________ 51
Sesión 9 _____________________________________________________________ 59
Sesión 10 ____________________________________________________________ 65
Sesión 11 ____________________________________________________________ 73
Sesión 12 ____________________________________________________________ 81
Sesión 13 ____________________________________________________________ 89
Sesión 14 ____________________________________________________________ 95
Sesión 15 ___________________________________________________________ 101
Curso de Programación en Lenguaje Java
-ejercicios-
Sesión 1
Compilación. Paquetes. Hola Mundo.
En este primer ejercicio vamos a realizar la instalación del JDK, necesario para
compilar y ejecutar programas Java.
> C:\j2sdk1.4.2_02\bin\javac
C:\tmp> javac
-5-
Curso de Programación en Lenguaje Java
-ejercicios-
Para ejecutar un programa Java, debes invocar con la JVM una clase
que contenga un método estático llamado main; este es el método que
se ejecutará.
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
// Muestro el marco
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Compila el programa y dará un mensaje de error. ¿Cuál es el error?
¿Cómo corregirlo? (contestalo en el fichero respuestas.txt). Corrige el
error y ejecuta la clase. Deberá aparecer la siguiente ventana, y cada
vez que pinches en el botón debería aparecer "Hola mundo" en la salida
estándar.
-6-
Curso de Programación en Lenguaje Java
-ejercicios-
set CLASSPATH=C:\
package modulo1.sesion1;
-7-
Curso de Programación en Lenguaje Java
-ejercicios-
Por último, para ejecutar el programa recién compilado hay que llamar a
la clase indicando todo su camino (modulo1.sesion1.Ejemplo1). La
variable CLASSPATH debe contener el directorio padre y podemos
llamar al programa desde cualquier directorio.
C:\java>set CLASSPATH=.;C:\java
C:\java>cd ..
C:\> java modulo1.sesion1.Ejemplo1
Hola mundo
-8-
Curso de Programación en Lenguaje Java
-ejercicios-
-9-
Curso de Programación en Lenguaje Java
-ejercicios-
Como verás, ninguna clase tiene el método main, por lo que no se puede
lanzar el programa; escribe la clase GameLauncher, con el método main
que lance el programa. El resultado debe ser algo como:
C:\plj\modulo1>java GameLauncher
Estoy pensando un numero entre 0 y 9 ...
El numero a adivinar es: 2
Yo digo: 0
Yo digo: 6
Yo digo: 2
El jugador 1 dice: 0
El jugador 2 dice: 6
El jugador 3 dice: 2
Tenemos un ganador!
El jugador 1 ha hacertado?: false
El jugador 2 ha hacertado?: false
El jugador 3 ha hacertado?: true
5. Un último programa
- 10 -
Curso de Programación en Lenguaje Java
-ejercicios-
PARA ENTREGAR
¡No lo entregues todavía! Debes entregar todas las sesiones del primer
módulo juntas.
- 11 -
Curso de Programación en Lenguaje Java
-ejercicios-
- 12 -
Curso de Programación en Lenguaje Java
-ejercicios-
Sesión 2
Eclipse. Paquetes. Bean Shell.
1. Instalación de Eclipse
- 13 -
Curso de Programación en Lenguaje Java
-ejercicios-
1. Crea un proyecto Java nuevo con la opción File -> New -> Project.
Llámalo plj y acepta todas las opciones por defecto. Verás que Eclipse
te pide pasar a la perspectiva Java. Acepta. El proyecto se corresponde
con un directorio que se ha creado con el mismo nombre en el directorio
de trabajo de Eclipse. Puedes usar este proyecto durante todo el
curso.
En el proyecto pueden residir todo un conjunto de clases y paquetes;
esto es, en un proyecto puede haber más de un programa ejecutable
- 14 -
Curso de Programación en Lenguaje Java
-ejercicios-
(recuerda que los programas Java son clases que tienen el método
main).
2. Vamos a crear la clase Ejemplo1 con el "Hola mundo".
Selecciona el proyecto y, con el botón derecho, escoge la opción New ->
Class. Dale el nombre Ejemplo1 y activa la opción para que cree un
esqueleto del método "public static void main (String[] args)".
Pulsa en Finish y aparecerá el editor de Eclipse con el fichero de clase.
Al crear la clase, Eclipse introduce comentarios con tareas por hacer que
puedes ver en la vista Tasks. Puedes borrar estos comentarios y se
borran automáticamente las tareas. Escribe en este fichero el programa
Ejemplo1 de la sesión de ayer. Durante la escritura podrás comprobar
que el editor chequea la sintaxis cuando grabas el fichero, indicándote si
hay un error, qué tipo de error es, e incluso sugiriéndote la posible
solución:
- 15 -
Curso de Programación en Lenguaje Java
-ejercicios-
- 16 -
Curso de Programación en Lenguaje Java
-ejercicios-
selecciona como Main class la clase Reverse2 y dale los valores que
quieras a los argumentos del programa. Puedes guardar la configuración
con la opción Apply y ejecutarla con Run. La configuración queda
guardada y puedes lanzarla cuando quieras, por ejemplo después de
realizar modificaciones en el programa principal.
3. La clase plj.geom.Rect
En este ejercicio vamos a compilar en Eclipse la clase Rect, que define un
rectángulo, dentro del package plj.geom.
package plj.geom;
al comienzo del fichero. En Eclipse tendremos una configuración similar
a esta:
3. Escribe una clase de prueba que use la clase Rect y que se llame
PruebaRect.java, en el que se realicen varias operaciones con dos
- 17 -
Curso de Programación en Lenguaje Java
-ejercicios-
import plj.geom.Rect;
4. El intérprete BeanShell
- 18 -
Curso de Programación en Lenguaje Java
-ejercicios-
bsh % addClassPath("G:/eclipse/workspace/plj");
bsh % import plj.geom.Rect;
bsh % Rect r = new Rect(0,0,10,10);
bsh % print (r.toString());
[0.0,0.0; 10.0,10.0]
bsh % r.move(2.0,4.0);
bsh % print (r); // llama implícitamente a
r.toString()
[2.0,4.0; 12.0,14.0]
bsh %
bsh % reloadClasses();
- 19 -
Curso de Programación en Lenguaje Java
-ejercicios-
PARA ENTREGAR
- 20 -
Curso de Programación en Lenguaje Java
-ejercicios-
Sesión 3
API de Java. Métodos y objetos. Modificador static. Herencia.
1. El API de Java
2. Métodos y objetos
- 21 -
Curso de Programación en Lenguaje Java
-ejercicios-
Fichero “Contador.java”:
package modulo1.sesion3;
public class Contador {
static int acumulador = 0;
int valor;
Fichero “ContadorTest.java”:
package modulo1.sesion3;
public class ContadorTest {
public static void main(String[] args) {
Contador c1, c2;
System.out.println(Contador.acumulador());
c1 = new Contador(3);
c2 = new Contador(10);
c1.inc();
c1.inc();
c2.inc();
System.out.println(c1.getValor());
System.out.println(c2.getValor());
System.out.println(Contador.acumulador);
}
}
- 22 -
Curso de Programación en Lenguaje Java
-ejercicios-
package modulo1.sesion3;
public Contador(){
this(Contador.VALOR_INICIAL);
}
- 23 -
Curso de Programación en Lenguaje Java
-ejercicios-
3. Un ejemplo de herencia
package modulo1.sesion3;
package modulo1.sesion3;
package modulo1.sesion3;
class Rectangulo extends Figura {
double lado;
double altura;
- 24 -
Curso de Programación en Lenguaje Java
-ejercicios-
package modulo1.sesion3;
import java.util.Stack;
- 25 -
Curso de Programación en Lenguaje Java
-ejercicios-
• Construye una subclase sólo cuando necesites hacer una versión más
específica de una clase y necesites sobrecargar o añadir nuevas
conductas.
• Usa una clase abstracta cuando quieras definir una plantilla para para
un grupo de subclases, y tengas algún código de implementación que
todas las clases puedan usar. Haz la clase abstracta cuando quieras
garantizar que nadie va a hacer objetos de esa clase.
PARA ENTREGAR
- 26 -
Curso de Programación en Lenguaje Java
-ejercicios-
Sesión 4
Interfaces. Arrays. Colecciones.
2. Un ejemplo de interfaces
package modulo1.sesion4;
import plj.geom.*;
/**
* La interfaz Watcher especifica una posición y una
* dirección en la que se mira. Ambos datos están
referidos
* a un sistema de referencia (mapa) global.
*/
public interface Watcher {
public Position getPos();
public double angle();
}
package modulo1.sesion4;
- 27 -
Curso de Programación en Lenguaje Java
-ejercicios-
package modulo1.sesion4;
import plj.geom.Position;
/**
* doReadings() actualiza el array readings
* con todas las lecturas de distancias
* de objetos frente al sonar en la direccion
* angle() y en un arco y una resolucion definida
por
* el tipo de sonar
*/
public void doReadings() {
}
package modulo1.sesion4;
import plj.geom.Position;
- 28 -
Curso de Programación en Lenguaje Java
-ejercicios-
/**
* doReadings() actualiza bumped.
* true -> si ha habido un contacto
* false -> si el sensor no ha chocado con nada
*/
public void doReadings() {
}
2. Implementando interfaces
- 29 -
Curso de Programación en Lenguaje Java
-ejercicios-
3. Arrays
package modulo1.sesion4;
import java.util.Arrays;
package modulo1.sesion4;
import java.util.Arrays;
- 30 -
Curso de Programación en Lenguaje Java
-ejercicios-
package modulo1.sesion4;
import java.io.*;
for (;;) {
System.out.print("StandardInput> ");
String line = in.readLine();
// El programa termina cuando llegamos al
fin del
// fichero o el usuario introduce quit
if ((line == null) || line.equals("quit"))
break;
// Parsea la linea y calcula la raiz
cuadrada
try {
double x = Double.parseDouble(line);
System.out.println("raiz cuadrada de " +
x + " = "
+ Math.sqrt(x));
}
// Si algo falla muestra un mensaje de error
catch (Exception e) {
System.out.println("Entrada erronea");
}
}
}
}
- 31 -
Curso de Programación en Lenguaje Java
-ejercicios-
4. ArrayLists
package modulo1.sesion4;
import java.util.*;
package modulo1.sesion4;
import java.util.*;
- 32 -
Curso de Programación en Lenguaje Java
-ejercicios-
set.add(new Integer(99));
set.add(new Integer(-5));
PARA ENTREGAR
- 33 -
Curso de Programación en Lenguaje Java
-ejercicios-
- 34 -
Curso de Programación en Lenguaje Java
-ejercicios-
Sesión 5
Modificadores de acceso. Miniproyecto.
1. Modificadores de acceso
Vamos a comenzar la última sesión del módulo con un pequeño ejercicio para
comprobar los modificadores de acceso de Java.
package modulo1.sesion5;
public class Acceso {
public int valorPublico;
int valorDefecto;
protected int valorProtected;
private int valorPrivate;
}
package modulo1.sesion5;
public class TestAcceso{
public void testeador() {
int i;
- 35 -
Curso de Programación en Lenguaje Java
-ejercicios-
i = this.valorPrivado;
i = this.valorDefecto;
i = this.valorProtected;
i = this.valorPublico;
}
}
package modulo1.sesion4;
import modulo1.sesion5.Acceso;
2. Miniproyecto
# #############
# * # #
# ### # # ### #
- 36 -
Curso de Programación en Lenguaje Java
-ejercicios-
# # # ### #
### ######## #
# # #### #
# ### ###### ##
# # ##### ##
# ## # ##
############ ##
Diseño e Implementación
PARA ENTREGAR
- 37 -
Curso de Programación en Lenguaje Java
-ejercicios-
- 38 -
Curso de Programación en Lenguaje Java
-ejercicios-
Sesión 6
1. Vamos a construir un ejercicio completo de uso de excepciones. Para ello
seguiremos los pasos que se indican a continuación:
javac Ej1.java
java Ej1 20 4
try
{
param1 = args[0];
param2 = args[1];
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println ("Faltan parametros");
System.exit(-1);
}
...
- 39 -
Curso de Programación en Lenguaje Java
-ejercicios-
java Ej1 20
...
try
{
dividendo = Integer.parseInt(param1);
divisor = Integer.parseInt(param2);
} catch (NumberFormatException e2) {
System.out.println ("...");
System.exit(-1);
}
try
{
dividendo = Integer.parseInt(args[0]);
divisor = Integer.parseInt(args[1]);
} catch (ArrayIndexOutOfBoundsException e) {
...
- 40 -
Curso de Programación en Lenguaje Java
-ejercicios-
...
}
java Ej1 20 0
try
{
- 41 -
Curso de Programación en Lenguaje Java
-ejercicios-
System.out.println ("Resultado:...);
} catch (IllegalArgumentException e3) {
e3.printStackTrace()
}
}
...
}
...
}
- 42 -
Curso de Programación en Lenguaje Java
-ejercicios-
NOTA: esta cláusula sólo hay que introducirla para excepciones que
sean de tipo checked, es decir, que se pueda predecir que pueden
pasar al ejecutar un programa. Dichas excepciones son los subtipos
fuera de RuntimeException, y cualquier excepción que podamos
crear nosotros.
try
{
System.out.println ("Resultado: " ...);
} catch (IllegalArgumentException e3) {
e3.printStackTrace()
} catch (NumeroNaturalException e4) {
System.out.println ("Error: " + e4.getMessage());
System.exit(-1);
}
}
PARA ENTREGAR
- 43 -
Curso de Programación en Lenguaje Java
-ejercicios-
- 44 -
Curso de Programación en Lenguaje Java
-ejercicios-
Sesión 7
1. Implementaremos ahora un ejercicio para practicar diferentes aspectos
sobre hilos y multiprogramación:
javac Ej2.java
java Ej2
¿Cuántos hilos o flujos de ejecución hay en total? ¿Qué hace cada uno?
(AYUDA: en todo programa al menos hay UN flujo de ejecución, que no
es otro que el programa principal. Aparte, podemos tener los flujos
secundarios (hilos) que queramos).
4. Vamos a añadir y lanzar dos hilos más de tipo MiHilo en la clase Ej2.
Para ello podemos copiar y pegar el código que crea y lanza el primer
hilo, para hacer otros dos nuevos:
public Ej2()
{
MiHilo t = new MiHilo("Hilo 1");
MiHilo t2 = new MiHilo("Hilo 2");
MiHilo t3 = new MiHilo("Hilo 3");
t.start();
t2.start();
t3.start();
do
{
System.out.print("Hilo 1 = " + t.contador +
- 45 -
Curso de Programación en Lenguaje Java
-ejercicios-
public Ej2()
{
MiHilo t = new MiHilo("Hilo 1");
MiHilo t2 = new MiHilo("Hilo 2");
MiHilo t3 = new MiHilo("Hilo 3");
t.setPriority(Thread.MIN_PRIORITY);
t2.setPriority(Thread.NORM_PRIORITY);
t3.setPriority(Thread.MAX_PRIORITY);
t.start();
t2.start();
t3.start();
...
}
- 46 -
Curso de Programación en Lenguaje Java
-ejercicios-
el programa principal quien los lance. Este sólo lanzará un hilo, que será
el responsable de seguir la cadena.
Los valores producidos no son más que números enteros, que los
productores generarán y los consumidores leerán.
javac Ej3.java
java Ej3
- 47 -
Curso de Programación en Lenguaje Java
-ejercicios-
if(disponible) {
try {
wait();
} catch(InterruptedException e) { }
}
this.valor = valor;
disponible = true;
notifyAll();
}
if(!disponible) {
try {
wait();
} catch(InterruptedException e) { }
}
- 48 -
Curso de Programación en Lenguaje Java
-ejercicios-
disponible = false;
return valor;
}
Para corregir el error, debemos hacer que tanto produce como consume
sean dos métodos synchronized, de forma que nos aseguremos que
sólo un hilo a la vez entrará, y podrá ejecutar dichos métodos.
Produce 0
Consume 0
Consume 1
Produce 1
Produce 2
Consume 2
...
... pero aún así el programa es correcto. ¿A qué se debe entonces que
puedan salir los mensajes en orden inverso? (AYUDA: observad el
método System.out.println(...) que hay al final de los métodos run de
Productor y Consumidor, que es el que muestra estos mensajes... ¿hay
algo que garantice que se ejecute este método en orden?)
PARA ENTREGAR
- 49 -
Curso de Programación en Lenguaje Java
-ejercicios-
- 50 -
Curso de Programación en Lenguaje Java
-ejercicios-
Sesión 8
En esta sesión practicaremos algunos conceptos básicos de Entrada/Salida,
como la lectura y escritura básica con ficheros, y el uso de ficheros de
propiedades, y entrada/salida estándar. Antes de comenzar, lee la introducción
del punto 2.3 (Entrada/Salida), y los apartados 2.3.1 (Flujos de Entrada/Salida),
2.3.2 (Entrada, salida y salida de error estándar) y 2.3.3 (Acceso a ficheros) del
tema 2 de teoría.
- 51 -
Curso de Programación en Lenguaje Java
-ejercicios-
- 52 -
Curso de Programación en Lenguaje Java
-ejercicios-
byte[] b = cabecera.getBytes();
out.write(b);
int c;
while ((c = in.read()) != -1)
...
}
- 53 -
Curso de Programación en Lenguaje Java
-ejercicios-
- 54 -
Curso de Programación en Lenguaje Java
-ejercicios-
...
}
public Ej5()
{
- 55 -
Curso de Programación en Lenguaje Java
-ejercicios-
public Ej5()
{
Properties p = new Properties();
p.load(new FileInputStream("prop.txt"));
Enumeration en = p.propertyNames();
while (en.hasMoreElements())
{
String prop = (String)(en.nextElement());
System.out.println("Valor para " + prop);
}
}
public Ej5()
{
Properties p = new Properties();
p.load(new FileInputStream("prop.txt"));
Enumeration en = p.propertyNames();
BufferedReader in =
new BufferedReader(new InputStreamReader(System.in));
while (en.hasMoreElements())
{
...
}
}
- 56 -
Curso de Programación en Lenguaje Java
-ejercicios-
Lo que nos queda por hacer es pedirle al usuario que, para cada
nombre de propiedad, introduzca su valor, y luego asignarlo a la
propiedad correspondiente:
public Ej5()
{
...
while (en.hasMoreElements())
{
String prop = (String)(en.nextElement());
System.out.println("Valor para " + prop);
String valor = in.readLine();
p.setProperty(prop, valor);
}
}
public Ej5()
{
...
in.close();
p.store(new FileOutputStream("prop.txt"), "Cabecera");
}
public Ej5()
{
try
{
...
} catch(...) {}
}
PARA ENTREGAR
- 57 -
Curso de Programación en Lenguaje Java
-ejercicios-
- 58 -
Curso de Programación en Lenguaje Java
-ejercicios-
Sesión 9
En esta sesión practicaremos conceptos algo más avanzados de
Entrada/Salida, como la lectura de tokens desde ficheros, y la lectura de
objetos complejos.
; Comentario de cabecera
m n
A11 A12 A13...
A21 A22 A23...
...
public Ej6()
{
StreamTokenizer st =
new StreamTokenizer(new FileReader("matriz.txt"));
}
public Ej6()
{
StreamTokenizer st =
new StreamTokenizer(new FileReader("matriz.txt"));
st.commentChar(';');
- 59 -
Curso de Programación en Lenguaje Java
-ejercicios-
public Ej6()
{
StreamTokenizer st =
new StreamTokenizer(new FileReader("matriz.txt"));
st.commentChar(';');
st.nextToken();
filas = (int)(st.nval);
// Filas
st.nextToken();
columnas = (int)(st.nval); //
Columnas
}
public Ej6()
{
...
int[][] matriz = new int[filas][columnas];
int t;
- 60 -
Curso de Programación en Lenguaje Java
-ejercicios-
public Ej6()
{
...
PrintWriter pw =
new PrintWriter (new FileWriter("matrizSal.txt"));
pw.println ("; Matriz resultado");
pw.println ("" + filas + " " + columnas);
for (int i = 0; i < filas; i++)
{
for (int j = 0; j < columnas; j++)
{
pw.print("" + matriz[i][j] + " ");
}
pw.println();
}
pw.close();
}
; Matriz resultado
3 3
1 4 9
16 25 36
49 64 81
- 61 -
Curso de Programación en Lenguaje Java
-ejercicios-
public Ej7()
{
ObjetoFichero of = new ObjetoFichero ("cad1", 1, 1.5);
of.addCadena("cad2");
of.addCadena("cad3");
- 62 -
Curso de Programación en Lenguaje Java
-ejercicios-
public Ej7()
{
...
ObjectOutputStream oos =
new ObjectOutputStream(new FileOutputStream("..."));
oos.writeObject(of);
oos.writeObject(of2);
oos.close();
}
public Ej7()
{
...
ObjectInputStream ois =
new ObjectInputStream(new FileInputStream("..."));
ObjetoFichero ofLeido1 =
(ObjetoFichero)(ois.readObject());
ObjetoFichero ofLeido2 =
(ObjetoFichero)(ois.readObject());
}
- 63 -
Curso de Programación en Lenguaje Java
-ejercicios-
public Ej7()
{
...
System.out.println(ofLeido1.imprimeObj());
System.out.println(ofLeido2.imprimeObj());
}
PARA ENTREGAR
- 64 -
Curso de Programación en Lenguaje Java
-ejercicios-
Sesión 10
En esta sesión vamos a hacer un ejercicio práctico que englobe varios de los
conceptos vistos hasta ahora.
package geom;
- 65 -
Curso de Programación en Lenguaje Java
-ejercicios-
...
public class Rectangulo extends Figura implements
java.io.Serializable
- 66 -
Curso de Programación en Lenguaje Java
-ejercicios-
{
int x1;
int y1;
int x2;
int y2;
...
...
public class Linea extends Figura implements
java.io.Serializable
{
int x1;
int y1;
int x2;
int y2;
...
Y para la Linea:
package io;
import java.io.*;
...
public EntradaTeclado()
- 67 -
Curso de Programación en Lenguaje Java
-ejercicios-
{
in = new BufferedReader(
new InputStreamReader(System.in));
}
...
public String leeTeclado()
{
try
{
return in.readLine();
} catch (Exception e) {
return null;
}
}
}
package io;
import geom.*;
import java.io.*;
import java.util.*;
- 68 -
Curso de Programación en Lenguaje Java
-ejercicios-
try
{
ObjectInputStream oin =
new ObjectInputStream (new FileInputStream(fichero));
oin.close();
} catch (Exception e) {
// Se pueden producir 2 excepciones:
// FileNotFoundException si no encuentra el fichero
// IOException cuando llegue a fin de fichero
// DA IGUAL QUE SE PRODUZCA UNA U OTRA,
// LA CAPTURAMOS Y NO HACEMOS NADA MAS
}
- 69 -
Curso de Programación en Lenguaje Java
-ejercicios-
oout.close();
} catch (Exception e) {}
}
- 70 -
Curso de Programación en Lenguaje Java
-ejercicios-
Después vemos que hay un método main que recoge el nombre del
fichero de los parámetros de entrada, y crea un objeto de tipo
AplicGeom con él. Finalmente, llama al método iniciar de la clase, que
está vacío, pero deberá contener toda la lógica del programa. Deberéis
completarlo para que haga una iteración continua en la que:
o En cada iteración:
Primero mostrará un listado con las figuras que hay
actualmente en la lista figuras. Recorrerá dicho ArrayList y
llamará al método imprime de cada figura, sacando la
información que devuelva por pantalla
A continuación, mostrará un menú con las 4 opciones
disponibles:
Crear una nueva figura
Borrar una figura existente
Guardar datos en fichero
Salir
Si el usuario elige Salir, se termina la ejecución
(System.exit(0))
Si elige Crear una nueva figura:
Se le pedirá que elija entre las figuras disponibles
(Circulo, Rectángulo o Linea)
Una vez elegida, se le pedirá que introduzca uno a
uno los valores de los campos para dicha figura
(estos campos dependerán de la figura elegida).
Se recogerán todos ellos. Como se recogen como
String, se deberán convertir luego al valor adecuado
(es recomendable utilizar el método
Integer.parseInt(String valor) para convertir una
cadena a entero). Una vez recogidos, se creará un
objeto del tipo elegido (Circulo, Rectangulo o Linea)
y se añadirá a la lista figuras que tenemos como
campo global
Si elige Borrar una figura existente:
Se mostrará un listado con las figuras que haya
actualmente en la lista figuras
Se pedirá al usuario que elija el número de la figura
que quiere borrar
Se borrará de la lista la figura de la posición elegida
Si elige Guardar datos:
Se utilizará la clase IOFiguras, y su método
guardaFiguras para guardar la lista de figuras
(habrá que convertirla a array), en el fichero que
indicamos al arrancar el programa.
4. Compila y ejecuta la aplicación completa, verificando que funciona
correctamente.
5. Una vez finalizado el ejercicio, y visto la forma en que está
estructurado...
- 71 -
Curso de Programación en Lenguaje Java
-ejercicios-
PARA ENTREGAR
- 72 -
Curso de Programación en Lenguaje Java
-ejercicios-
Sesión 11
1. En esta sesión vamos a realizar dos ejemplos con AWT. El primero de ellos
va a simular una calculadora sencilla, con este aspecto:
public Calculadora()
{
setSize(300, 150);
setLayout(new GridLayout(4, 2));
public Calculadora()
{
...
// Primer operando
Label lblOp1 = new Label("Primer operando:");
TextField txtOp1 = new TextField();
add(lblOp1);
add(txtOp1);
- 73 -
Curso de Programación en Lenguaje Java
-ejercicios-
// Operador
Label lblOper = new Label ("Operador:");
Choice operadores = new Choice();
operadores.addItem("+");
operadores.addItem("-");
operadores.addItem("*");
add(lblOper);
add(operadores);
// Segundo operando
Label lblOp2 = new Label("Segundo operando:");
TextField txtOp2 = new TextField();
add(lblOp2);
add(txtOp2);
public Calculadora()
{
...
// Evento sobre el botón
btnRes.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
int op1, op2;
try
{
// Tomar los dos operandos
op1 = Integer.parseInt(txtOp1.getText());
op2 = Integer.parseInt(txtOp2.getText());
- 74 -
Curso de Programación en Lenguaje Java
-ejercicios-
public Calculadora()
{
...
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
public Calculadora()
{
...
TextField txtOp1 = new TextField();
...
Choice operadores = new Choice();
...
TextField txtOp2 = new TextField();
...
TextField txtRes = new TextField();
...
}
Por estas:
public Calculadora()
{
...
final TextField txtOp1 = new TextField();
...
- 75 -
Curso de Programación en Lenguaje Java
-ejercicios-
public Calculadora()
{
...
}
...
}
2. Ahora vamos a construir otra aplicación desde cero. Para resumir los pasos
que hemos dado en el ejercicio anterior, lee el apartado 3.1.4 (Pasos generales
para construir una aplicación gráfica con AWT) del tema 3 de teoría.
- 76 -
Curso de Programación en Lenguaje Java
-ejercicios-
Vemos que sólo hay un cuadro de texto grande donde escribir, y un menú
llamado Formato donde irán todas las opciones para cambiar el formato de la
fuente. Dichas opciones serán cambiar el color entre rojo y negro, y cambiar el
estilo entre normal, cursiva y/o negrita.
import java.awt.*;
import java.awt.event.*;
public Formatos()
{
setSize(200, 200);
// Menú
- 77 -
Curso de Programación en Lenguaje Java
-ejercicios-
mi.addActionListener(this);
m.add(mi);
mi = new MenuItem("Color Rojo");
mi.addActionListener(this);
m.add(mi);
mb.add(m);
setMenuBar(mb);
// Area de texto
4. Observa que hay dos tipos de menu items: unos de tipo MenuItem para
cambiar el color entre rojo y negro, y otros de tipo CheckboxMenuItem
para establecer o no la cursiva y la negrita. Este tipo de items son de los
que se marcan y se desmarcan cada vez que se pulsan.
Observa también que definimos dos tipos de eventos sobre estos items
de menú: un evento de tipo ActionListener sobre los MenuItem, y uno de
tipo ItemListener para los CheckboxMenuItem. Esto se debe a que, al
ser tipos diferentes de items, en AWT responden a dos tipos diferentes
de eventos: los primeros son eventos de acción (al pulsar sobre el
menú, es como si pulsáramos un botón), y los segundos son de cambio
de estado (al pulsar sobre el item, es como si lo marcáramos o
desmarcáramos cada vez).
- 78 -
Curso de Programación en Lenguaje Java
-ejercicios-
txt.setFont(new Font("Arial",
(negrita?Font.BOLD:0) |
(cursiva?Font.ITALIC:0), 16));
}
- 79 -
Curso de Programación en Lenguaje Java
-ejercicios-
public Formatos()
{
...
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
PARA ENTREGAR
- 80 -
Curso de Programación en Lenguaje Java
-ejercicios-
Sesión 12
1. Vamos a realizar un par de ejercicios con la librería Swing, para ver qué
diferencias existen con AWT, y qué posibilidades nuevas ofrece.
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
- 81 -
Curso de Programación en Lenguaje Java
-ejercicios-
- 82 -
Curso de Programación en Lenguaje Java
-ejercicios-
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
- 83 -
Curso de Programación en Lenguaje Java
-ejercicios-
public JFormatos()
{
...
// Timer
public JFormatos()
{
...
// Icono
JButton btnSave =
new JButton("Guardar", new ImageIcon("save.jpg"));
btnSave.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
JFileChooser jfc = new JFileChooser(".");
int res = jfc.showSaveDialog(frame);
if (res == JFileChooser.APPROVE_OPTION)
- 84 -
Curso de Programación en Lenguaje Java
-ejercicios-
fichero =
jfc.getSelectedFile().getAbsolutePath();
}
});
getContentPane().add(btnSave, BorderLayout.SOUTH);
3. Para terminar esta sesión, vamos a dar un rápido vistazo a los Applets. Lee
primero el apartado 3.3 (Applets) del tema 3 de teoría.
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.applet.*;
- 85 -
Curso de Programación en Lenguaje Java
-ejercicios-
public CalcApplet()
{
...
por:
<html>
<body>
</body>
</html>
appletviewer CalcApplet.html
PARA ENTREGAR
• Fichero Calculadora.java
- 86 -
Curso de Programación en Lenguaje Java
-ejercicios-
- 87 -
Curso de Programación en Lenguaje Java
-ejercicios-
- 88 -
Curso de Programación en Lenguaje Java
-ejercicios-
Sesión 13
1. Vamos a realizar un ejercicio que nos permita practicar cómo dibujar en
Java, y posteriormente realizar animaciones con esos dibujos.
...
class MiPanel extends JPanel
{
...
- 89 -
Curso de Programación en Lenguaje Java
-ejercicios-
Observa que los dos (panel y canvas) dibujan las figuras en sus mismas
coordenadas (relativas a cada uno), de forma que la apariencia en los
dos es la misma.
- 90 -
Curso de Programación en Lenguaje Java
-ejercicios-
public Ej1()
{
...
t.start();
}
...
class MiPanel extends JPanel
{
...
- 91 -
Curso de Programación en Lenguaje Java
-ejercicios-
public MiCanvas()
{
}
- 92 -
Curso de Programación en Lenguaje Java
-ejercicios-
backbuffer =
createImage(getWidth(), getHeight());
g.drawImage(backbuffer, 0, 0,
getWidth(), getHeight(), this);
g.dispose();
}
}
PARA ENTREGAR
- 93 -
Curso de Programación en Lenguaje Java
-ejercicios-
- 94 -
Curso de Programación en Lenguaje Java
-ejercicios-
Sesión 14
1. En este ejercicio vamos a practicar con el modo a pantalla completa de
Java, para ver que no resulta tan complicado como pueda parecer el trabajar
con él.
public Ej2()
{
...
// Tomamos el dispositivo grafico
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
- 95 -
Curso de Programación en Lenguaje Java
-ejercicios-
4. Observad que, si elegís una resolución mayor que 320 x 240, el gráfico
no ocupa toda la pantalla, sino la parte proporcional a esas
dimensiones. Ello se debe a que estamos dibujando una imagen de 320
x 240 dentro de una ventana de resolución mayor. Lo que tenemos que
hacer es escalar esa imagen a dibujar, para que ocupe toda la extensión
del modo gráfico seleccionado.
a. Primero declaramos dos variables globales que indicarán el
ancho y alto del modo gráfico seleccionado:
public Ej2()
{
...
DlgModos dlg = new DlgModos(gd, this);
dlg.show();
anchoPantalla = dlg.modoSeleccionado.getWidth();
altoPantalla = dlg.modoSeleccionado.getHeight();
...
}
g.drawImage(backbuffer, 0, 0,
- 96 -
Curso de Programación en Lenguaje Java
-ejercicios-
public Ej2()
{
this.setUndecorated(true);
...
}
public Ej2()
{
...
addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode()==KeyEvent.VK_ESCAPE)
{
System.exit(0);
} else if (e.getKeyCode()==KeyEvent.VK_UP) {
if (yObj > 0)
- 97 -
Curso de Programación en Lenguaje Java
-ejercicios-
yObj--;
} else if (e.getKeyCode()==KeyEvent.VK_DOWN) {
if (yObj < ALTO)
yObj++;
}
}
});
}
Como ahora las figuras las movemos por teclado, quitamos la línea que
aumenta la coordenada Y automáticamente en el método run, y
hacemos que el bucle sea infinito:
public Ej2()
{
- 98 -
Curso de Programación en Lenguaje Java
-ejercicios-
...
Toolkit tk = Toolkit.getDefaultToolkit();
figura = tk.createImage("figura.png");
...
}
g.drawImage(backbuffer, 0, 0, anchoPantalla,
altoPantalla, this);
g.dispose();
}
- 99 -
Curso de Programación en Lenguaje Java
-ejercicios-
PARA ENTREGAR
• Fichero Ej2.java con todos los cambios propuestos (salvo los del punto
9, que son optativos), incluyendo también el fichero DlgModos.java.
• Fichero de texto respuestas.txt contestando a todas las preguntas
formuladas.
• Contenidos optativos que hayas podido realizar (opcional)
- 100 -
Curso de Programación en Lenguaje Java
-ejercicios-
Sesión 15
En esta última sesión vamos a hacer una aplicación que reúna varios de los
conceptos importantes vistos hasta ahora. Debéis elegir una de las dos
propuestas siguientes:
Para hacer este ejercicio deberéis tomar el ejercicio que hicisteis en la sesión
10, donde se os pedía que, en modo texto, indicarais qué figuras geométricas
añadir o quitar de una lista.
- 101 -
Curso de Programación en Lenguaje Java
-ejercicios-
PREPARATIVOS PREVIOS
package geom;
import java.awt.Graphics;
Este método indicará cómo se debe dibujar cada subtipo de figura. Por tanto,
deberéis añadir este método también en las tres subclases (Circulo,
Rectangulo y Linea), indicando cómo se dibujaría cada una:
package geom;
import java.awt.Graphics;
- 102 -
Curso de Programación en Lenguaje Java
-ejercicios-
package geom;
import java.awt.Graphics;
package geom;
import java.awt.Graphics;
Con esto ya tenemos preparadas nuestras figuras para dibujarse. Nos faltará
únicamente completar el programa principal (JAplicGeom) para indicar cómo
dibujarlas, guardarlas y recuperarlas.
Vamos a ver ahora cómo hacer los apartados que más os puedan costar.
- 103 -
Curso de Programación en Lenguaje Java
-ejercicios-
Para la parte superior, podemos crearnos una clase interna MiAreaDibujo, que
sea un subtipo de JPanel, y que podamos colocar en la parte superior para
dibujar. Dicha clase tendrá un método update y otro paint, donde pondremos el
código necesario para dibujar las figuras:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
...
public class JAplicGeom extends JFrame
{
MiAreaDibujo mad;
public JAplicGeom()
{
...
mad = new MiAreaDibujo();
}
...
}
...
public class JAplicGeom extends JFrame
{
- 104 -
Curso de Programación en Lenguaje Java
-ejercicios-
MiAreaDibujo mad;
JRadioButton btnCirculo;
JRadioButton btnRectangulo;
JRadioButton btnLinea;
public JAplicGeom()
{
...
mad = new MiAreaDibujo();
...
public class JAplicGeom extends JFrame
{
MiAreaDibujo mad;
JRadioButton btnCirculo;
JRadioButton btnRectangulo;
JRadioButton btnLinea;
public JAplicGeom()
{
...
mad = new MiAreaDibujo();
getContentPane().add(mad, BorderLayout.CENTER);
getContentPane().add(panelBotones, BorderLayout.SOUTH);
}
...
}
...
- 105 -
Curso de Programación en Lenguaje Java
-ejercicios-
mb.add(m);
this.setJMenuBar(mb);
}
...
}
...
public class JAplicGeom extends JFrame
{
...
public static void main(String[] args)
{
JAplicGeom jag = new JAplicGeom();
jag.setSize(400, 300);
jag.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
jag.show();
}
}
Probad a compilar y ejecutar el programa ahora, para depurar erratas y ver que
se os muestra la ventana como la de la figura 1 (deberéis importar los
paquetes necesarios en el fichero JAplicGeom).
Volver
- 106 -
Curso de Programación en Lenguaje Java
-ejercicios-
dibujando. Sería buena idea también definir una variable Figura que almacene
la figura que se está dibujando actualmente (antes de añadirla a la lista):
...
public class JAplicGeom extends JFrame
{
ArrayList figuras = new ArrayList();
Figura figActual = null;
...
}
Volver
En primer lugar vamos a ver qué hacer cuando elijamos Archivo - Abrir o
Archivo - Guardar. Para leer o guardar una lista de figuras, tenemos los
métodos leeFiguras y guardaFiguras, que implementamos en la clase
io.IOFiguras, en la sesión 10.
Para elegir el fichero del que leer, o donde guardar, utilizaremos la clase
JFileChooser de Swing.
Por otro lado, si quiero guardar las figuras en un fichero, haré algo como:
- 107 -
Curso de Programación en Lenguaje Java
-ejercicios-
NOTA: estos dos bloques tendréis que colocarlos donde toque, es decir, el
primero lo pondréis donde se dé la orden de abrir un fichero, y el segundo
donde se dé la orden de guardar.
Volver
...
public class JAplicGeom extends JFrame implements ActionListener
{
...
public JAplicGeom()
{
...
btnCirculo.addActionListener(this);
btnRectangulo.addActionListener(this);
btnLinea.addActionListener(this);
mAbrir.addActionListener(this);
mGuardar.addActionListener(this);
mSalir.addActionListener(this);
}
- 108 -
Curso de Programación en Lenguaje Java
-ejercicios-
...
public void actionPerformed(ActionEvent e)
{
if (e.getActionCommand().equals("Abrir"))
{
//... Qué hacer al elegir "Archivo - Abrir"
} else if (e.getActionCommand().equals("Guardar")) {
//... Qué hacer al elegir "Archivo - Guardar"
} else if (e.getActionCommand().equals("Salir")) {
//... Qué hacer al elegir "Archivo - Salir"
} else if (e.getActionCommand().equals("Circulo")) {
// Marcar como seleccionado el Círculo
btnCirculo.setSelected(true);
btnRectangulo.setSelected(false);
btnLinea.setSelected(false);
} else if (e.getActionCommand().equals("Rectangulo")) {
// Marcar como seleccionado el Rectangulo
} else if (e.getActionCommand().equals("Linea")) {
// Marcar como seleccionada la Linea
}
}
...
Volver
Para controlar todo esto, debemos definir dos tipos de eventos de ratón sobre
la clase MiAreaDibujo: uno de tipo MouseListener (para cuando pulsemos el
botón y lo soltemos), y otro de tipo MouseMotionListener (para cuando
arrastremos el ratón). También sería interesante definir 4 campos, xIni, yIni,
xFin, yFin que marcarán los límites superior izquierdo e inferior derecho de la
figura que dibujamos:
...
public class JAplicGeom extends JFrame implements ActionListener
- 109 -
Curso de Programación en Lenguaje Java
-ejercicios-
{
...
class MiAreaDibujo extends JPanel
{
int xIni, yIni, xFin, yFin;
public MiAreaDibujo()
{
this.addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
// Qué hacer al pulsar el boton
}
this.addMouseMotionListener(
new MouseMotionAdapter()
{
public void mouseDragged(MouseEvent e)
{
// Qué hacer al arrastrar el ratón
}
});
}
}
}
Al pulsar el botón del ratón, crearemos una figura del tipo que tengamos
seleccionado:
if (btnCirculo.isSelected())
{
figActual = new Circulo(xIni, yIni, 0);
} else if (btnRectangulo.isSelected()) {
figActual = new Rectangulo(xIni, yIni, xFin, yFin);
} else if (btnLinea.isSelected()) {
figActual = new Linea(xIni, yIni, xFin, yFin);
}
}
- 110 -
Curso de Programación en Lenguaje Java
-ejercicios-
{
xFin = e.getX();
yFin = e.getY();
if (btnCirculo.isSelected())
{
((Circulo)figActual).setX((xIni + xFin) / 2);
((Circulo)figActual).setY((yIni + yFin) / 2);
((Circulo)figActual).setRadio(Math.min(Math.abs(xIni - xFin),
Math.abs(yIni - yFin)));
} else if (btnRectangulo.isSelected()) {
((Rectangulo)figActual).setX1(Math.min(xIni, xFin));
((Rectangulo)figActual).setY1(Math.min(yIni, yFin));
((Rectangulo)figActual).setX2(Math.max(xIni, xFin));
((Rectangulo)figActual).setY2(Math.max(yIni, yFin));
} else if (btnLinea.isSelected()) {
((Linea)figActual).setX2(xFin);
((Linea)figActual).setY2(yFin);
}
repaint();
}
Volver
- 111 -
Curso de Programación en Lenguaje Java
-ejercicios-
if (figActual != null)
figActual.dibuja(g);
}
Volver
ELEMENTOS OPTATIVOS
Podéis añadir (si queréis) los elementos optativos que queráis. Aquí os
proponemos algunos:
- 112 -
Curso de Programación en Lenguaje Java
-ejercicios-
En la plantilla, en la carpeta Yogi tenéis una parte del juego hecha, para seguir
desde ahí. Veréis una clase principal Yogi.java, que tendrá la parte importante
del juego. Si la compiláis y ejecutáis (deberéis elegir el modo gráfico), veréis
que simplemente aparece Yogi, y lo podréis mover de izquierda a derecha.
Explicaremos a continuación cómo está hecho todo eso.
Tenéis libertad para hacer el juego como queráis, siempre que se cumplan los
puntos anteriores. Aquí vamos a contaros cómo está hecha la parte que se os
da, y cómo poder hacer lo que queda.
Conviene que leáis el primer apartado de los siguientes antes que nada, y
entendáis con él el código que se os da en la plantilla, para poderlo modificar.
- 113 -
Curso de Programación en Lenguaje Java
-ejercicios-
CONSTANTES Y CAMPOS:
- 114 -
Curso de Programación en Lenguaje Java
-ejercicios-
MÉTODOS:
- 115 -
Curso de Programación en Lenguaje Java
-ejercicios-
// Dibujar a Yogi
Shape clip = g.getClip();
- 116 -
Curso de Programación en Lenguaje Java
-ejercicios-
g.setClip(xIni,ALTO-
SpriteYogi.ALTO,SpriteYogi.ANCHO,SpriteYogi.ALTO);
g.drawImage(sprn.sprites, xIni - sprn.x, ALTO - SpriteYogi.ALTO,
sprn.width, sprn.height, this);
g.setClip(clip);
Volver
...
public class Yogi extends JFrame implements Runnable
{
Image fondo = null;
...
...
public Yogi()
{
...
Toolkit tk = Toolkit.getDefaultToolkit();
fondo = tk.createImage("bosque.jpg");
}
Tenéis que tener en cuenta que, si la imagen es muy grande (ocupa muchos
KB), puede que tarde en cargarla, y puede que se cargue la ventana sin tener
la imagen ya cargada. Para asegurarnos de que no va a abrir la ventana hasta
- 117 -
Curso de Programación en Lenguaje Java
-ejercicios-
...
public Yogi()
{
...
Toolkit tk = Toolkit.getDefaultToolkit();
fondo = tk.createImage("bosque.jpg");
// Dibujar fondo
g.drawImage(fondo, 0, 0, ANCHO, ALTO, this);
...
Volver
Tenéis una imagen llamada food.png en la plantilla, con tres tipos diferentes de
alimentos. Cada uno de ellos tiene un ancho y un alto de 20 píxeles.
- 118 -
Curso de Programación en Lenguaje Java
-ejercicios-
Para mover la comida, conviene que actualicéis la posición Y del sprite dentro
del método run, y luego en dibuja sólo tengáis que ver qué Y tiene, y dibujarlo
como se hace con el sprite de Yogi. Notad que en este caso no hay que
cambiar de frame en cada paso de animación: se mantiene siempre la misma
comida hasta que termina de caer, y luego se crea otro sprite, con la misma
comida u otra diferente. Así el setFrame para la comida sólo se ejecutaría al
crearla, y no se variaría durante su caída.
Volver
Para las vidas tenéis una imagen que se llama vida.png en la plantilla. Basta
con que la asignéis a un campo Image en la clase principal, y lo dibujéis en la
parte superior derecha, tantas veces como vidas se tengan.
Volver
Como véis en la figura 2, los puntos son una cadena de texto en la parte
superior izquierda. Para dibujar texto en un objeto Graphics tenéis el método
drawString. Simplemente hay que pasarle la cadena a dibujar, y las
coordenadas (X,Y) inferiores izquierdas.
Tomamos en este caso una fuente Arial de 15 puntos, negrita y cursiva. Luego
obtenemos su FontMetrics, y dibujamos la cadena, donde x e y se deben
- 119 -
Curso de Programación en Lenguaje Java
-ejercicios-
Volver
PARA ENTREGAR
- 120 -
Curso de Programación en Lenguaje Java
-ejercicios-
- 121 -