Desarrollo de Aplicaciones en Lenguaje Java PDF
Desarrollo de Aplicaciones en Lenguaje Java PDF
Desarrollo de Aplicaciones en Lenguaje Java PDF
Desarrollo
De aplicaciones
Con Java
TEMARIO CURSO DE JAVA.
Modulo I.
1. Conceptos Básicos.
Breve historia de Java
El compilador de Java
La Java Virtual Machine
Las variables PATH y CLASSPATH
Java surgió en 1991 cuando un grupo de ingenieros de Sun Microsystems trataron de diseñar un
nuevo lenguaje de programación destinado a electrodomésticos. La reducida potencia de cálculo y
memoria de los electrodomésticos llevó a desarrollar un lenguaje sencillo capaz de generar código
de tamaño muy reducido.
Debido a la existencia de distintos tipos de CPUs y a los continuos cambios, era importante
conseguir una herramienta independiente del tipo de CPU utilizada. Desarrollaron un código
“neutro” que no dependía del tipo de electrodoméstico, el cual se ejecutaba sobre una “máquina
hipotética o virtual” denominada Java Virtual Machine (JVM). Era la JVM quien interpretaba el
código neutro convirtiéndolo a código particular de la CPU utilizada. Esto permitía lo que luego se
ha convertido en el principal lema del lenguaje: “Write Once, Run Everywhere”. A pesar de los
esfuerzos realizados por sus creadores, ninguna empresa de electrodomésticos se interesó por el
nuevo lenguaje.
Como lenguaje de programación para computadores, Java se introdujo a finales de 1995. La
clave fue la incorporación de un intérprete Java en la versión 2.0 del programa Netscape Navigator,
produciendo una verdadera revolución en Internet. Java 1.1 apareció a principios de 1997,
mejorando sustancialmente la primera versión del lenguaje. Java 1.2, más tarde rebautizado como
Java 2, nació a finales de 1998.
Al programar en Java no se parte de cero. Cualquier aplicación que se desarrolle “cuelga” (o
se apoya, según como se quiera ver) en un gran número de clases preexistentes. Algunas de ellas las
ha podido hacer el propio usuario, otras pueden ser comerciales, pero siempre hay un número muy
importante de clases que forman parte del propio lenguaje (el API o Application Programming
Interface de Java). Java incorpora en el propio lenguaje muchos aspectos que en cualquier otro
lenguaje son extensiones propiedad de empresas de software o fabricantes de ordenadores (threads,
ejecución remota, componentes, seguridad, acceso a bases de datos, etc.). Por eso muchos expertos
opinan que Java es el lenguaje ideal para aprender la informática moderna, porque incorpora todos
estos conceptos de un modo estándar, mucho más sencillo y claro que con las citadas extensiones de
otros lenguajes. Esto es consecuencia de haber sido diseñado más recientemente y por un único
equipo.
El principal objetivo del lenguaje Java es llegar a ser el “nexo universal” que conecte a los
usuarios con la información, esté ésta situada en el ordenador local, en un servidor de Web, en una
base de datos o en cualquier otro lugar.
Java es un lenguaje muy completo (de hecho se está convirtiendo en un macro-lenguaje: Java
1.0 tenía 12 packages; Java 1.1 tenía 23 y Java 1.2 tiene 59). En cierta forma casi todo depende de
casi todo. Por ello, conviene aprenderlo de modo iterativo: primero una visión muy general, que se
va refinando en sucesivas iteraciones. Una forma de hacerlo es empezar con un ejemplo completo
en el que ya aparecen algunas de las características más importantes.
La compañía Sun describe el lenguaje Java como “simple, orientado a objetos, distribuido,
interpretado, robusto, seguro, de arquitectura neutra, portable, de altas prestaciones, multitarea y
dinámico”. Además de una serie de halagos por parte de Sun hacia su propia criatura, el hecho es
que todo ello describe bastante bien el lenguaje Java, aunque en algunas de esas características el
lenguaje sea todavía bastante mejorable. Algunas de las anteriores ideas se irán explicando a lo
largo de este manual.
Que es Java.
Java 2 (antes llamado Java 1.2 o JDK 1.2) es la tercera versión importante del lenguaje de
programación Java.
No hay cambios conceptuales importantes respecto a Java 1.1 (en Java 1.1 sí los hubo
respecto a Java 1.0), sino extensiones y ampliaciones, lo cual hace que a muchos efectos –por
ejemplo, para esta introducción- sea casi lo mismo trabajar con Java 1.1 o con Java 1.2.
Los programas desarrollados en Java presentan diversas ventajas frente a los desarrollados en
otros lenguajes como C/C++. La ejecución de programas en Java tiene muchas posibilidades:
ejecución como aplicación independiente (Stand-alone Application), ejecución como applet,
ejecución como servlet, etc. Un applet es una aplicación especial que se ejecuta dentro de un
navegador o browser (por ejemplo Netscape Navigator o Internet Explorer) al cargar una página
HTML desde un servidor Web. El applet se descarga desde el servidor y no requiere instalación en
el ordenador donde se encuentra el browser. Un servlet es una aplicación sin interface gráfica que se
ejecuta en un servidor de Internet. La ejecución como aplicación independiente es análoga a los
programas desarrollados con otros lenguajes.
Además de incorporar la ejecución como Applet, Java permite fácilmente el desarrollo tanto
de arquitecturas cliente-servidor como de aplicaciones distribuidas, consistentes en crear
aplicaciones capaces de conectarse a otros ordenadores y ejecutar tareas en varios ordenadores
simultáneamente, repartiendo por lo tanto el trabajo. Aunque también otros lenguajes de progra-
mación permiten crear aplicaciones de este tipo, Java incorpora en su propio API estas
funcionalidades.
Existen distintos programas comerciales que permiten desarrollar código Java. La compañía Sun,
creadora de Java, distribuye gratuitamente el Java(tm) Development Kit (JDK). Se trata de un
conjunto de programas y librerías que permiten desarrollar, compilar y ejecutar programas en Java.
Incorpora además la posibilidad de ejecutar parcialmente el programa, deteniendo la ejecución en el
punto deseado y estudiando en cada momento el valor de cada una de las variables (con el
denominado Debugger). Cualquier programador con un mínimo de experiencia sabe que una parte
muy importante (muchas veces la mayor parte) del tiempo destinado a la elaboración de un
programa se destina a la detección y corrección de errores. Existe también una versión reducida del
JDK, denominada JRE (Java Runtime Environment) destinada únicamente a ejecutar código Java
(no permite compilar).
Los IDEs (Integrated Development Environment), tal y como su nombre indica, son entornos
de desarrollo integrados. En un mismo programa es posible escribir el código Java, compilarlo y
ejecutarlo sin tener que cambiar de aplicación. Algunos incluyen una herramienta para realizar
Debug gráficamente, frente a la versión que incorpora el JDK basada en la utilización de una
consola (denominada habitualmente ventana de comandos de Linux)
Los entornos integrados permiten desarrollar las aplicaciones de forma mucho más rápida,
incorporando en muchos casos librerías con componentes ya desarrollados, los cuales se incorporan
al proyecto o programa. Como inconvenientes se pueden señalar algunos fallos de compatibilidad
entre plataformas, y ficheros resultantes de mayor tamaño que los basados en clases estándar.
El compilador de Java
Se trata de una de las herramientas de desarrollo incluidas en el JDK. Realiza un análisis de sintaxis
del código escrito en los ficheros fuente de Java (con extensión *.java). Si no encuentra errores en
el código genera los ficheros compilados (con extensión *.class). En otro caso muestra la línea o
líneas erróneas. En el JDK de Sun dicho compilador se llama javac. Tiene numerosas opciones,
algunas de las cuales varían de una versión a otra. Se aconseja consultar la documentación de la
versión del JDK utilizada para obtener una información detallada de las distintas posibilidades.
El desarrollo y ejecución de aplicaciones en Java exige que las herramientas para compilar
(javac) y ejecutar (java) se encuentren accesibles. El ordenador, desde una ventana de
comandos de Linux, sólo es capaz de ejecutar los programas que se encuentran en los directorios
indicados en la variable PATH del ordenador (o en el directorio activo). Si se desea compilar o
ejecutar código en Java, el directorio donde se encuentran estos programas (java y javac)
deberá encontrarse en el PATH. Tecleando $PATH en una ventana de comandos de Linux se
muestran los nombres de directorios incluidos en dicha variable de entorno.
Java utiliza además una nueva variable de entorno denominada CLASSPATH, la cual
determina dónde buscar tanto las clases o librerías de Java (el API de Java) como otras clases de
usuario. A partir de la versión 1.1.4 del JDK no es necesario indicar esta variable, salvo que se
desee añadir conjuntos de clases de usuario que no vengan con dicho JDK. La variable
CLASSPATH puede incluir la ruta de directorios o ficheros *.zip o *.jar en los que se encuentren
los ficheros *.class.
export JAVA_HOME=/opt/java/jdk1.6.0_06/
export PATH=/opt/java/jdk1.6.0_06//bin
JAVA_HOME=/opt/java/jdk1.6.0_06/
PATH=/opt/java/jdk1.6.0_06//bin
CLASSPATH=/opt/java/jdk1.6.0_06/jre/lib/jce.jar
En este capítulo se presentan las características generales de Java como lenguaje de programación
algorítmico. En este apartado Java es muy similar a C/C++, lenguajes en los que está inspirado. Se
va a intentar ser breve, considerando que el lector ya conoce algunos otros lenguajes de
programación y está familiarizado con lo que son variables, bifurcaciones, bucles, etc.
Variables
Una variable es un nombre que contiene un valor que puede cambiar a lo largo del programa. De
acuerdo con el tipo de información que contienen, en Java hay dos tipos principales de variables:
1. Variables de tipos primitivos. Están definidas mediante un valor único que puede ser
entero, de punto flotante, carácter o booleano. Java permite distinta precición y distintos
rangos de valores para estos tipos de variables (char, byte, short, int, long, float, double,
boolean). Ejemplos de variables de tipos primitivos podrían ser: 123, 3456754, 3.1415,
12e-09, 'A', True, etc.
2. Variables referencia. Las variables referencia son referencias o nombres de una
información más compleja: arrays u objetos de una determinada clase.
Desde el punto de vista del papel o misión en el programa, las variables pueden ser:
1. Variables miembro de una clase: Se definen en una clase, fuera de cualquier método;
pueden ser tipos primitivos o referencias.
2. Variables locales: Se definen dentro de un método o más en general dentro de cualquier
bloque entre llaves {}. Se crean en el interior del bloque y se destruyen al finalizar dicho
bloque. Pueden ser también tipos primitivos o referencias.
Nombres de Variables
Los nombres de variables en Java se pueden crear con mucha libertad. Pueden ser cualquier
conjunto de caracteres numéricos y alfanuméricos, sin algunos caracteres especiales utilizados por
Java como operadores o separadores ( ,.+-*/ etc.).
Existe una serie de palabras reservadas las cuales tienen un significado especial para Java y
por lo tanto no se pueden utilizar como nombres de variables. Dichas palabras son:
abstract boolean break byte case catch
char class const* continue default do
double else extends final finally float
for goto* if implements import instanceof
int interface long native new null
package private protected public return short
static super switch synchronized this throw
throws transient try void volatile while
(*) son palabras reservadas, pero no se utilizan en la actual implementación del lenguaje Java.
Se llaman tipos primitivos de variables de Java a aquellas variables sencillas que contienen los tipos
de información más habituales: valores boolean, caracteres y valores numéricos enteros o de punto
flotante.
Java dispone de ocho tipos primitivos de variables: un tipo para almacenar valores true y
false (boolean); un tipo para almacenar caracteres (char), y 6 tipos para guardar valores numéricos,
cuatro tipos para enteros (byte, short, int y long) y dos para valores reales de punto flotante (float y
double). Los rangos y la memoria que ocupa cada uno de estos tipos se muestran en la Tabla 2.1.
Tipo de variable Descripción
Boolean 1 byte. Valores true y false
Char 2 bytes. Unicode. Comprende el código ASCII
Byte 1 byte. Valor entero entre -128 y 127
Short 2 bytes. Valor entero entre -32768 y 32767
Int 4 bytes. Valor entero entre -2.147.483.648 y 2.147.483.647
Long 8 bytes. Valor entre -9.223.372.036.854.775.808
y9.223.372.036.854.775.807
Float 4 bytes (entre 6 y 7 cifras decimales equivalentes). De -3.402823E38 a
-1.401298E-45 y de 1.401298E-45 a 3.402823E38
Double 8 bytes (unas 15 cifras decimales equivalentes). De -1.79769313486232E308 a
-4.94065645841247E-324 y de 4.94065645841247E-324 a 1.79769313486232E308
Tabla 2.1. Tipos primitivos de variables en Java.
Los tipos primitivos de Java tienen algunas características importantes que se resumen a
continuación:
1. El tipo boolean no es un valor numérico: sólo admite los valores true o false. El tipo boolean
no se identifica con el igual o distinto de cero, como en C/C++. El resultado de la expresión
lógica que aparece como condición en un bucle o en una bifurcación debe ser boolean.
2. El tipo char contiene caracteres en código UNICODE (que incluye el código ASCII), y ocupan
16 bits por carácter. Comprende los caracteres de prácticamente todos los idiomas.
3. Los tipos byte, short, int y long son números enteros que pueden ser positivos o negativos, con
distintos valores máximos y mínimos. A diferencia de C/C++, en Java no hay enteros unsigned.
4. Los tipos float y double son valores de punto flotante (números reales) con 6-7 y 15 cifras
decimales equivalentes, respectivamente.
5. Se utiliza la palabra void para indicar la ausencia de un tipo de variable determinado.
6. A diferencia de C/C++, los tipos de variables en Java están perfectamente definidos en todas y
cada una de las posibles plataformas. Por ejemplo, un int ocupa siempre la misma memoria y
tiene el mismo rango de valores, en cualquier tipo de ordenador.
7. Existen extensiones de Java 1.2 para aprovechar la arquitectura de los procesadores Intel, que
permiten realizar operaciones de punto flotente con una precisión extendida de 80 bits.
Una variable se define especificando el tipo y el nombre de dicha variable. Estas variables pueden
ser tanto de tipos primitivos como referencias a objetos de alguna clase perteneciente al API de
Java o generada por el usuario. Si no se especifica un valor en su declaración, las variable
primitivas se inicializan a cero (salvo boolean y char, que se inicializan a false y '\0').
Análogamente las variables de tipo referencia son inicializadas por defecto a un valor especial:
null.
Es importante distinguir entre la referencia a un objeto y el objeto mismo. Una referencia es
una variable que indica dónde está guardado un objeto en la memoria del ordenador (a diferencia de
C/C++, Java no permite acceder al valor de la dirección, pues en este lenguaje se han eliminado los
punteros). Al declarar una referencia todavía no se encuentra “apuntando” a ningún objeto en
particular (salvo que se cree explícitamente un nuevo objeto en la declaración), y por eso se le
asigna el valor null. Si se desea que esta referencia apunte a un nuevo objeto es necesario crear el
objeto utilizando el operador new. Este operador reserva en la memoria del ordenador espacio para
ese objeto (variables y funciones). También es posible igualar la referencia declarada a otra
referencia a un objeto existente previamente.
Un tipo particular de referencias son los arrays o vectores, sean éstos de variables primitivas
(por ejemplo, un vector de enteros) o de objetos. En la declaración de una referencia de tipo array
hay que incluir los corchetes []. En los siguientes ejemplos aparece cómo crear un vector de 10
números enteros y cómo crear un vector de elementos MyClass. Java garantiza que los elementos
del vector son inicializados a null o a cero (según el tipo de dato) en caso de no indicar otro valor.
Ejemplos de declaración e inicialización de variables:
int x; // Declaración de la variable primitiva x. Se inicializa a 0
int y = 5; // Declaración de la variable primitiva y. Se inicializa a 5
MyClass unaRef; // Declaración de una referencia a un objeto MyClass.
// Se inicializa a null
unaRef = new MyClass(); // La referencia “apunta” al nuevo objeto creado
// Se ha utilizado el constructor por defecto
MyClass segundaRef = unaRef; // Declaración de una referencia a un objeto MyClass.
// Se inicializa al mismo valor que unaRef
int [] vector; // Declaración de un array. Se inicializa a null
vector = new int[10]; // Vector de 10 enteros, inicializados a 0
double [] v = {1.0, 2.65, 3.1}; // Declaración e inicialización de un vector de 3
// elementos con los valores entre llaves
MyClass [] lista=new MyClass[5]; // Se crea un vector de 5 referencias a objetos
// Las 5 referencias son inicializadas a null
lista[0] = unaRef; // Se asigna a lista[0] el mismo valor que unaRef
lista[1] = new MyClass(); // Se asigna a lista[1] la referencia al nuevo objeto
// El resto (lista[2]...lista[4] siguen con valor null
En el ejemplo mostrado las referencias unaRef, segundaRef y lista[0] actuarán sobre el
mismo objeto. Es equivalente utilizar cualquiera de las referencias ya que el objeto al que se
refieren es el mismo.
Se entiende por visibilidad, ámbito o scope de una variable, la parte de la aplicación donde dicha
variable es accesible y por lo tanto puede ser utilizada en una expresión. En Java todas las variables
deben estar incluidas en una clase. En general las variables declaradas dentro de unas llaves {}, es
decir dentro de un bloque, son visibles y existen dentro de estas llaves. Por ejemplo las variables
declaradas al principio de una función existen mientras se ejecute la función; las variables
declaradas dentro de un bloque if no serán válidas al finalizar las sentencias correspondientes a
dicho if y las variables miembro de una clase (es decir declaradas entre las llaves {} de la clase pero
fuera de cualquier método) son válidas mientras existe el objeto de la clase.
Las variables miembro de una clase declaradas como public son accesibles a través de una
referencia a un objeto de dicha clase utilizando el operador punto (.). Las variables miembro
declaradas como private no son accesibles directamente desde otras clases. Las funciones miembro
de una clase tienen acceso directo a todas las variables miembro de la clase sin necesidad de
anteponer el nombre de un objeto de la clase. Sin embargo las funciones miembro de una clase B
derivada de otra A, tienen acceso a todas las variables miembro de A declaradas como public o
protected, pero no a las declaradas como private. Una clase derivada sólo puede acceder
directamente a las variables y funciones miembro de su clase base declaradas como public o
protected. Otra característica del lenguaje es que es posible declarar una variable dentro de un
bloque con el mismo nombre que una variable miembro, pero no con el nombre de otra variable
local que ya existiera. La variable declarada dentro del bloque oculta a la variable miembro en ese
bloque. Para acceder a la variable miembro oculta será preciso utilizar el operador this, en la forma
this.varname.
Uno de los aspectos más importantes en la programación orientada a objetos (OOP) es la
forma en la cual son creados y eliminados los objetos. En Java la forma de crear nuevos objetos es
utilizando el operador new. Cuando se utiliza el operador new, la variable de tipo referencia guarda
la posición de memoria donde está almacenado este nuevo objeto. Para cada objeto se lleva cuenta
de por cuántas variables de tipo referencia es apuntado. La eliminación de los objetos la realiza el
programa denominado garbage collector, quien automáticamente libera o borra la memoria ocupada
por un objeto cuando no existe ninguna referencia apuntando a ese objeto. Lo anterior significa que
aunque una variable de tipo referencia deje de existir, el objeto al cual apunta no es eliminado si hay
otras referencias apuntando a ese mismo objeto.
Operadores de Java
Java es un lenguaje rico en operadores, que son casi idénticos a los de C/C++. Estos operadores se
describen brevemente en los apartados siguientes.
Operadores aritméticos
Son operadores binarios (requieren siempre dos operandos) que realizan las operaciones aritméticas
habituales: suma (+), resta (-), multiplicación (*), división (/) y resto de la división (%).
Operadores de asignación
Operadores unarios
Los operadores más (+) y menos (-) unarios sirven para mantener o cambiar el signo de una
variable, constante o expresión numérica. Su uso en Java es el estándar de estos operadores.
Operador instanceof
Operador condicional ?:
Este operador, tomado de C/C++, permite realizar bifurcaciones condicionales sencillas. Su forma
general es la siguiente:
booleanExpression ? res1 : res2
donde se evalúa booleanExpression y se devuelve res1 si el resultado es true y res2 si el resultado
es false. Es el único operador ternario (tres argumentos) de Java. Como todo operador que devuelve
un valor puede ser utilizado en una expresión. Por ejemplo las sentencias:
x=1 ; y=10; z = (x<y)?x+3:y+8;
asignarían a z el valor 4, es decir x+3.
Operadores incrementales
Java dispone del operador incremento (++) y decremento (--). El operador (++) incrementa en una
unidad la variable a la que se aplica, mientras que (--) la reduce en una unidad. Estos operadores se
pueden utilizar de dos formas:
1. Precediendo a la variable (por ejemplo: ++i). En este caso primero se incrementa la
variable y luego se utiliza (ya incrementada) en la expresión en la que aparece.
2. Siguiendo a la variable (por ejemplo: i++). En este caso primero se utiliza la variable en la
expresión (con el valor anterior) y luego se incrementa.
En muchas ocasiones estos operadores se utilizan para incrementar una variable fuera de una
expresión. En este caso ambos operadores son equivalente. Si se utilizan en una expresión más
complicada, el resultado de utilizar estos operadores en una u otra de sus formas será diferente. La
actualización de contadores en bucles for es una de las aplicaciones más frecuentes de estos
operadores.
Operadores relacionales
Operadores lógicos
Los operadores lógicos se utilizan para construir expresiones lógicas, combinando valores lógicos
(true y/o false) o los resultados de los operadores relacionales. La Tabla 2.4 muestra los operadores
lógicos de Java. Debe notarse que en ciertos casos el segundo operando no se evalúa porque ya no
es necesario (si ambos tienen que ser true y el primero es false, ya se sabe que la condición de que
ambos sean true no se va a cumplir). Esto puede traer resultados no deseados y por eso se han
añadido los operadores (&) y (|) que garantizan que los dos operandos se evalúan siempre.
Operador Nombre Utilización Resultado
&& AND op1 && op2 true si op1 y op2 son true. Si op1 es false ya
no se evalúa op2
|| OR op1 || op2 true si op1 u op2 son true. Si op1 es true ya no se
evalúa op2
! negación ! op true si op es false y false si op es true
& AND op1 & op2 true si op1 y op2 son true. Siempre se evalúa op2
| OR op1 | op2 true si op1 u op2 son true. Siempre se evalúa op2
Tabla 2.4. Operadores lógicos.
Operador de concatenación de cadenas de caracteres (+)
El operador más (+) se utiliza también para concatenar cadenas de caracteres. Por ejemplo, para
escribir una cantidad con un rótulo y unas unidades puede utilizarse la sentencia:
System.out.println("El total asciende a " + result + " unidades");
donde el operador de concatenación se utiliza dos veces para construir la cadena de caracteres que
se desea imprimir por medio del método println(). La variable numérica result es convertida
automáticamente por Java en cadena de caracteres para poderla concatenar. En otras ocasiones se
Java dispone también de un conjunto de operadores que actúan a nivel de bits. Las operaciones de
bits se utilizan con frecuencia para definir señales o flags, esto es, variables de tipo entero en las que
cada uno de sus bits indican si una opción está activada o no. La Tabla 2.5 muestra los operadores
de Java que actúan a nivel de bits.
Operador Utilización Resultado
>> op1 >> op2 Desplaza los bits de op1 a la derecha una distancia op2
<< op1 << op2 Desplaza los bits de op1 a la izquierda una distancia op2
>>> op1 >>> op2 Desplaza los bits de op1 a la derecha una distancia op2
(positiva)
& op1 & op2 Operador AND a nivel de bits
| op1 | op2 Operador OR a nivel de bits
^ op1 ^ op2 Operador XOR a nivel de bits (1 si sólo uno de los operandos
es 1)
~ ~op2 Operador complemento (invierte el valor de cada bit)
Tabla 2.5. Operadores a nivel de bits.
En binario, las potencias de dos se representan con un único bit activado. Por ejemplo, los
números (1, 2, 4, 8, 16, 32, 64, 128) se representan respectivamente de modo binario en la forma
(00000001, 00000010, 00000100, 00001000, 00010000, 00100000, 01000000, 10000000),
utilizando sólo 8 bits. La suma de estos números permite construir una variable flags con los bits
activados que se deseen. Por ejemplo, para construir una variable flags que sea 00010010 bastaría
hacer flags=2+16. Para saber si el segundo bit por la derecha está o no activado bastaría utilizar la
sentencia,
if (flags & 2 == 2) {...}
La Tabla 2.6 muestra los operadores de asignación a nivel de bits.
Operador Utilización Equivalente a
&= op1 &= op2 op1 = op1 & op2
|= op1 |= op2 op1 = op1 | op2
^= op1 ^= op2 op1 = op1 ^ op2
<<= op1 <<= op2 op1 = op1 << op2
>>= op1 >>= op2 op1 = op1 >> op2
>>>= op1 >>>= op2 op1 = op1 >>> op2
Tabla 2.6. Operadores de asignación a nivel de bits.
Precedencia de operadores
El orden en que se realizan las operaciones es fundamental para determinar el resultado de una
expresión. Por ejemplo, el resultado de x/y*z depende de qué operación (la división o el producto)
se realice primero. La siguiente lista muestra el orden en que se ejecutan los distintos operadores en
un sentencia, de mayor a menor precedencia:
postfix operators [] . (params) expr++ expr--
unary operators ++expr --expr +expr -expr ~ !
creation or cast new (type)expr
multiplicative */%
additive +-
shift << >> >>>
relational < > <= >= instanceof
equality == !=
bitwise AND &
bitwise exclusive OR ^
bitwise inclusive OR |
logical AND &&
logical OR ||
conditional ?:
assignment = += -= *= /= %= &= ^= |= <<= >>= >>>=
En Java, todos los operadores binarios, excepto los operadores de asignación, se evalúan de
izquierda a derecha. Los operadores de asignación se evalúan de derecha a izquierda, lo que
significa que el valor de la derecha se copia sobre la variable de la izquierda.
Estructuras de programación
En este apartado se supone que el lector tiene algunos conocimientos de programación y por lo
tanto
no se explican en profundidad los conceptos que aparecen.
Las estructuras de programación o estructuras de control permiten tomar decisiones y
realizar un proceso repetidas veces. Son los denominados bifurcaciones y bucles. En la mayoría de
los lenguajes de programación, este tipo de estructuras son comunes en cuanto a concepto, aunque
su sintaxis varía de un lenguaje a otro. La sintaxis de Java coincide prácticamente con la utilizada
en C/C++, lo que hace que para un programador de C/C++ no suponga ninguna dificultad adicional.
Sentencias o expresiones
Una expresión es un conjunto variables unidos por operadores. Son órdenes que se le dan al
computador para que realice una tarea determinada.
Una sentencia es una expresión que acaba en punto y coma (;). Se permite incluir varias
sentencias en una línea, aunque lo habitual es utilizar una línea para cada sentencia. Por ejemplo:
i = 0; j = 5; x = i + j;// Línea compuesta de tres sentencias
Comentarios
Existen dos formas diferentes de introducir comentarios entre el código de Java (en realidad son
tres, como pronto se verá). Son similares a la forma de realizar comentarios en el lenguaje C++. Los
comentarios son tremendamente útiles para poder entender el código utilizado, facilitando de ese
modo futuras revisiones y correcciones. Además permite que cualquier persona distinta al
programador original pueda comprender el código escrito de una forma más rápida. Se recomienda
acostumbrarse a comentar el código desarrollado. De esta forma se simplifica también la tarea de
estudio y revisión posteriores.
Java interpreta que todo lo que aparece a la derecha de dos barras “//” en una línea cualquiera
del código es un comentario del programador y no lo tiene en cuenta. El comentario puede empezar
al comienzo de la línea o a continuación de una instrucción que debe ser ejecutada. La segunda
forma de incluir comentarios consiste en escribir el texto entre los símbolos /*...*/. Este segundo
método es válido para comentar más de una línea de código. Por ejemplo:
// Esta línea es un comentario
int a=1; // Comentario a la derecha de una sentencia
// Esta es la forma de comentar más de una línea utilizando
// las dos barras. Requiere incluir dos barras al comienzo de cada línea
/* Esta segunda forma es mucho más cómoda para comentar un número elevado de líneas
ya que sólo requiere modificar
el comienzo y el final. */
En Java existe además una forma especial de introducir los comentarios (utilizando /**...*/
más algunos caracteres especiales) que permite generar automáticamente la documentación sobre
las clases y packages desarrollados por el programador. Una vez introducidos los comentarios, el
programa javadoc.exe (incluido en el JDK) genera de forma automática la información de forma
similar a la presentada en la propia documentación del JDK. La sintaxis de estos comentarios y la
forma de utilizar el programa javadoc.exe se puede encontrar en la información que viene con el
JDK.
Bifurcaciones
Las bifurcaciones permiten ejecutar una de entre varias acciones en función del valor de una
expresión lógica o relacional. Se tratan de estructuras muy importantes ya que son las encargadas de
controlar el flujo de ejecución de un programa. Existen dos bifurcaciones diferentes: if y switch.
Bifurcación if
Esta estructura permite ejecutar un conjunto de sentencias en función del valor que tenga la
expresión de comparación (se ejecuta si la expresión de comparación tiene valor true). Tiene la
forma siguiente:
if (booleanExpression) {
statements;
}
Las llaves {} sirven para agrupar en un bloque las sentencias que se han de ejecutar, y no son
necesarias si sólo hay una sentencia dentro del if.
Bifurcación if else
Análoga a la anterior, de la cual es una ampliación. Las sentencias incluidas en el else se ejecutan
en
el caso de no cumplirse la expresión de comparación (false),
if (booleanExpression) {
statements1;
} else {
statements2;
}
Sentencia switch
Se trata de una alternativa a la bifurcación if elseif else cuando se compara la misma expresión con
distintos valores. Su forma general es la siguiente:
switch (expression) {
case value1: statements1; break;
case value2: statements2; break;
case value3: statements3; break;
case value4: statements4; break;
case value5: statements5; break;
case value6: statements6; break;
[default: statements7;]
}
Las características más relevantes de switch son las siguientes:
1. Cada sentencia case se corresponde con un único valor de expression. No se pueden establecer
rangos o condiciones sino que se debe comparar con valores concretos. El ejemplo del Apartado
2.3.3.3 no se podría realizar utilizando switch.
2. Los valores no comprendidos en ninguna sentencia case se pueden gestionar en default, que es
opcional.
3. En ausencia de break, cuando se ejecuta una sentencia case se ejecutan también todas las case
que van a continuación, hasta que se llega a un break o hasta que se termina el switch.
Ejemplo:
char c = (char)(Math.random()*26+'a'); // Generación aleatoria de letras minúsculas
System.out.println("La letra " + c );
switch (c) {
case 'a': // Se compara con la letra a
case 'e': // Se compara con la letra e
case 'i': // Se compara con la letra i
case 'o': // Se compara con la letra o
case 'u': // Se compara con la letra u
System.out.println(" Es una vocal "); break;
default:
System.out.println(" Es una consonante ");
}
Bucles
Un bucle se utiliza para realizar un proceso repetidas veces. Se denomina también lazo o loop. El
código incluido entre las llaves {} (opcionales si el proceso repetitivo consta de una sola línea), se
ejecutará mientras se cumpla unas determinadas condiciones. Hay que prestar especial atención a
los bucles infinitos, hecho que ocurre cuando la condición de finalizar el bucle
(booleanExpression) no se llega a cumplir nunca. Se trata de un fallo muy típico, habitual sobre
todo entre programadores poco experimentados.
Bucle while
Bucle for
Es similar al bucle while pero con la particularidad de que el control está al final del bucle (lo que
hace que el bucle se ejecute al menos una vez, independientemente de que la condición se cumpla o
no). Una vez ejecutados los statements, se evalúa la condición: si resulta true se vuelven a ejecutar
las sentencias incluidas en el bucle, mientras que si la condición se evalúa a false finaliza el bucle.
Este tipo de bucles se utiliza con frecuencia para controlar la satisfacción de una determinada
condición de error o de convergencia.
do {
statements
} while (booleanExpression);
La sentencia break es válida tanto para las bifurcaciones como para los bucles. Hace que se salga
inmediatamente del bucle o bloque que se está ejecutando, sin sin realizar la ejecución del resto de
las sentencias.
La sentencia continue se utiliza en los bucles (no en bifurcaciones). Finaliza la iteración “i”
que en ese momento se está ejecutando (no ejecuta el resto de sentencias que hubiera hasta el final
del bucle). Vuelve al comienzo del bucle y comienza la siguiente iteración (i+1).
Las etiquetas permiten indicar un lugar donde continuar la ejecución de un programa después de un
break o continue. El único lugar donde se pueden incluir etiquetas es justo delante de un bloque de
código entre llaves {} (if, switch, do...while, while, for) y sólo se deben utilizar cuando se tiene uno
o más bucles (o bloques) dentro de otro bucle y se desea salir (break) o continuar con la siguiente
iteración (continue) de un bucle que no es el actual.
Por tanto, la sentencia break labelName finaliza el bloque que se encuentre a continuación de
labelName. Por ejemplo, en las sentencias,
bucleI: // etiqueta o label
for ( int i = 0, j = 0; i < 100; i++){
while ( true ) {
if( (++j) > 5) { break bucleI; } // Finaliza ambos bucles
else { break; } // Finaliza el bucle interior (while)
}
}
la expresión break bucleI; finaliza los dos bucles simultáneamente, mientras que la expresión
break; sale del bucle while interior y seguiría con el bucle for en i. Con los valores presentados
ambos bucles finalizarán con i = 5 y j = 6 (se invita al lector a comprobarlo).
La sentencia continue (siempre dentro de al menos un bucle) permite transferir el control a un
bucle con nombre o etiqueta. Por ejemplo, la sentencia,
continue bucle1;
transfiere el control al bucle for que comienza después de la etiqueta bucle1: para que realice una
nueva iteración, como por ejemplo:
bucle1:
for (int i=0; i<n; i++) {
bucle2:
for (int j=0; j<m; j++) {
...
if (expression) continue bucle1; then continue bucle2;
...
}
}
Sentencia return
Java incorpora en el propio lenguaje la gestión de errores. El mejor momento para detectar los
errores es durante la compilación. Sin embargo prácticamente sólo los errores de sintaxis son
detectados en esta operación. El resto de problemas surgen durante la ejecución de los programas.
En el lenguaje Java, una Exception es un cierto tipo de error o una condición anormal que se
ha producido durante la ejecución de un programa. Algunas excepciones son fatales y provocan que
se deba finalizar la ejecución del programa. En este caso conviene terminar ordenadamente y dar un
mensaje explicando el tipo de error que se ha producido. Otras excepciones, como por ejemplo no
encontrar un fichero en el que hay que leer o escribir algo, pueden ser recuperables. En este caso el
programa debe dar al usuario la oportunidad de corregir el error (definiendo por ejemplo un nuevo
path del fichero no encontrado).
Los errores se representan mediante clases derivadas de la clase Throwable, pero los que
tiene
que chequear un programador derivan de Exception (java.lang.Exception que a su vez deriva de
Throwable). Existen algunos tipos de excepciones que Java obliga a tener en cuenta. Esto se hace
mediante el uso de bloques try, catch y finally.
El código dentro del bloque try está “vigilado”. Si se produce una situación anormal y se
lanza
como consecuencia una excepción, el control pasa al bloque catch, que se hace cargo de la situación
y decide lo que hay que hacer. Se pueden incluir tantos bloques catch como se desee, cada uno de
los cuales tratará un tipo de excepción. Finalmente, si está presente, se ejecuta el bloque finally, que
es opcional, pero que en caso de existir se ejecuta siempre, sea cual sea el tipo de error.
En el caso en que el código de un método pueda generar una Exception y no se desee incluir
en dicho método la gestión del error (es decir los bucles try/catch correspondientes), es necesario
que el método pase la Exception al método desde el que ha sido llamado. Esto se consigue mediante
la adición de la palabra throws seguida del nombre de la Exception concreta, después de la lista de
argumentos del método. A su vez el método superior deberá incluir los bloques try/catch o volver a
pasar la Exception. De esta forma se puede ir pasando la Exception de un método a otro hasta llegar
al último método del programa, el método main().
En el siguiente ejemplo se presentan dos métodos que deben "controlar" una IOException
relacionada con la lectura ficheros y una MyException propia. El primero de ellos (metodo1) realiza
la gestión de las excepciones y el segundo (metodo2) las pasa al siguiente método.
void metodo1() {
...
try {
... // Código que puede lanzar las excepciones IOException y MyException
} catch (IOException e1) {// Se ocupa de IOException simplemente dando aviso
System.out.println(e1.getMessage());
} catch (MyException e2) {
// Se ocupa de MyException dando un aviso y finalizando la función
System.out.println(e2.getMessage()); return;
} finally { // Sentencias que se ejecutarán en cualquier caso
...
}]
...
} // Fin del metodo1
void metodo2() throws IOException, MyException {
...
// Código que puede lanzar las excepciones IOException y MyException
...
} // Fin del metodo2
Arrays y Cadenas.
Arrays Unidimensionales.
Los valores del array se asignan utilizando el índice del mismo entre corchetes:
notas[2]=8;
También se pueden asignar valores al array en la propia declaración:
int notas[] = {8, 7, 9};
int notas2[]= new int[] {8,7,9};//Equivalente a la anterior
Esto declara e inicializa un array de tres elementos. En el ejemplo lo que significa es que
notas[0] vale 8, notas[1] vale 7 y notas[2] vale 9.
En Java (como en otros lenguajes) el primer elemento de un array es el cero. El
primer elemento del array notas, es notas[0]. Se pueden declarar arrays a cualquier tipo
de datos (enteros, booleanos, doubles, ... e incluso objetos).
La ventaja de usar arrays (volviendo al caso de las notas) es que gracias a un simple
bucle for se puede rellenar o leer fácilmente todos los elementos de un array:
//Calcular la media de las 18 notas
suma=0;
for (int i=0;i<=17;i++){
suma+=nota[i];
}
media=suma/18;
A un array se le puede inicializar las veces que haga falta:
int notas[]=new notas[16];
...
notas=new notas[25];
Pero hay que tener en cuenta que el segundo new hace que se pierda el contenido
anterior. Realmente un array es una referencia a valores que se almacenan en memoria
mediante el operador new, si el operador new se utiliza en la misma referencia, el
anterior contenido se queda sin referencia y, por lo tanto se pierde.
Un array se puede asignar a otro array (si son del mismo tipo):
int notas[];
int ejemplo[]=new int[18];
notas=ejemplo;
En el último punto, notas equivale a ejemplo. Esta asignación provoca que cualquier
cambio en notas también cambie el array ejemplos. Es decir esta asignación anterior, no
copia los valores del array, sino que notas y ejemplo son referencias al mismo array.
Ejemplo:
int notas[]={3,3,3};
int ejemplo[]=notas;
ejemplo= notas;
ejemplo[0]=8;
System.out.println(notas[0]);//Escribirá el número 8
Arrays Multidimensionales.
Los arrays además pueden tener varias dimensiones. Entonces se habla de arrays de
arrays (arrays que contienen arrays) Ejemplo:
int notas[][];
notas es un array que contiene arrays de enteros
notas = new int[3][12];//notas está compuesto por 3 arrays
//de 12 enteros cada uno
notas[0][0]=9;//el primer valor es 0
Puede haber más dimensiones incluso (notas[3][2][7]). Los arrays multidimensionales
se pueden inicializar de forma más creativa incluso. Ejemplo:
int notas[][]=new int[5][];//Hay 5 arrays de enteros
notas[0]=new int[100]; //El primer array es de 100 enteros
notas[1]=new int[230]; //El segundo de 230
notas[2]=new int[400];
notas[3]=new int[100];
notas[4]=new int[200];
Hay que tener en cuenta que en el ejemplo anterior, notas[0] es un array de 100
enteros. Mientras que notas, es un array de 5 arrays de enteros.
Se pueden utilizar más de dos dimensiones si es necesario.
longitud de un array
Los arrays poseen un método que permite determinar cuánto mide un array. Se trata de
length. Ejemplo (continuando del anterior):
System.out.println(notas.length); //Sale 5
System.out.println(notas[2].length); //Sale 400
la clase Arrays.
En el paquete java.utils se encuentra una clase estática llamada Arrays. Una clase
estática permite ser utilizada como si fuera un objeto (como ocurre con Math). Esta
clase posee métodos muy interesantes para utilizar sobre arrays.
Su uso es
Arrays.método(argumentos);
fill
Permite rellenar todo un array unidimensional con un determinado valor. Sus
argumentos son el array a rellenar y el valor deseado:
int valores[]=new int[23];
Arrays.fill(valores,-1);//Todo el array vale -1
También permite decidir desde que índice hasta qué índice rellenamos:
Arrays.fill(valores,5,8,-1);//Del elemento 5 al 7 valdrán -1
equals
Compara dos arrays y devuelve true si son iguales. Se consideran iguales si son del
mismo tipo, tamaño y contienen los mismos valores.
sort
Permite ordenar un array en orden ascendente. Se pueden ordenar sólo una serie de
elementos desde un determinado punto hasta un determinado punto.
int x[]={4,5,2,3,7,8,2,3,9,5};
Arrays.sort(x);//Estará ordenado
Arrays.sort(x,2,5);//Ordena del 2o al 4o elemento
binarySearch
Permite buscar un elemento de forma ultrarrápida en un array ordenado (en un array
desordenado sus resultados son impredecibles). Devuelve el índice en el que está
colocado el elemento. Ejemplo:
int x[]={1,2,3,4,5,6,7,8,9,10,11,12};
Arrays.sort(x);
System.out.println(Arrays.binarySearch(x,8));//Da
7
El método System.arraysCopy
La clase System también posee un método relacionado con los arrays, dicho método
permite copiar un array en otro. Recibe cinco argumentos: el array que se copia, el
índice desde que se empieza a copia en el origen, el array destino de la copia, el índice
desde el que se copia en el destino, y el tamaño de la copia (número de elementos de la
copia).
int uno[]={1,1,2};
int dos[]={3,3,3,3,3,3,3,3,3};
System.arraycopy(uno, 0, dos, 0, uno.length);
for (int i=0;i<=8;i++){
System.out.print(dos[i]+" ");
} //Sale 112333333
Clase String
Introducción
Para Java las cadenas de texto son objetos especiales. Los textos deben manejarse
creando objetos de tipo String. Ejemplo:
String texto1 = “¡Prueba de texto!”;
Las cadenas pueden ocupar varias líneas utilizando el operador de concatenación “+”.
String texto2 =”Este es un texto que ocupa “ +
“varias líneas, no obstante se puede “+
“perfectamente encadenar”;
También se pueden crear objetos String sin utilizar constantes entrecomilladas, usando
otros constructores:
char[] palabra = {‘P’,’a’,’l’,’b’,’r’,’a’};//Array de char
String cadena = new String(palabra);
byte[] datos = {97,98,99};
String codificada = new String (datos, “8859_1”);
En el último ejemplo la cadena codificada se crea desde un array de tipo byte que
contiene números que serán interpretados como códigos Unicode. Al asignar, el valor
8859_1 indica la tabla de códigos a utilizar.
comparación entre objetos String
Los objetos String no pueden compararse directamente con los operadores de
comparación. En su lugar se deben utilizar estas expresiones:
cadena1.equals(cadena2). El resultado es true si la cadena1 es igual a la
cadena2. Ambas cadenas son variables de tipo String.
cadena1.equalsIgnoreCase(cadena2). Como la anterior, pero en este caso no se
tienen en cuenta mayúsculas y minúsculas.
s1.compareTo(s2). Compara ambas cadenas, considerando el orden alfabético.
Si la primera cadena es mayor en orden alfabético que la segunda devuelve 1, si
son iguales devuelve 0 y si es la segunda la mayor devuelve -1. Hay que tener en
cuenta que el orden no es el del alfabeto español, sino que usa la tabla ASCII, en
esa tabla la letra ñ es mucho mayor que la o.
s1.compareToIgnoreCase(s2). Igual que la anterior, sólo que además ignora
las mayúsculas (disponible desde Java 1.2)
String.valueOf
Este método pertenece no sólo a la clase String, sino a otras y siempre es un método que
convierte valores de una clase a otra. En el caso de los objetos String, permite convertir
valores que no son de cadena a forma de cadena. Ejemplos:
String numero = String.valueOf(1234);
String fecha = String.valueOf(new Date());
En el ejemplo se observa que este método pertenece a la clase String directamente, no
hay que utilizar el nombre del objeto creado (como se verá más adelante, es un método
estático).
Métodos de las variables de las cadenas
Son métodos que poseen las propias variables de cadena. Para utilizarlos basta con
poner el nombre del método y sus parámetros después del nombre de la variable String.
Es decir: variableString.método(argumentos)
length
Permite devolver la longitud de una cadena (el número de caracteres de la cadena):
String texto1=”Prueba”;
System.out.println(texto1.length());//Escribe 6
Concatenar cadenas
charAt
Devuelve un carácter de la cadena. El carácter a devolver se indica por su posición (el
primer carácter es la posición 0) Si la posición es negativa o sobrepasa el tamaño de la
cadena, ocurre un error de ejecución, una excepción tipo IndexOutOfBounds-
Exception. Ejemplo:
String s1=”Prueba”;
char c1=s1.charAt(2); //c1 valdrá ‘u’
substring
Da como resultado una porción del texto de la cadena. La porción se toma desde una
posición inicial hasta una posición final (sin incluir esa posición final). Si las posiciones
indicadas no son válidas ocurre una excepción de tipo IndexOutOfBounds-
Exception. Se empieza a contar desde la posición 0. Ejemplo:
String s1=”Buenos días”;
lastIndexOf
Devuelve la última posición en la que aparece un determinado texto en la cadena. Es
casi idéntica a la anterior, sólo que busca desde el final. Ejemplo:
String s1=”Quería decirte que quiero que te vayas”;
System.out.println(s1.lastIndexOf(“que”); //Da 26
También permite comenzar a buscar desde una determinada posición.
endsWith
Devuelve true si la cadena termina con un determinado texto. Ejemplo:
String s1=”Quería decirte que quiero que te vayas”;
System.out.println(s1.endsWith(“vayas”); //Da true
startsWith
Devuelve true si la cadena empieza con un determinado texto.
replace
Cambia todas las apariciones de un carácter por otro en el texto que se indique y lo
almacena como resultado. El texto original no se cambia, por lo que hay que asignar el
resultado de replace a un String para almacenar el texto cambiado:
String s1=”Mariposa”;
System.out.println(s1.replace(‘a’,’e’));//Da Meripose
System.out.println(s1);//Sigue valiendo Mariposa
replaceAll
Modifica en un texto cada entrada de una cadena por otra y devuelve el resultado. El
primer parámetro es el texto que se busca (que puede ser una expresión regular), el
segundo parámetro es el texto con el que se reemplaza el buscado. La cadena original no
se modifica.
toUpperCase
Devuelve la versión en mayúsculas de la cadena.
toLowerCase
Devuelve la versión en minúsculas de la cadena.
toCharArray
Obtiene un array de caracteres a partir de una cadena.
método descripción
int lastIndexOf(String s, int primeraPos) Devuelve la última posición en la cadena del
texto s, empezando a buscar desde la
posición PrimeraPos
Objetos y Clases
Propiedades de la POO
Encapsulamiento
Herencia
Por ejemplo, si quisiéramos crear el juego del parchís en Java, una clase sería la
casilla, otra las fichas, otra el dado, etc., etc. En el caso de la casilla, se definiría la clase
para indicar su funcionamiento y sus propiedades, y luego se crearía tantos objetos
casilla como casillas tenga el juego.
Lo mismo ocurriría con las fichas, la clase ficha definiría las propiedades de la ficha
(color y posición por ejemplo) y su funcionamiento mediante sus métodos (por ejemplo
un método sería mover, otro llegar a la meta, etc., etc., ), luego se crearían tantos objetos
ficha, como fichas tenga el juego.
Las clases son las plantillas para hacer objetos. Una clase sirve para definir una serie de
objetos con propiedades (atributos), comportamientos (operaciones o métodos), y
semántica comunes. Hay que pensar en una clase como un molde. A través de las clases
se obtienen los objetos en sí.
Es decir antes de poder utilizar un objeto se debe definir la clase a la que pertenece,
esa definición incluye:
Sus atributos. Es decir, los datos miembros de esa clase. Los datos pueden ser
públicos (accesibles desde otra clase) o privados (sólo accesibles por código de su
propia clase. También se las llama campos.
Sus métodos. Las funciones miembro de la clase. Son las acciones (u
operaciones) que puede realizar la clase.
Código de inicialización. Para crear una clase normalmente hace falta realizar
operaciones previas (es lo que se conoce como el constructor de la clase).
Otras clases. Dentro de una clase se pueden definir otras clases (clases internas,
son consideradas como asociaciones dentro de UML).
Nombre de clase
Atributos
Métodos
Ilustración 5, Clase en notación UML
Objetos
Se les llama instancias de clase. Son un elemento en sí de la clase (en el ejemplo del
parchís, una ficha en concreto). Un objeto se crea utilizando el llamado constructor de
la clase. El constructor es el método que permite iniciar el objeto.
datos miembro (propiedades o atributos)
Para poder acceder a los atributos de un objeto, se utiliza esta sintaxis:
objeto.atributo
Por ejemplo:
Noria.radio;
Métodos
Los métodos se utilizan de la misma forma que los atributos, excepto porque los
métodos poseen siempre paréntesis, dentro de los cuales pueden ir valore snecesarios
para la ejecución del método (parámetros):
objeto.método(argumentosDelMétodo)
Los métodos siempre tienen paréntesis (es la diferencia con las propiedades) y dentro
de los paréntesis se colocan los argumentos del método. Que son los datos que necesita
el método para funcionar. Por ejemplo:
MiNoria.gira(5);
Lo cual podría hacer que la Noria avance a 5 Km/h.
Herencia
Una vez definida la clase, se pueden utilizar objetos de la clase. Normalmente consta de
dos pasos. Su declaración, y su creación. La declaración consiste en indicar que se va a
utilizar un objeto de una clase determinada. Y se hace igual que cuando se declara una
variable simple. Por ejemplo:
Noria noriaDePalencia;
Eso declara el objeto noriaDePalencia como objeto de tipo Noria; se supone que
previamente se ha definido la clase Noria.
Para poder utilizar un objeto, hay que crearle de verdad. Eso consiste en utilizar el
operador new. Por ejemplo:
noriaDePalencia = new Noria();
Al hacer esta operación el objeto reserva la memoria que necesita y se inicializa el objeto
mediante su constructor. Más adelante veremos como definir el constructor.
NoriaDePalencia:Noria
Ilustración 7, Objeto NoriaDePalencia
de la clase Noria en notación UML
Especificadores de acceso
Se trata de una palabra que antecede a la declaración de una clase, método o propiedad
de clase. Hay tres posibilidades: public, protected y private. Una cuarta posibilidad
es no utilizar ninguna de estas tres palabras; entonces se dice que se ha utilizado el
modificador por defecto (friendly).
Los especificadores determinan el alcance de la visibilidad del elemento al que se
refieren. Referidos por ejemplo a un método, pueden hacer que el método sea visible
sólo para la clase que lo utiliza (private), para éstas y las heredadas (protected), para
todas las clases del mismo paquete (friendly) o para cualquier clase del tipo que sea
(public).
En la siguiente tabla se puede observar la visibilidad de cada especificador:
sin
modificador
private protected public
zona (privado) (friendly) (protegido) (público)
Misma clase X X X X
Subclase en el X X X
mismo paquete
Clase (no X X
subclase) en el
mismo paquete
Subclase en otro X X
paquete
No subclase en X
otro paquete
Definir atributos de la clase (variables, propiedades o datos de la clases)
Cuando se definen los datos de una determinada clase, se debe indicar el tipo de
propiedad que es (String, int, double, int[][],...) y el especificador de acceso (public,
private,...). El especificador indica en qué partes del código ese dato será visible.
Ejemplo:
class Persona {
public String nombre;//Se puede acceder desde cualquier clase
private int contraseña;//Sólo se puede acceder desde la
//clase Persona
protected String dirección; //Acceden a esta propiedad
//esta clase y sus descendientes
Por lo general las propiedades de una clase suelen ser privadas o protegidas, a no ser
que se trate de un valor constante, en cuyo caso se declararán como públicos.
Las variables locales de una clase pueden ser inicializadas.
class auto{
public nRuedas=4;
Persona
+nombre:String
-contraseña:String
#direccion:String
Ilustración 8, La clase persona en UML. El signo + significa public,
el signo # protected y el signo - private
Los métodos de la clase se definen dentro de ésta. Hay que indicar un modificador de
acceso (public, private, protected o ninguno, al igual que ocurre con las variables y
con la propia clase) y un tipo de datos, que indica qué tipo de valores devuelve el
método.
Esto último se debe a que los métodos son funciones que pueden devolver un
determinado valor (un entero, un texto, un valor lógico,...) mediante el comando
return. Si el método no devuelve ningún valor, entonces se utiliza el tipo void que
significa que no devuelve valores (en ese caso el método no tendrá instrucción return).
El último detalle a tener en cuenta es que los métodos casi siempre necesitan datos
para realizar la operación, estos datos van entre paréntesis y se les llama argumentos. Al
definir el método hay que indicar que argumentos se necesitan y de qué tipo son.
Ejemplo:
public class vehiculo {
/** Función principal */
int ruedas;
private double velocidad=0;
String nombre;
/** Aumenta la velocidad*/
public void acelerar(double cantidad) {
velocidad += cantidad;
}
/** Disminuye la velocidad*/
public void frenar(double cantidad) {
velocidad -= cantidad;
}
/** Devuelve la velocidad*/
public double obtenerVelocidad(){
return velocidad;
}
public static void main(String args[]){
vehiculo miCoche = new vehiculo();
miCoche.acelerar(12);
miCoche.frenar(5);
System.out.println(miCoche.obtenerVelocidad());
} // Da 7.0
En la clase anterior, los métodos acelerar y frenar son de tipo void por eso no tienen
sentencia return. Sin embargo el método obtenerVelocidad es de tipo double por lo
que su resultado es devuelto por la sentencia return y puede ser escrito en pantalla.
Coche
ruedas:int
-velocidad:double=0
#direccion:String
nombre:String
+acelerar(double)
+frenar(double)
+obtenerVelocidad():double
Ilustración 9, Versión UML de la clase
Coche
En todos los lenguajes éste es un tema muy importante. Los argumentos son los datos
que recibe un método y que necesita para funcionar. Ejemplo:
public class Matemáticas {
public double factorial(int n){
double resultado;
for (resultado=n;n>1;n--) resultado*=n;
return resultado;
}
...
public static void main(String args[]){
Matemáticas m1=new Matemáticas();
double x=m1.factorial(25);//Llamada al método
}
En el ejemplo anterior, el valor 25 es un argumento requerido por el método factorial
para que éste devuelva el resultado (que será el factorial de 25). En el código del método
factorial, este valor 25 es copiado a la variable n, que es la encargada de almacenar y
utilizar este valor.
Se dice que los argumentos son por valor, si la función recibe una copia de esos
datos, es decir la variable que se pasa como argumento no estará afectada por el código.
Ejemplo:
class prueba {
public void metodo1(int entero){
entero=18;
...
}
...
public static void main(String args[]){
int x=24;
prueba miPrueba = new prueba();
miPrueba.metodo1(x);
System.out.println(x); //Escribe 24, no 18
}
Este es un ejemplo de paso de parámetros por valor. La variable x se pasa como
argumento o parámetro para el método metodo1, allí la variable entero recibe una
copia del valor de x en la variable entero, y a esa copia se le asigna el valor 18. Sin
embargo la variable x no está afectada por esta asignación.
Sin embargo en este otro caso:
class prueba {
public void metodo1(int[] entero){
entero[0]=18;
...
}
...
public static void main(String args[]){
int x[]={24,24};
prueba miPrueba = new prueba();
miPrueba.metodo1(x);
System.out.println(x[0]); //Escribe 18, no 24
Devolución de valores
Los métodos pueden devolver valores básicos (int, short, double, etc.), Strings, arrays e
incluso objetos.
En todos los casos es el comando return el que realiza esta labor. En el caso de
arrays y objetos, devuelve una referencia a ese array u objeto. Ejemplo:
class FabricaArrays {
public int[] obtenArray(){
int array[]= {1,2,3,4,5};
return array;
}
}
public class returnArray {
public static void main(String[] args) {
FabricaArrays fab=new FabricaArrays();
int nuevoArray[]=fab.obtenArray();
}
}
Sobrecarga de métodos
Una propiedad de la POO es el polimorfismo. Java posee esa propiedad ya que admite
sobrecargar los métodos. Esto significa crear distintas variantes del mismo método.
Ejemplo:
class Matemáticas{
public double suma(double x, double y) {
return x+y;
}
public double suma(double x, double y, double z){
return x+y+z;
}
public double suma(double[] array){
double total =0;
for(int i=0; i<array.length;i++){
total+=array[i];
}
return total;
}
La clase matemáticas posee tres versiones del método suma. una versión que suma dos
números double, otra que suma tres y la última que suma todos los miembros de un
array de doubles. Desde el código se puede utilizar cualquiera de las tres versiones
según convenga.
La referencia this
Creación de constructores
En este otro ejemplo, al crear el objeto ficha1, se le da un valor a la casilla, por lo que la
casilla vale al principio 6.
Hay que tener en cuenta que puede haber más de un constructor para la misma
clase. Al igual que ocurría con los métodos, los constructores se pueden sobrecargar.
De este modo en el código anterior de la clase Ficha se podrían haber colocado los
dos constructores que hemos visto, y sería entonces posible este código:
Ficha ficha1= new Ficha(); //La propiedad casilla de la
//ficha valdrá 1
Ficha ficha1= new Ficha(6); //La propiedad casilla de la
//ficha valdrá 6
Hemos visto que hay que crear objetos para poder utilizar los métodos y propiedades de
una determinada clase. Sin embargo esto no es necesario si la propiedad o el método se
definen precedidos de la palabra clave static. De esta forma se podrá utilizar el método
sin definir objeto alguno, utilizando el nombre de la clase como si fuera un objeto. Así
funciona la clase Math (véase la clase Math, página 23). Ejemplo:
class Calculadora {
static public int factorial(int n) {
int fact=1;
while (n>0) {
fact *=n--;
}
return fact;
}
}
public class app {
public static void main(String[] args) {
System.out.println(Calculadora.factorial(5));
}
}
En este ejemplo no ha hecho falta crear objeto alguno para poder calcular el factorial.
Una clase puede tener métodos y propiedades genéricos (static) y métodos y
propiedades dinámicas (normales).
Cada vez que se crea un objeto con new, se almacena éste en memoria. Los métodos
y propiedades normales, gastan memoria por cada objeto que se cree, sin embargo los
métodos estáticos no gastan memoria por cada objeto creado, gastan memoria al definir
la clase sólo. Es decir los métodos y atributos static son los mismos para todos los
objetos creados, gastan por definir la clase, pero no por crear cada objeto.
Hay que crear métodos y propiedades genéricos cuando ese método o propiedad vale
o da el mismo resultado en todos los objetos. Pero hay que utilizar métodos normales
(dinámicos) cuando el método da resultados distintos según el objeto. Por ejemplo en
un clase que represente aviones, la altura sería un atributo dinámico (distinto en cada
objeto), mientras que el número total de aviones, sería un método static (es el mismo
para todos los aviones).
El método main
Hasta ahora hemos utilizado el método main de forma incoherente como único posible
mecanismo para ejecutar programas. De hecho este método dentro de una clase, indica
que la clase es ejecutable desde la consola. Su prototipo es:
public static void main(String[] args){
...instruccionesejecutables....
}
Hay que tener en cuenta que el método main es estático, por lo que no podrá utilizar
atributos o métodos dinámicos de la clase.
Los argumentos del método main son un array de caracteres donde cada elemento
del array es un parámetro enviado por el usuario desde la línea de comandos. A este
argumento se le llama comúnmente args. Es decir, si se ejecuta el programa con:
java claseConMain uno dos
Entonces el método main de esta clase recibe un array con dos elementos, el primero es
la cadena “uno” y el segundo la cadena “dos” (es decir args[0]=”uno”; args[1]=”dos”).
destrucción de objetos
En C y C++ todos los programadores saben que los objetos se crean con new y para
eliminarles de la memoria y así ahorrarla, se deben eliminar con la instrucción delete.
Es decir, es responsabilidad del programador eliminar la memoria que gastaban los
objetos que se van a dejar de usar. La instrucción delete del C++ llama al destructor de
la clase, que es una función que se encarga de eliminar adecuadamente el objeto.
La sorpresa de los programadores C++ que empiezan a trabajar en Java es que no
hay instrucción delete en Java. La duda está entonces, en cuándo se elimina la
memoria que ocupa un objeto.
En Java hay un recolector de basura (garbage collector) que se encarga de
gestionar los objetos que se dejan de usar y de eliminarles de memoria. Este proceso es
automático e impredecible y trabajo en un hilo (thread) de baja prioridad.
Por lo general ese proceso de recolección de basura, trabaja cuando detecta que un
objeto hace demasiado tiempo que no se utiliza en un programa. Esta eliminación
depende de la máquina virtual, en casi todas la recolección se realiza periódicamente en
un determinado lapso de tiempo. La implantación de máquina virtual conocida como
HotSpot1 suele hacer la recolección mucho más a menudo
Se puede forzar la eliminación de un objeto asignándole el valor null, pero teniendo
en cuenta que eso no equivale al famoso delete del lenguaje C++. Con null no se libera
inmediatamente la memoria, sino que pasará un cierto tiempo (impredecible, por otro
lado) hasta su total destrucción.
Se puede invocar al recolector de basura desde el código invocando al método
estático System.gc(). Esto hace que el recolector de basura trabaje en cuanto se lea
esa invocación.
Sin embargo puede haber problemas al crear referencias circulares. Como:
class uno {
dos d;
uno() { //constructor
d = new dos();
}
}
class dos {
uno u;
dos() {
u = new uno();
}
public class app {
Al crear un objeto de clase uno, automáticamente se crea uno de la clase dos, que al
crearse creará otro de la clase uno. Eso es un error que provocará que no se libere bien
la memoria salvo que se eliminen previamente los objetos referenciados.
El método finalize
Herencia
Introducción
Por defecto se heredan todos los métodos y propiedades protected y public (no se
heredan los private). Además si se define un método o propiedad en la subclase con el
mismo nombre que en la superclase, entonces se dice que se está redefiniendo el
método, con lo cual no se hereda éste, sino que se reemplaza por el nuevo.
Ejemplo:
class vehiculo {
public int velocidad;
public int ruedas;
public void parar() {
velocidad = 0;
}
public void acelerar(int kmh) {
velocidad += kmh;
}
class coche extends vehiculo{
public int ruedas=4;
public int gasolina;
public void repostar(int litros) {
gasolina+=litros;
}
}
...........................................................
public class app {
public static void main(String[] args) {
coche coche1=new coche();
coche.acelerar(80);//Método heredado
coche.repostar(12);
Anulación de métodos
Como se ha visto, las subclases heredan los métodos de las superclases. Pero es más,
también los pueden sobrecargar para proporcionar una versión de un determinado
método.
Por último, si una subclase define un método con el mismo nombre, tipo y
argumentos que un método de la superclase, se dice entonces que se sobrescribe o anula
el método de la superclase. Ejemplo:
Animal
comer()
dormir()
reproducir()
toby:Perro
comer()
Mamífero reproducir()
dormir()
reproducir()
ladrar()
anula
grunir()
Perro
dormir()
anula ladrar()
grunir()
Ilustración 12, anulación de métodos
Super
en la clase coche ya que aunque la velocidad varía igual que en la superclase, hay que
tener en cuenta el consumo de gasolina
Se puede incluso llamar a un constructor de una superclase, usando la sentencia
super(). Ejemplo:
public class vehiculo{
double velocidad;
public vehiculo(double v){
velocidad=v;
}
}
public class coche extends vehiculo{
double gasolina;
public coche(double v, double g){
super(v);//Llama al constructor de la clase vehiculo
gasolina=g
}
}
Por defecto Java realiza estas acciones:
Si la primera instrucción de un constructor de una subclase es una sentencia que
no es ni super ni this, Java añade de forma invisible e implícita una llamada
super() al constructor por defecto de la superclase, luego inicia las variables de la
subclase y luego sigue con la ejecución normal.
Si se usa super(..) en la primera instrucción, entonces se llama al constructor
seleccionado de la superclase, luego inicia las propiedades de la subclase y luego
sigue con el resto de sentencias del constructor.
Finalmente, si esa primera instrucción es this(..), entonces se llama al
constructor seleccionado por medio de this, y después continúa con las sentencias
del constructor. La inicialización de variables la habrá realizado el constructor al
que se llamó mediante this.
Casting de clases
Como ocurre con los tipos básicos (ver conversión entre tipos (casting), página 18, es
posible realizar un casting de objetos para convertir entre clases distintas. Lo que
ocurre es que sólo se puede realizar este casting entre subclases. Es decir se realiza un
casting para especificar más una referencia de clase (se realiza sobre una superclase
para convertirla a una referencia de una subclase suya).
En cualquier otro caso no se puede asignar un objeto de un determinado tipo a otro.
Ejemplo:
Vehiculo vehiculo5=new Vehiculo();
Coche cocheDePepe = new Coche(“BMW”);
vehiculo5=cocheDePepe //Esto sí se permite
cocheDePepe=vehiculo5;//Tipos incompatibles
cocheDepepe=(coche)vehiculo5;//Ahora sí se permite
Hay que tener en cuenta que los objetos nunca cambian de tipo, se les prepara para su
asignación pero no pueden acceder a propiedades o métodos que no les sean propios.
Por ejemplo, si repostar() es un método de la clase coche y no de vehículo:
Vehiculo v1=new Vehiculo();
Coche c=new Coche();
v1=c;//No hace falta casting
v1.repostar(5);//¡¡¡Error!!!
Cuando se fuerza a realizar un casting entre objetos, en caso de que no se pueda realizar
ocurrirá una excepción del tipo ClassCastingException. Realmente sólo se puede
hacer un casting si el objeto originalmente era de ese tipo. Es decir la instrucción:
cocheDepepe=(Coche) vehiculo4;
Sólo es posible si vehiculo4 hace referencia a un objeto coche.
Instanceof
Clases abstractas
A veces resulta que en las superclases se desean incluir métodos teóricos, métodos que
no se desea implementar del todo, sino que sencillamente se indican en la clase para
que el desarrollador que desee crear una subclase heredada de la clase abstracta, esté
obligado a sobrescribir el método.
A las clases que poseen métodos de este tipo (métodos abstractos) se las llama
clases abstractas. Son clases creadas para ser heredadas por nuevas clases creadas
por el programador. Son clases base para herencia. Las clases abstractas no deben de
ser instanciadas (no se pueden crear objetos de las clases abstractas).
Una clase abstracta debe ser marcada con la palabra clave abstract. Cada método
abstracto de la clase, también llevará el abstract. Ejemplo:
abstract class vehiculo {
public int velocidad=0;
abstract public void acelera();
public void para() {velocidad=0;}
}
class coche extends vehiculo {
public void acelera() {
velocidad+=5;
}
}
public class prueba {
public static void main(String[] args) {
coche c1=new coche();
c1.acelera();
System.out.println(c1.velocidad);
c1.para();
System.out.println(c1.velocidad);
}
}
Final
Si esa misma palabra se coloca delante de una clase, significará que esa clase no
puede tener descendencia.
Por último si se usa la palabra final delante de la definición de una propiedad de
clase, entonces esa propiedad pasará a ser una constante, es decir no se le podrá
cambiar el valor en ninguna parte del código.
Clases internas
Se llaman clases internas a las clases que se definen dentro de otra clase. Esto permite
simplificar aun más el problema de crear programas. Ya que un objeto complejo se
puede descomponer en clases más sencillas. Pero requiere esta técnica una mayor
pericia por parte del programador.
Al definir una clase dentro de otra, estamos haciéndola totalmente dependiente.
Normalmente se realiza esta práctica para crear objetos internos a una clase (el motor
de un coche por ejemplo), de modo que esos objetos pasan a ser atributos de la clase.
Por ejemplo:
public class Coche {
public int velocidad;
public Motor motor;
public Coche(int cil) {
motor=new Motor(cil);
velocidad=0;
}
public class Motor{ //Clase interna
public int cilindrada;
public Motor(int cil){
cilindrada=cil;
}
}
}
El objeto motor es un objeto de la clase Motor que es interna a Coche. Si quisiéramos
acceder al objeto motor de un coche sería:
Coche c=new Coche(1200);
System.out.println(c.motor.cilindrada);//Saldrá 1200
Las clases internas pueden ser privadas, protegidas o públicas. Fuera de la clase
contenedora no pueden crear objetos (sólo se pueden crear motores dentro de un
coche), salvo que la clase interna sea static en ese caso sí podrían. Por ejemplo (si la
clase motor fuera estática):
Creación de paquetes
Ejemplo:
import locomoción.*;
//Importa todas las clase del paquete locomoción
Esta instrucción no importa el contenido de los paquetes interiores a locomoción (es
decir que si la clase Coche está dentro del paquete motor, no sería importada con esa
instrucción, ya que el paquete motor no ha sido importado, sí lo sería la clase
locomoción.BarcoDeVela). Por ello en el ejemplo lo completo sería:
import locomoción.*;
import locomoción.motor.*;
Cuando desde un programa se hace referencia a una determinada clase se busca ésta en
el paquete en el que está colocada la clase y, sino se encuentra, en los paquetes que se
han importado al programa. Si ese nombre de clase se ha definido en un solo paquete,
se usa. Si no es así podría haber ambigüedad por ello se debe usar un prefijo delante
de la clase con el nombre del paquete.
Es decir:
paquete.clase
O incluso:
paquete1.paquete2......clase
En el caso de que el paquete sea subpaquete de otro más grande.
Las clases son visibles en el mismo paquete a no ser que se las haya declarado con el
modificador private.
Los paquetes en realidad son subdirectorios cuyo raíz debe ser absolutamente accesible
por el sistema operativo. Para ello es necesario usar la variable de entorno
CLASSPATH de la línea de comandos. Esta variable se suele definir en el archivo
autoexec.bat o en MI PC en el caso de las últimas versiones de Windows (Véase
proceso de compilación, página 9). Hay que añadirla las rutas a las carpetas que
contienen los paquetes (normalmente todos los paquetes se suelen crear en la misma
carpeta), a estas carpetas se las llama filesystems.
Así para el paquete prueba.reloj tiene que haber una carpeta prueba, dentro de la
cual habrá una carpeta reloj y esa carpeta prueba tiene que formar parte del classpath.
Una clase se declara perteneciente aun determinado paquete usando la instrucción
package al principio del código (sin usar esta instrucción, la clase no se puede
compilar). Si se usa package tiene que ser la primera instrucción del programa Java:
//Clase perteneciente al paquete tema5 que está en ejemplos
package ejemplos.tema5;
Desarrollo
De aplicaciones
Java Con Netbeans
EJERCICIO GUIADO. JAVA: INTRODUCCIÓN A LA POO
La programación orientada a objetos es una nueva forma de entender la creación de programas. Esta
filosofía de programación se basa en el concepto de objeto.
Objeto
Un objeto posee unas características (ancho, alto, color, etc…) A las características de un objeto se
les llama propiedades.
En Java todo son objetos. Veamos algunos ejemplos de uso de objetos en Java:
Ejemplo 1
Supongamos que tenemos una etiqueta llamada etiTexto. Esta etiqueta es un objeto.
Como objeto que es, la etiqueta etiTexto tiene una serie de características, como por ejemplo: el color
de fondo, el tamaño, la posición que ocupa en la ventana, el ser opaca o no, el ser invisible o no,
etc… Son las propiedades de la etiqueta.
A través de los métodos podemos por ejemplo cambiar las características del objeto. Por ejemplo, se
puede cambiar el tamaño y posición de la etiqueta usando el método setBounds:
etiTexto.setBounds(10,20,100,20);
Normalmente, los métodos que permiten cambiar las características del objeto son métodos cuyo
nombre empieza por set.
Los métodos también permiten pedirle al objeto que me de información. Por ejemplo, podríamos usar
el conocido método getText para recoger el texto que contenga la etiqueta y almacenarlo en una
variable:
String texto;
texto = etiTexto.getText();
Los métodos que le piden información al objeto suelen tener un nombre que empieza por get.
Los métodos también sirven para ordenarle al objeto que haga cosas. Por ejemplo, podemos ordenar
a la etiqueta etiTexto que se vuelva a pintar en la ventana usando el método repaint:
etiTexto.repaint();
F d ió Códi Lib D i i
Ejemplo 2
Supongamos que tenemos un cuadro de texto llamado txtCuadro. Como todo en Java, un cuadro de
texto es un objeto.
Un objeto tiene propiedades, es decir, características. Nuestro cuadro de texto txtCuadro tiene
características propias: un color de fondo, un ancho, un alto, una posición en la ventana, el estar
activado o no, el estar visible o no, etc…
A un objeto se le puede dar órdenes, llamadas métodos. Estas órdenes nos permiten cambiar las
características del objeto, pedirle información, o simplemente pedirle al objeto que haga algo.
Por ejemplo, podemos cambiar el color de fondo del cuadro de texto txtCuadro usando el método
llamado setBackground:
txtCuadro.setBackground(Color.RED);
Otros métodos que permiten cambiar las propiedades del objeto txtCuadro son:
Un objeto nos da información sobre él. Para pedirle información a un objeto usaremos métodos del
tipo get. Por ejemplo, para pedirle al cuadro de texto el texto que contiene, usaremos el método
getText:
También se le puede dar al objeto simplemente órdenes para que haga algo. Por ejemplo, podemos
ordenar al cuadro de texto txtCuadro que seleccione todo el texto que contiene en su interior a través
del método selectAll:
txtCuadro.selectAll();
F d ió Códi Lib D i i
Clase
Todo objeto es de una “clase” determinada, o dicho de otra forma, tiene un “tipo de datos”
determinado.
Por ejemplo, las etiquetas que se usan en las ventanas son objetos que pertenecen a la clase JLabel.
Los cuadros de texto en cambio son objetos de la clase JTextField.
Declarar un Objeto
Clase nombreobjeto;
Por ejemplo, para declarar la etiqueta del ejemplo 1, se usaría el siguiente código:
JLabel etiTexto;
Para declarar, en cambio, el cuadro de texto del ejemplo 2, se usaría el siguiente código:
JTextField txtCuadro;
Construir un Objeto
Es necesario construir el objeto para poder usarlo. La construcción del objeto se hace a través del
siguiente código general:
NOTA. En algunos casos, la sintaxis de la declaración y la construcción se une en una sola línea. Por
ejemplo, supongamos que queremos declarar la etiqueta etiTexto y construirla todo en una línea,
entonces se puede hacer lo siguiente:
En general, para declarar y construir un objeto en una sola línea se sigue la siguiente sintaxis:
F d ió Códi Lib D i i
La Clase como generadora de objetos
Conociendo la Clase, se pueden crear tantos objetos de dicha Clase como se quiera. Es decir, la
Clase de un objeto funciona como si fuera una plantilla a partir de la cual fabricamos objetos iguales.
Todos los objetos creados a partir de una clase son iguales en un primer momento (cuando se
construyen) aunque luego el programador puede dar forma a cada objeto cambiando sus
propiedades.
Por ejemplo, la Clase JLabel define etiquetas. Esto quiere decir que podemos crear muchas etiquetas
usando esta clase:
En el ejemplo se han declarado y construido tres etiquetas llamadas etiTexto, etiResultado y etiDato.
Las tres etiquetas en este momento son iguales, pero a través de los distintos métodos podemos dar
forma a cada una:
etiTexto.setBackground(Color.RED);
etiTexto.setText(“Hola”);
etiResultado.setBackground(Color.GREEN);
etiResultado.setText(“Error”);
etiDato.setBackground(Color.BLUE);
etiDato.setText(“Cadena”);
EJERCICIO
Hasta ahora ha usado objetos aunque no tenga mucha conciencia de ello. Por ejemplo ha usado
botones. Como ejercicio se propone lo siguiente:
- ¿Cuál es el nombre de la clase de los botones normales que usa en sus ventanas?
- ¿Cómo declararía un botón llamado btnAceptar, y otro llamado btnCancelar?
- ¿Cómo construiría dichos botones?
- Indique algunos métodos para cambiar propiedades de dichos botones (métodos set)
- Indique algunos métodos para pedirle información a dichos botones (métodos get)
- Indique algún método para dar órdenes a dichos botones (algún método que no sea ni set ni
get)
F d ió Códi Lib D i i
CONCLUSIÓN
Por otro lado, al objeto se le pueden dar órdenes que cumplirá de inmediato. A
dichas órdenes se les denomina MÉTODOS.
Declaración:
CLASE nombreobjeto;
Construcción:
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: POO. CLASES PROPIAS
Hasta el momento, todos los objetos que ha usado a la hora de programar en Java, han sido objetos
incluidos en el propio lenguaje, que se encuentran disponibles para que el programador los use en
sus programas.
Estos objetos son: las etiquetas (JLabel), botones (JButton), los cuadros de texto
(JTextField), cuadros de verificación (JCheckBox), botones de opción (JRadioButton),
colores (Color), imágenes de icono (ImageIcon), modelos de lista (DefaultListModel),
etc, etc.
Todos estos objetos, por supuesto, pertenecen cada uno de ellos a una Clase:
Las etiquetas son objetos de la clase JLabel, los botones son objetos de la clase
JButton, etc.
Todos estos objetos tienen propiedades que pueden ser cambiadas en la ventana de diseño:
Aunque también poseen métodos que nos permiten cambiar estas propiedades durante la ejecución
del programa:
setText cambia el texto del objeto, setBackground cambia el color de fondo del objeto,
setVisible hace visible o invisible al objeto, setBounds cambia el tamaño y la posición
del objeto, etc.
En cualquier momento le podemos pedir a un objeto que nos de información sobre sí mismo usando
los métodos get:
getText obtenemos el texto que tenga el objeto, getWidth obtenemos la anchura del
objeto, getHeight obtenemos la altura del objeto, etc.
Los objetos son como “pequeños robots” a los que se les puede dar órdenes, usando los métodos que
tienen disponible.
Por ejemplo, le podemos decir a un objeto que se pinte de nuevo usando el método
repaint, podemos ordenarle a un cuadro de texto que coja el cursor, con el método
requestFocus, etc.
Todos estos objetos, con sus propiedades y métodos, nos facilitan la creación de nuestros programas.
Pero a medida que nos vamos introduciendo en el mundo de la programación y nos especializamos
en un tipo de programa en concreto, puede ser necesaria la creación de objetos propios, programados
por nosotros mismos, de forma que puedan ser usados en nuestros futuros programas.
F d ió Códi Lib D i i
Objetos propios
A la hora de diseñar un objeto de creación propia, tendremos que pensar qué propiedades debe tener
dicho objeto, y métodos serán necesarios para poder trabajar con él. Dicho de otra forma, debemos
pensar en qué características debe tener el objeto y qué órdenes le podré dar.
Para crear objetos propios hay que programar la Clase del objeto. Una vez programada la Clase, ya
podremos generar objetos de dicha clase, declarándolos y construyéndolos como si de cualquier otro
objeto se tratara.
A continuación se propondrá un caso práctico de creación de objetos propios, con el que trabajaremos
en las próximas hojas.
F d ió Códi Lib D i i
CASO PRÁCTICO: MULTICINES AVENIDA
Planteamiento
Los Multicines Avenida nos encargan un programa para facilitar las distintas gestiones que se realizan
en dichos multicines.
El multicine cuenta con varias salas, y cada una de ellas genera una serie de información. Para
facilitar el control de la información de cada sala programaremos una Clase de objeto a la que
llamaremos SalaCine.
La Clase SalaCine
La Clase SalaCine definirá características de una sala de cine, y permitirá crear objetos que
representen salas de cine. Cuando la Clase SalaCine esté programada, se podrán hacer cosas como
las que sigue:
Los Multicines Avenida tienen una sala central donde se proyectan normalmente los estrenos. Se
podría crear un objeto llamado central de la clase SalaCine de la siguiente forma:
SalaCine central;
Por supuesto, este objeto puede ser construido como cualquier otro:
Otro ejemplo. Los Multicines Avenida tienen una sala donde proyectan versiones originales. Se podría
crear un objeto llamado salaVO de la clase SalaCine de la siguiente forma:
A la hora de decidir las propiedades de un objeto de creación propia, tenemos que preguntarnos,
¿qué información me interesa almacenar del objeto? Trasladando esta idea a nuestro caso práctico,
¿qué información me interesaría tener de cada sala de cine?
Para este ejemplo supondremos que de cada sala de cine nos interesa tener conocimiento de las
siguientes características (propiedades):
F d ió Códi Lib D i i
Valores por defecto de los objetos SalaCine
Cuando se construye un objeto, se asignan unos valores por defecto a sus propiedades. Por ejemplo,
cuando se construye una etiqueta (Clase JLabel), esta tiene un tamaño inicial definido, un color, etc.
Lo mismo se tiene que hacer con los objetos propios que definimos. Es necesario decidir qué valores
tendrá las propiedades del objeto al construirse.
En nuestro caso, las características de un objeto SalaCine en el momento de construirse serán las
siguientes:
Aforo: 100
Ocupadas: 0
Película: “” (la cadena vacía)
Entrada: 5,00
Observa este código, en él construimos el objeto correspondiente a la sala central del multicine:
SalaCine central;
En este momento (en el que el objeto central está recién construido) este objeto tiene asignado un
aforo de 100, el número de butacas ocupadas es 0, la película que se proyecta en la sala central es “”
y la entrada para esta sala es de 5 euros.
Los valores por defecto que se asignan a los objetos de una clase son valores arbitrarios que el
programador decidirá según su conveniencia.
Para comunicarnos con los objetos de la Clase SalaCine que construyamos, tendremos que disponer
de un conjunto de métodos que nos permitan asignar valores a las propiedades de los objetos,
recoger información de dichos objetos y que le den órdenes al objeto.
Será el programador el que decida qué métodos le interesará que posea los objetos de la Clase que
está programando.
Para nuestro caso particular, supondremos que los objetos de la Clase SalaCine deberán tener los
siguientes métodos:
Gracias a estos métodos podemos dar forma a un objeto SalaCine recién creado.
Por ejemplo, supongamos que queremos crear el objeto que representa la sala de versiones
originales. Resulta que esta sala tiene de aforo 50 localidades, que se está proyectando la película
“Metrópolis” y que la entrada para ver la película es de 3 euros. La sala está vacía de momento.
F d ió Códi Lib D i i
Para crear el objeto, se usaría el siguiente código:
Al construir el objeto salaVO tiene por defecto los valores siguientes en sus propiedades:
Aforo: 100
Ocupadas: 0
Película: “”
Entrada: 5,00
Aforo: 50
Ocupadas: 0
Película: “Metrópolis”
Entrada: 3,00
Estos métodos nos permitirán obtener información de un objeto del tipo SalaCine. Por ejemplo,
supongamos que tenemos el objeto llamado central (correspondiente a la sala principal del multicine),
para obtener la película que se está proyectando en dicha sala solo habría que usar este código:
O, por ejemplo, para saber los ingresos producidos por la sala central…
double ingresos;
ingresos = central.getIngresos();
Se programarán los siguientes métodos para dar órdenes a los objetos de la clase SalaCine.
F d ió Códi Lib D i i
vaciar
- Este método le dice al objeto que ha entrado una nueva persona en la sala. (Esto debe
producir que el número de plazas ocupadas aumente en uno)
RESUMEN SALACINE
Aforo: 100
Ocupadas: 0
Película: (cadena vacía)
Entrada: 5
Métodos de orden
F d ió Códi Lib D i i
F d ió Códi Lib D i i
EJERCICIO PRÁCTICO
Supongamos que programamos una Clase de objetos llamada Rectangulo, la cual permitirá construir
objetos que representen a rectángulos.
- Supongamos que las propiedades de los objetos de la clase Rectangulo sean las siguientes:
o Base (double)
o Altura (double)
¿Qué métodos de tipo set programaría para cambiar las propiedades de los objetos del tipo
Rectangulo?
- Como ejemplo de los métodos anteriores, suponga que quiere asignar al objeto suelo una
base de 30 y una altura de 50. ¿Qué código usaría?
- Teniendo en cuenta que nos puede interesar conocer el área de un objeto Rectangulo y su
perímetro, y teniendo en cuenta que los objetos Rectangulo tienen dos propiedades (Base y
Altura), ¿qué cuatro métodos get serían interesantes de programar para los objetos del tipo
Rectangulo?
- Teniendo en cuenta los métodos del punto 4. Supongamos que quiero almacenar en una
variable double llamada area el área del objeto suelo. ¿Qué código usaría? Y si quiero
almacenar el perímetro del objeto suelo en una variable llamada peri?
CONCLUSIÓN
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: POO. PROGRAMACIÓN DE UNA CLASE
En este ejercicio guiado, crearemos la Clase SalaCine, que hemos descrito en la hoja anterior. Luego,
a partir de esta clase, fabricaremos objetos representando salas de cine, y los usaremos en un
proyecto Java.
Recuerda las características que hemos decidido para la Clase SalaCine en la hoja anterior:
CLASE SALACINE
Aforo: 100
Ocupadas: 0
Película: (cadena vacía)
Entrada: 5
Métodos de orden
F d ió Códi Lib D i i
PROGRAMACIÓN DE UNA CLASE
Fichero de la Clase
Por ejemplo, si queremos programar la clase SalaCine, esto se debe hacer en un fichero llamado:
SalaCine.java
Cuando programemos esta clase dentro de NetBeans, veremos las facilidades que nos proporciona
este para la creación de la clase. De momento, solo veremos de forma teórica como hay que
programar la clase. (No tiene que introducir lo que viene a continuación en ningún sitio)
La programación de una clase comienza siempre con una línea de código como la que sigue:
Propiedades de la Clase
Lo primero que se debe introducir en la clase que se está programando son las propiedades. Las
propiedades de una clase son básicamente variables globales de ésta. Si introducimos las
propiedades de la clase SalaCine, esta nos quedaría así:
int Aforo;
int Ocupadas;
String Película;
double Entrada;
Constructor de la Clase
Cuando se planteó la clase SalaCine, se tuvo que decidir qué valores iniciales deberían tener las
propiedades de la clase. Para asignar estos valores iniciales, es necesario programar lo que se
denomina el Constructor.
F d ió Códi Lib D i i
El Constructor de una clase es un método (un procedimiento para entendernos) un poco especial, ya
que debe tener el mismo nombre de la clase y no devuelve nada, pero no lleva la palabra void. Dentro
del constructor se inicializan las propiedades de la clase.
public NombreDeLaClase() {
propiedad1 = valor;
propiedad2 = valor;
etc…
}
int Aforo;
int Ocupadas;
String Película;
double Entrada;
//Constructor
public SalaCine() {
Aforo = 100;
Ocupadas = 0; Constructor
Pelicula = “”;
Entrada = 5.0;
}
Observa como usamos el constructor de la clase SalaCine para asignar a cada propiedad los valores
por defecto decididos en el diseño de la clase que se hizo en la hoja anterior.
Todas las clases suelen contener métodos del tipo set. Recuerda que estos métodos permiten asignar
valores a las propiedades de la clase.
Debes tener en cuenta también que cuando se habla de método de una clase, en realidad se está
hablando de un procedimiento o función, que puede recibir como parámetro determinadas variables y
que puede devolver valores.
Los métodos del tipo set son básicamente procedimientos que reciben valores como parámetros que
introducimos en las propiedades. Estos métodos no devuelven nada, así que son void.
Se recomienda, que el parámetro del procedimiento se llame de forma distinta a la propiedad que se
asigna.
Aforo = afo;
F d ió Códi Lib D i i
Observa este método:
1. Es void, es decir, no devuelve nada (el significado de la palabra public se verá más adelante)
2. El método recibe como parámetro una variable del mismo tipo que la propiedad que
queremos modificar (en este caso int) y un nombre que se recomienda que no sea igual al de
la propiedad (en nuestro caso, afo, de aforo)
3. Puedes observar que lo que se hace simplemente en el método es asignar la variable pasada
como parámetro a la propiedad.
La mayoría de los procedimientos set usados para introducir valores en las propiedades tienen la
misma forma. Aquí tienes la programación de los demás procedimientos set de la clase SalaCine.
//Método setOcupadas
public void setOcupadas(int ocu) {
Ocupadas = ocu;
}
//Método setPelicula
public void setPelicula(String peli) {
Pelicula = peli;
}
//Método setEntrada
public void setEntrada(double entra) {
Entrada = entra;
}
Hay un método set de la clase SalaCine llamado setLibres cuya misión es asignar el número de
localidades libres del cine. Sin embargo la clase SalaCine no tiene una propiedad “Libres”. En
realidad, este método debe modificar el número de localidades ocupadas. Observa su programación:
//Método setLibres
public void setLibres(int lib) {
int ocu;
No se pensó en crear una propiedad de la clase llamada Libres ya que en todo momento se puede
saber cuantas localidades libres hay restando el Aforo menos las localidades Ocupadas.
F d ió Códi Lib D i i
public class SalaCine {
int Aforo;
int Ocupadas;
String Película;
double Entrada;
//Constructor
public SalaCine() {
Aforo = 100;
Ocupadas = 0;
Pelicula = “”;
Entrada = 5.0;
}
//Métodos set
//Método setAforo
public void setAforo(int afo) {
Aforo = afo;
}
//Método setOcupadas
public void setOcupadas(int ocu) {
Ocupadas = ocu;
}
//Método setPelicula
public void setPelicula(String peli) {
Pelicula = peli; Métodos Set
}
//Método setEntrada
public void setEntrada(double entra) {
Entrada = entra;
}
//Método setLibres
public void setLibres(int lib) {
int ocu;
Al igual que los métodos set, los métodos get son muy fáciles de programar ya que suelen tener
siempre la misma forma.
F d ió Códi Lib D i i
Veamos la programación del método getAforo:
//Método getAforo
public int getAforo() {
return Aforo;
}
Como puedes ver el método simplemente devuelve el valor de la propiedad Aforo. Como esta
propiedad es int, el método es int.
Los métodos que devuelven el resto de las propiedades son igual de sencillos de programar:
//Método getOcupadas
public int getOcupadas() {
return Ocupadas;
}
//Método getPelicula
public String getPelicula() {
return Película;
}
//Método getEntrada
public double getEntrada() {
return Entrada;
}
Todos estos métodos son iguales. Solo tienes que fijarte en el tipo de datos de la propiedad que
devuelven.
Existen otros métodos get que devuelven cálculos realizados con las propiedades. Estos métodos
realizan algún cálculo y luego devuelven el resultado. Observa el siguiente método get:
//Método getLibres
public int getLibres() {
int lib;
lib = Aforo – Ocupadas;
return lib;
}
No existe una propiedad Libres, por lo que este valor debe ser calculado a partir del Aforo y el número
de localidades Ocupadas. Para ello restamos y almacenamos el valor en una variable a la que hemos
llamado lib. Luego devolvemos dicha variable.
Los dos métodos get que quedan por programar de la clase SalaCine son parecidos:
//Método getPorcentaje
public double getPorcentaje() {
double por;
por = (double) Ocupadas / (double) Aforo * 100.0;
return por;
}
//Método getIngresos
public double getIngresos() {
double ingre;
F d ió Códi Lib D i i
ingre = Ocupadas * Entrada;
return ingre;
}
Los ingresos se calculan multiplicando el número de entradas por lo que vale una entrada.
La clase SalaCine una vez introducidos los métodos get quedaría de la siguiente forma:
int Aforo;
int Ocupadas;
String Película;
double Entrada;
//Constructor
public SalaCine() {
Aforo = 100;
Ocupadas = 0;
Pelicula = “”;
Entrada = 5.0;
}
//Métodos set
//Método setAforo
public void setAforo(int afo) {
Aforo = afo;
}
//Método setOcupadas
public void setOcupadas(int ocu) {
Ocupadas = ocu;
}
//Método setPelicula
public void setPelicula(String peli) {
Pelicula = peli;
}
//Método setEntrada
public void setEntrada(double entra) {
Entrada = entra;
}
//Método setLibres
public void setLibres(int lib) {
int ocu;
//Métodos get
//Método getAforo
public int getAforo() {
return Aforo; Métodos Get
F d ió Códi Lib D i i
}
//Método getOcupadas
public int getOcupadas() {
return Ocupadas;
}
//Método getPelicula
public String getPelicula() {
return Película;
}
//Método getEntrada
public double getEntrada() {
return Entrada;
} Métodos Get
//Método getLibres
public int getLibres() {
int lib;
lib = Aforo – Ocupadas;
return lib;
}
//Método getPorcentaje
public double getPorcentaje() {
double por;
por = (double) Ocupadas / (double) Aforo * 100.0;
return por;
}
//Método getIngresos
public double getIngresos() {
double ingre;
ingre = Ocupadas * Entrada;
return ingre;
}
Métodos de orden
Para finalizar la programación de la clase SalaCine, se programarán los dos métodos de orden que
hemos indicado en el planteamiento de la clase. Estos métodos suelen realizar alguna tarea que
involucra a las propiedades de la clase, modificándola internamente. No suelen devolver ningún valor,
aunque pueden recibir parámetros.
F d ió Códi Lib D i i
Veamos la programación del método Vaciar, cuyo objetivo es vaciar la sala y quitar la película en
proyección:
//Método Vaciar
public void Vaciar() {
Ocupadas = 0;
Película = “”;
}
Como se puede observar, es un método muy sencillo, ya que simplemente cambia algunas
propiedades de la clase.
El método entraUno es también muy sencillo de programar. Este método le indica al objeto que ha
entrado un nuevo espectador. Sabiendo esto, el objeto debe aumentar en uno el número de
localidades ocupadas:
//Método entraUno
public void entraUno() {
Ocupadas++;
}
Añadiendo estos dos últimos métodos, la programación de la clase SalaCine quedaría finalmente
como sigue:
public class SalaCine {
int Aforo;
int Ocupadas;
String Película; Propiedades (variables globales)
double Entrada;
//Constructor
public SalaCine() {
Aforo = 100;
Ocupadas = 0; Constructor
Pelicula = “”;
Entrada = 5.0;
}
//Métodos set
//Método setAforo
public void setAforo(int afo) {
Aforo = afo;
}
//Método setOcupadas
public void setOcupadas(int ocu) {
Ocupadas = ocu;
}
//Método setPelicula
public void setPelicula(String peli) {
Pelicula = peli; Métodos Set
}
//Método setEntrada
public void setEntrada(double entra) {
Entrada = entra;
}
F d ió Códi Lib D i i
//Método setLibres
public void setLibres(int lib) {
int ocu;
F d ió Códi Lib D i i
//Métodos get
//Método getAforo
public int getAforo() {
return Aforo;
}
//Método getOcupadas
public int getOcupadas() {
Métodos Get
return Ocupadas;
}
//Método getPelicula
public String getPelicula() {
return Película;
}
//Método getEntrada
public double getEntrada() {
return Entrada;
}
//Método getLibres
public int getLibres() {
int lib;
lib = Aforo – Ocupadas;
return lib;
}
//Método getPorcentaje
public double getPorcentaje() {
double por;
por = (double) Ocupadas / (double) Aforo * 100.0;
return por;
}
//Método getIngresos
public double getIngresos() {
double ingre;
ingre = Ocupadas * Entrada;
return ingre;
}
//Métodos de orden
//Método Vaciar
public void Vaciar() {
Ocupadas = 0;
Película = “”; Métodos de orden y otros
} métodos.
//Método entraUno
public void entraUno() {
Ocupadas++;
}
F d ió Códi Lib D i i
}
F d ió Códi Lib D i i
EJERCICIOS RECOMENDADOS
Supongamos que tenemos una clase llamada Rectangulo que nos permitirá generar objetos de tipo
rectángulo.
CLASE RECTANGULO
Base (double)
Altura (double)
Base – 100
Altura – 50
Métodos:
Métodos set:
Métodos get:
Otros métodos:
Cuadrar – este método debe hacer que la Altura tenga el valor de la Base.
SE PIDE:
Realiza (en papel) la programación de la clase Rectangulo a partir del planteamiento anterior.
F d ió Códi Lib D i i
CONCLUSIÓN
Constructor
Métodos set
Métodos get
Los métodos set son void y reciben como parámetro un valor que se asigna a la
propiedad correspondiente.
Los métodos de orden realizan alguna tarea específica y a veces modifican las
propiedades de la clase de alguna forma.
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: CUADROS DE VERIFICACIÓN
8. Añade también tres cuadros de verificación. Estos cuadros son objetos del
tipo JCheckBox.
F d ió Códi Lib D i i
12. El programa debe funcionar de la siguiente forma:
if (chkGato.isSelected()) {
mensaje=mensaje+"Gato ";
}
if (chkRaton.isSelected()) {
mensaje=mensaje+"Raton ";
}
etiResultado.setText(mensaje);
F d ió Códi Lib D i i
r. Lo mismo con la casilla chkRaton.
s. Finalmente presento la cadena mensaje en la etiqueta etiResultado.
21. Ejecute el programa. Seleccione por ejemplo las casillas Gato y Ratón. Al
pulsar Aceptar el resultado debe ser el siguiente:
CONCLUSIÓN
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: BOTONES DE OPCIÓN
26. Añade un panel. Un panel es una zona rectangular que puede contener elementos
(botones, etiquetas, etc) La forma de poner un panel es a través del objeto JPanel.
27. Una vez añadido el panel en el JFrame, le pondremos un borde para poder localizarlo
fácilmente. Debes hacer lo siguiente:
F d ió Códi Lib D i i
31. Tu ventana debe quedar más o menos así:
F d ió Códi Lib D i i
32. Ahora debes añadir tres botones de opción (botones de radio) dentro del panel. Estos
botones son objetos del tipo JRadioButton.
33. Añade tres JRadioButton y cambia el texto de ellos, de forma que aparezca “Rojo”,
“Verde” y “Azul”.
34. Debe cambiar el nombre de cada uno de ellos. Se llamarán: optRojo, optVerde,
optAzul.
36. Si ejecuta el programa, observará que pueden seleccionarse varios colores a la vez.
Esto no es interesante, ya que los botones de opción se usan para activar solo una
opción entre varias.
F d ió Códi Lib D i i
37. Hay que hacer que solo un botón de opción pueda estar seleccionado a la vez. Para
ello, debe añadir un nuevo objeto. Realice los siguientes pasos:
ll. Añada un objeto del tipo ButtonGroup al formulario. ¡Atención! Este objeto es
invisible, y no se verá en el formulario, sin embargo, lo podréis ver en el
Inspector, en la parte de “Otros Componentes”:
F d ió Códi Lib D i i
pp. Haz lo mismo con los botones optVerde y optAzul.
43. Acabas de asociar los tres botones de opción a un mismo grupo. Esto produce que
solo una de las tres opciones pueda estar activada. Pruébelo ejecutando el
programa.
44. Ahora interesa que la opción “Rojo” salga activada desde el principio. Una forma de
hacer esto es programando en el “Constructor” lo siguiente:
optRojo.setSelected(true);
45. El programa no está terminado aún. Interesa que cuando el usuario pulse el botón
Aceptar, en la etiqueta aparezca el color elegido. Para ello, en el actionPerformed del
botón Aceptar programe lo siguiente:
if (optRojo.isSelected()) {
mensaje=mensaje+"Rojo";
} else if (optVerde.isSelected()) {
mensaje=mensaje+"Verde";
} else if (optAzul.isSelected()) {
mensaje=mensaje+"Azul";
}
F d ió Códi Lib D i i
etiResultado.setText(mensaje);
52. Ejecute el programa. Seleccione por ejemplo la Verde. Al pulsar Aceptar el resultado
debe ser el siguiente:
CONCLUSIÓN
Es totalmente necesario añadir un objeto del tipo ButtonGroup, y hacer que los
botones de radio pertenezcan a dicho grupo. En caso contrario, será posible activar
varios botones de opción a la vez.
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: CUADROS DE LISTA
57. Añade un cuadro de lista. Los cuadros de listas son objetos JList.
58. Cámbiale el nombre al JList. Ten cuidado, ya que en los JList aparecen siempre
dentro de otro objeto llamado jScrollPane. Si miras en el Inspector, verás que al
pulsar en el botón + del jScrollPane aparecerá tu JList:
F d ió Códi Lib D i i
59. Aprovecha para cambiarle el nombre al JList. El nuevo nombre será lstColores.
60. Si te fijas en el JList, consiste en un cuadro que contiene una serie de Items. Estos
elementos pueden ser cambiados a través de la propiedad Model del JList.
61. Busca la propiedad Model y haz clic en el botón de los tres puntos. Aparecerá un
cuadro de diálogo parecido al siguiente. Solo tienes que seleccionar los elementos
que quieras y pulsar el botón “Borrar” (Remove) para eliminarlos de la lista.
F d ió Códi Lib D i i
63. Debes hacer que la lista sea la siguiente:
Rojo
Verde
Azul
String mensaje;
F d ió Códi Lib D i i
rrr. De esta manera puedes extraer el elemento seleccionado de un cuadro de
lista.
sss. Luego simplemente ponemos la cadena mensaje dentro de la etiqueta.
73. Vamos a mejorar el programa. Puede suceder que el usuario no seleccione ningún
valor del cuadro de lista, y sería interesante en este caso que el programa avisara de
ello. Cambie el código del botón Aceptar por este otro código:
String mensaje;
if (lstColores.getSelectedIndex()==-1) {
mensaje="No hay un color seleccionado.";
} else {
mensaje="El color seleccionado es: "+lstColores.getSelectedValue().toString();
}
etiResultado.setText(mensaje);
F d ió Códi Lib D i i
79. Si ejecuta el programa y pulsa el botón Aceptar sin seleccionar nada el resultado
debería ser el siguiente:
80. Se podría haber prescindido del botón aceptar si el código anterior se hubiera puesto
en el evento mouseClicked del cuadro de lista en vez de en el actionPerformed del
botón Aceptar. En este caso, cada vez que se seleccionara un elemento de la lista,
automáticamente aparecería el mensaje en la etiqueta.
CONCLUSIÓN
El objeto JList permite crear cuadros de lista. Estos objetos contienen una serie de
elementos que pueden ser seleccionados.
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: CUADROS COMBINADOS
84. Añade un cuadro combinado (combo). Los cuadros combinados son objetos del tipo
JComboBox. Básicamente, un combo es una lista desplegable.
86. Los elementos del cboColores pueden ser cambiados a través de la propiedad
Model. Selecciona el combo y activa la propiedad Model (el botoncito con los tres
puntos) Aparecerá lo siguiente:
F d ió Códi Lib D i i
87. Al igual que pasaba con los cuadros de lista, se pueden eliminar los elementos que
contiene el combo y añadir elementos propios. Use los botones Añadir y Eliminar
para añadir la siguiente lista de elementos:
Rojo
Verde
Azul
F d ió Códi Lib D i i
89. Vamos a hacer que cuando se elija un elemento del desplegable, en la etiqueta
aparezca un mensaje indicando el color elegido.
Para ello, debes programar el evento actionPerformed del combo y añadir el siguiente
código:
mensaje=mensaje+cboColores.getSelectedItem().toString();
etiResultado.setText(mensaje);
96. Los cuadros combinados pueden funcionar también como cuadros de texto. Es decir,
pueden permitir que se escriba texto dentro de ellos. Para hacer esto, basta con
cambiar su propiedad “editable” y activarla.
F d ió Códi Lib D i i
97. Ejecuta el programa y observa como se puede escribir dentro del combo. Al pulsar
Enter, el programa funciona igualmente con el texto escrito.
Se escribe aquí y
se pulsa enter
CONCLUSIÓN
Los combos son listas desplegables donde se puede elegir una de las opciones
propuestas.
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: TOGGLEBUTTONS
99. Crearás una ventana como la que sigue teniendo en cuenta lo siguiente:
aaaaa. Añade finalmente tres etiquetas conteniendo los números 40, 200, 200.
La primera se llamará etiPrecioInstalacion, la segunda etiPrecioFormacion y la
tercera etiPrecioAlimentacionBD.
F d ió Códi Lib D i i
Observa como al pulsar los
JToggledButton estos se quedan
pulsados.
El precio de los Extras dependerá de las opciones elegidas por el usuario. Por
ejemplo, si el usuario quiere Instalación y Formación, los extras costarán 240
euros.
F d ió Códi Lib D i i
double precio_base;
double precio_instal; //precio instalación
double precio_for; //precio formacion
double precio_ali; //precio alimentacion
precio_base = Double.parseDouble(txtPrecioBase.getText());
precio_instal = Double.parseDouble(etiPrecioInstalacion.getText());
precio_for = Double.parseDouble(etiPrecioFormacion.getText());
precio_ali = Double.parseDouble(etiPrecioAlimentacionBD.getText());
double precio_total;
precio_total = precio_base;
lllll. Primero se crean variables doubles (ya que se admitirán decimales) para
poder hacer los cálculos.
precio_base = Double.parseDouble(txtPrecioBase.getText());
precio_instal = Double.parseDouble(etiPrecioInstalacion.getText());
precio_for = Double.parseDouble(etiPrecioFormacion.getText());
precio_ali = Double.parseDouble(etiPrecioAlimentacionBD.getText());
nnnnn. Una vez obtenidos los datos en forma numérica, ya se pueden hacer
cálculos con ellos. El programa declara una nueva variable precio_total donde
se introducirá el resultado. En primer lugar se introduce en esta variable el
precio base.
double precio_total;
precio_total = precio_base;
F d ió Códi Lib D i i
ooooo. A continuación se le suma al precio_total los precios de los extras si el
botón correspondiente está seleccionado. Esto se hace a través de if. Por
ejemplo, para sumar el extra por instalación:
Esto significa: “Si el botón instalación está seleccionado, añade al precio total
el precio por instalación”
tbtnInstalacion.setSelected(true);
F d ió Códi Lib D i i
Comprueba esto ejecutando el programa.
CONCLUSIÓN
Realmente, estos botones no suelen ser muy usados, ya que pueden ser sustituidos
por Cuadros de Verificación (JCheckBox) que son más conocidos.
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: SLIDERS
Estos elementos tienen un pequeño recuadro que se puede arrastrar a derecha o izquierda.
Según la posición del recuadro, el JSlider tendrá un valor concreto.
El JSlider se puede configurar para que muestre los distintos valores que puede tomar:
También se puede configurar de forma que los valores mínimo y máximo sean distintos:
El valor que tiene un JSlider es el valor al que apunta el recuadro del JSlider. En la imagen
anterior, el JSlider tiene un valor de 85.
Ejercicio guiado
F d ió Códi Lib D i i
- Añade una etiqueta con borde. Su nombre será etiValor.
- Un JSlider tiene un valor mínimo y un valor máximo. El valor mínimo es el valor que
tiene cuando el recuadro está pegado a la parte izquierda, mientras que el valor
máximo es el valor que tiene cuando el recuadro está pegado a la parte derecha.
El valor mínimo y máximo del JSlider se puede cambiar. Busca las propiedades
maximum y minimum del JSlider y asigna los siguientes valores:
Máximo: 500
Mínimo: 100
F d ió Códi Lib D i i
- Se puede asignar un valor inicial al JSlider a través de su propiedad value. Busque
esta propiedad y asigne un valor de 400. Observe donde se sitúa el recuadro del
JSlider.
- Esto, en realidad, no produce ningún cambio en el JSlider. Para que las divisiones se
vean, es necesario que active también la propiedad paintTicks. Esta propiedad
pintará divisiones en el JSlider:
Medidas cada 50
unidades
- Aún se puede mejorar la presentación del JSlider, si hacemos que aparezca el valor
de cada división. Para ello debes activar la propiedad paintLabel.
F d ió Códi Lib D i i
- Ejecuta el programa para ver el funcionamiento del Deslizador y su aspecto. Debe
ser parecido al siguiente:
Movemos aquí.
Y aparece el valor
correspondiente aquí.
F d ió Códi Lib D i i
- A continuación se mencionan otras propiedades interesantes de los JSlider que
puedes probar por tu cuenta:
orientation
Permite cambiar la orientación del JSlider. Podrías por ejemplo hacer que el JSlider
estuviera en vertical.
minorTickSpacing
Permite asignar subdivisiones a las divisiones ya asignadas. Prueba por ejemplo a
asignar un 10 a esta propiedad y ejecuta el programa. Observa las divisiones del
JSlider.
snapToTicks
Cuando esta propiedad está activada, no podrás colocar el deslizador entre dos
divisiones. Es decir, el deslizador siempre estará situado sobre una de las divisiones.
Prueba a activarla.
paintTrack
Esta propiedad permite pintar o no la línea sobre la que se desliza el JSlider. Prueba
a desactivarla.
CONCLUSIÓN
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: SPINNER
Son elementos muy comunes en los programas. A través de los dos botones triangulares se
puede hacer que el valor del cuadro aumente o disminuya. También se puede escribir
directamente un valor dentro del cuadro.
Ejercicio guiado
- Interesa que cuando cambie el JSpinner (ya sea porque se pulsaron los botones
triangulares o porque se escribió dentro) aparezca el valor correspondiente dentro de
la etiqueta. Para ello, tendrá que programar el evento stateChanged del JSpinner.
F d ió Códi Lib D i i
etiValor.setText("El valor es: "+spiValor.getValue().toString());
- Como puedes observar, lo que hace el programa es recoger el valor que tiene el
JSpinner a través del método getValue y luego se lo asigna a la etiqueta con el
clásico setText. (Es muy parecido a los deslizadores)
Debes tener en cuenta que el valor devuelto no es un número ni una cadena, así que
en el ejemplo se ha usado el método toString() para convertirlo a una cadena.
El usuario modifica el
valor del JSpinner...
- Observa como los valores del JSpinner aumentan o disminuyen en 1. Por otro lado,
no parece haber un límite para los valores del JSpinner.
La pregunta ahora es: ¿Se puede modificar el contenido del JSpinner de forma que
tenga unos valores concretos? La respuesta es sí. Veamos como hacerlo.
- Entra dentro del código del programa y, dentro del constructor, añade este código
debajo de initComponents:
o El JSpinner, al igual que los JList y los JComboBox, es un objeto que contiene
otro objeto “modelo”, y es el objeto “modelo” el que contiene los números
visualizados en el JSpinner.
F d ió Códi Lib D i i
o La primera línea crea un “modelo” llamado nm. Los modelos de los JSpinner
son del tipo SpinnerNumberModel. Necesitarás incluir el import
correspondiente (atento a la bombilla)
o En la segunda línea se define como valor máximo del modelo el 10, a través
de un método llamado setMaximum.
- Vamos a añadir otra mejora. Cambie el código del constructor por este otro. (Observa
que solo se ha añadido una línea):
nm.setStepSize(2);
Esta línea usa un método del modelo del JSpinner que permite definir el valor de
cambio del JSPinner. Dicho de otra forma, esta línea hace que los valores del
JSpinner salten de 2 en 2.
- Ejecuta el programa de nuevo y observa como cambian los valores del JSpinner.
- El modelo del JSpinner tiene también un método llamado setValue que permite
asignar un valor inicial al modelo. Pruebe a usar este método para hacer que el
JSpinner muestre desde el principio el valor 4.
F d ió Códi Lib D i i
CONCLUSIÓN
Los JSpinners son objetos con “modelo”. Es decir, este objeto contiene a su vez
otro objeto “modelo” que es el que realmente contiene los datos.
Para definir el contenido del JSpinner es necesario crear un modelo del tipo
SpinnerNumberModel. Se le asigna al modelo los números deseados, y finalmente
se une el modelo con el JSpinner.
El objeto modelo del JSpinner permite definir el valor mínimo y el valor máximo, así
como el intervalo de aumento de los valores.
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: SCROLLBARS
La barra tiene un valor mínimo, que se consigue haciendo que el recuadro de la barra de
desplazamiento esté pegado a la parte izquierda.
Valor mínimo
F d ió Códi Lib D i i
Ejercicio guiado
F d ió Códi Lib D i i
7. Como ves, se coloca en la etiqueta el valor de la barra. El valor de la barra se obtiene
con el método getValue. Ejecuta el programa para ver su funcionamiento.
F d ió Códi Lib D i i
5
F d ió Códi Lib D i i
9. Ejecuta ahora el programa y comprueba su funcionamiento:
Si llevas la barra de
desplazamiento al mínimo, su
valor será de 50, ya que se
configuró así con la propiedad
minimum…
F d ió Códi Lib D i i
10. Tal como se ha indicado anteriormente, pasa algo raro con la barra de
desplazamiento cuando esta está al máximo. Se esperaba que alcanzara el valor
150, y sin embargo, el valor máximo alcanzado fue de 145. La explicación es la
siguiente:
5 ***
** Sin embargo, el valor de la barra viene indicado por el lado izquierdo del recuadro
interno.
Es decir,
CONCLUSIÓN
F d ió Códi Lib D i i
- Incremento unitario (propiedad UnitIncrement)
- Incremento en bloque (propiedad BlockIncrement)
- Tamaño del recuadro de la barra (propiedad VisibleAmount)
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: BARRA DE MENUS
Barras de Menús
La barra de menús nos permitirá acceder a las opciones más importantes del programa.
Todo programa de gran envergadura suele tener una barra de menús.
Ejercicio guiado
12. Veamos como añadir una barra de menús a nuestras aplicaciones. En primer lugar,
crea un proyecto con el NetBeans.
F d ió Códi Lib D i i
18. Ahora, la única opción de la barra de menús muestra el texto “Menu”. Esto se puede
cambiar seleccionándola y cambiando su propiedad text. Asígnale el texto “Archivo” a
la opción del menú:
20. Puedes añadir más opciones principales a la barra de menús haciendo clic con el
derecho sobre el objeto de la barra de menús y activando la opción “Añadir JMenu”.
21. Añada dos opciones más a la barra de menús. El inspector debe tener ahora el
siguiente aspecto:
F d ió Códi Lib D i i
22. Y la barra de menús presentará este otro aspecto:
23. Cambia los nombres de las dos nuevas opciones. Sus nombres serán: menuEdicion
y menuInsertar.
24. Cambia los textos de ambas opciones. Sus textos serán: “Edición” e “Insertar”.
25. Ya tenemos creada la barra de menús (JMenuBar) con sus opciones principales
(JMenu). Ahora se tendrán que definir las opciones contenidas en cada opción
principal. Por ejemplo, crearemos las opciones contenidas en el menú Archivo.
26. Haz clic con el botón derecho sobre el objeto menuArchivo y activa la opción “Añadir
– JMenuItem”.
F d ió Códi Lib D i i
Los JMenuItem son objetos que representan las opciones contenidas en los menús
desplegables de la barra de menús.
27. Añade un JMenuItem más al menuArchivo y luego cambia el nombre a ambos. Sus
nombres serán menuItemAbrir y menuItemGuardar. El aspecto del Inspector será el
siguiente:
28. Usa ahora la propiedad Text de ambos JMenuItem para asignarles un texto. El
primero tendrá el texto “Abrir” y el segundo el texto “Guardar”.
29. Ya podemos ejecutar el programa para ver que es lo que se ha conseguido. Use el
menú:
30. Seguiremos añadiendo elementos al menú. Ahora haga clic con el derecho sobre el
elemento menuArchivo y añada un JSeparator.
F d ió Códi Lib D i i
Los JSeparator son objetos que definen una separación entre las opciones de un menú.
Cámbiele el nombre y llámelo “separador1”:
31. Añada un nuevo JMenuItem al menú Archivo y ponle el nombre menuSalir. El texto
de esta opción será “Salir” (use su propiedad text) El aspecto del Inspector será el
siguiente:
F d ió Códi Lib D i i
Sin embargo, un JMenu puede contener a otros JMenu, que a su vez contendrán
varios JMenuItem. Usando el botón derecho del ratón y la opción “Añadir”, añade un
JMenu dentro de menuEdicion:
35. Ahora añade dentro del menuColores tres JMenuItem llamados respectivamente:
menuItemRojo, menuItemVerde, menuItemAzul. Sus textos serán “Rojo”, “Verde” y
“Azul”.
F d ió Códi Lib D i i
36. Ejecuta el programa y observa como ha quedado el menú Edición:
La opción Edición (JMenu) contiene una opción Colores (JMenu) que a su vez
contiene las opciones Rojo, Verde y Azul (JMenuItems)
37. De nada sirve crear un menú si luego este no reacciona a las pulsaciones del ratón.
Cada objeto del menú tiene un evento ActionPerformed que permite programar lo que
debe suceder cuando se active dicha opción del menú.
this.getContentPane().setBackground(Color.RED);
F d ió Códi Lib D i i
CONCLUSIÓN
Las barras de menús son un conjunto de objetos de distinto tipo que se contienen
unos a los otros:
También puede añadir separadores (JSeparator) que permiten visualizar mejor las
opciones dentro de un menú.
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: BARRA DE HERRAMIENTAS
Barras de herramientas
A través de estos botones se pueden activar de forma rápida las opciones del programa, las
cuales suelen estar también incluidas dentro de la barra de menús.
Ejercicio guiado
41. Veamos como añadir una barra de herramientas a nuestras aplicaciones. En primer
lugar, crea un proyecto con el NetBeans.
44. Debajo de la barra de menús colocaremos una barra de herramientas, así que añade
un objeto del tipo JToolBar. Haz que la barra se coloque debajo de la barra de menús
y que alcance desde la parte izquierda de la ventana a la parte derecha.
F d ió Códi Lib D i i
45. Las barras de herramientas son simples contenedoras de objetos. Dentro de ellas se
pueden colocar botones, combos, etiquetas, etc.
Normalmente, las barras de herramientas contienen botones. Así que añade cuatro
botones (JButton) dentro de la barra. Solo tienes que colocarlos dentro de ella.
46. Puedes ver si los botones están bien colocados observando el Inspector: Observa
como los botones colocados se encuentran dentro de la barra.
F d ió Códi Lib D i i
47. Aprovecharemos el inspector para cambiar el nombre a la barra y a cada botón. A la
barra la llamaremos barraHerramientas, y a los botones los llamaremos btnUno,
btnDos, btnTres y btnCuatro:
48. Cambia el texto de los botones. Estos contendrán el texto: “Uno”, “Dos”, “Tres” y
“Cuatro”.
50. La forma de programar cada botón no varía, aunque estos se encuentren dentro de
la barra herramientas. Solo hay que seleccionar el botón y acceder a su evento
actionPerformed.
51. Solo como demostración de esto último, entra en el actionPerformed del primer botón
y programa esto:
F d ió Códi Lib D i i
52. Los botones de la barra de herramientas normalmente no contienen texto, sino que
contienen un icono que representa la función que realiza. La forma de colocar un
icono dentro de un botón es a través de su propiedad icon.
54. Activa la propiedad icon del primer botón. Luego elige la opción Fichero y pulsa el
botón Seleccionar Fichero para buscar un fichero con imagen.
Nota: Busca un fichero de imagen que sea del tipo .gif o .jpg.
55. Una vez colocadas las imágenes a los botones, se puede quitar el texto de estos. Un
ejemplo de cómo podría quedar la barra de herramientas es este:
F d ió Códi Lib D i i
CONCLUSIÓN
Lo normal es hacer que los botones de la barra no tengan texto y tengan iconos
asociados.
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: MENUS EMERGENTES
El evento mouseClicked
Este evento recibe como parámetro un objeto del tipo MouseEvent, y gracias a él se puede
conseguir información como la siguiente:
Se puede usar esta información para saber por ejemplo si se pulsó el botón derecho del
ratón, y sacar en este caso un menú contextual en pantalla.
Ejercicio guiado
58. Programaremos la pulsación del ratón sobre el formulario, así que haga clic sobre el
formulario y active el evento mouseClicked.
Este evento recibe como parámetro un objeto llamado evt del tipo MouseEvent (en
rojo en el código) que nos permite saber en qué condiciones se hizo clic.
if (evt.getButton()==1) {
JOptionPane.showMessageDialog(null,"Pulso el izquierdo");
} else if (evt.getButton()==2) {
JOptionPane.showMessageDialog(null,"Pulso el central");
} else if (evt.getButton()==3) {
JOptionPane.showMessageDialog(null,"Pulso el derecho");
}
F d ió Códi Lib D i i
61. Ejecuta el programa y haz clic sobre el formulario con el botón derecho, con el
izquierdo y con el central. Observa el resultado.
62. Ahora quizás puedas comprender el código anterior. En él, se usa el método
getButton del objeto evt para saber qué botón se pulsó. El método getButton
devuelve un entero que puede ser 1, 2 o 3 según el botón pulsado.
63. Se puede aprovechar el método getButton para controlar la pulsación del botón
derecho del ratón y así sacar un menú contextual. Pero antes, es necesario crear el
menú.
64. Agrega a tu formulario un objeto del tipo JPopupMenu. Estos objetos definen menús
emergentes.
67. Los menús emergentes se crean igual que las opciones de menús normales,
añadiendo con el botón derecho del ratón objetos JMenuItem.
68. Añada al menú emergente tres JMenuItem, y asígneles los siguientes nombres a
cada uno: menuRojo, menuVerde, menuAzul. El inspector debería tener el siguiente
aspecto:
69. Tienes que cambiar la propiedad text de cada opción del menú. Recuerda que esta
propiedad define lo que aparece en el menú. Asignarás los siguientes textos: “Rojo”,
“Verde” y “Azul”.
70. El menú emergente ya está construido. Ahora tenemos que hacer que aparezca
cuando el usuario pulse el botón derecho del ratón sobre el formulario. Para ello,
F d ió Códi Lib D i i
entraremos de nuevo en el evento mouseClicked del formulario y cambiaremos su
código por el siguiente:
menuEmergente.show(this,evt.getX(),evt.getY());
73. Para hacer que al pulsarse una opción suceda algo, solo hay que activar el método
actionPerformed del JMenuItem correspondiente. Por ejemplo, active el
actionPerformed del menuRojo y dentro programe lo siguiente:
F d ió Códi Lib D i i
this.getContentPane().setBackground(Color.RED);
74. Ejecuta el programa y comprueba lo que sucede al pulsar la opción Rojo del menú
contextual.
CONCLUSIÓN
Los menús contextuales son objetos del tipo JPopupMenu. Estos objetos contienen
JMenuItem al igual que las opciones de menú normales.
Tendrá que usar el método show del menú emergente para mostrar dicho menú.
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: FILECHOOSER
Las opciones Abrir y Guardar son opciones muy comunes en las aplicaciones. Estas
opciones permiten buscar en el árbol de carpetas del sistema un fichero en concreto y
abrirlo, o bien guardar una información dentro de un fichero en alguna carpeta.
Java proporciona una clase llamada JFileChooser (elegir fichero) que permite mostrar la
ventana típica de Abrir o Guardar:
(La ventana de guardar es la misma, solo que muestra en su barra de título la palabra
Guardar)
El objeto JFileChooser nos facilita la labor de elegir el fichero, pero no realiza la apertura o la
acción de guardar la información en él. Esto tendrá que ser programado.
F d ió Códi Lib D i i
Ejercicio guiado
F d ió Códi Lib D i i
Los objetos JFileChooser se añadirán el la zona de “Otros Componentes” del
inspector.
- Haz clic con el derecho sobre la zona de “otros componentes” y activa la opción
Agregar desde Paleta – Swing – JFileChooser:
F d ió Códi Lib D i i
- Una vez hecho esto, ya podemos programar la opción Abrir del menú. Activa el
evento actionPerformed de la opción “Abrir” y programa dentro de él lo siguiente:
int resp;
resp=elegirFichero.showOpenDialog(this);
if (resp==JFileChooser.APPROVE_OPTION) {
JOptionPane.showMessageDialog(null,elegirFichero.getSelectedFile(
).toString());
} else if (resp==JFileChooser.CANCEL_OPTION) {
- Ejecuta el código y prueba la opción “Abrir” del menú. Prueba a elegir algún fichero y
abrirlo. Prueba a cancelar la ventana de apertura. Etc
int resp;
resp=elegirFichero.showOpenDialog(this);
75. Estas dos líneas crean una variable entera resp (respuesta) y a continuación hacen
que se muestre la ventana “Abrir Fichero”. Observa que para conseguirlo hay que
usar el método showOpenDialog del objeto elegirFichero. Este método lleva como
parámetro la ventana actual (this)
76. El método showOpenDialog no solo muestra la ventana “Abrir Fichero” sino que
también devuelve un valor entero según el botón pulsado por el usuario en esta
ventana. Esto es: botón “Abrir” o botón “Calcelar”.
77. Se pueden usar dos if para controlar lo que sucede si el usuario pulsó el botón “Abrir”
o el botón “Calcelar” de la ventana “Abrir Fichero”:
if (resp==JFileChooser.APPROVE_OPTION) {
JOptionPane.showMessageDialog(null,elegirFichero.getSelectedFile(
).toString());
} else if (resp==JFileChooser.CANCEL_OPTION) {
F d ió Códi Lib D i i
80. En el caso de que el usuario pulsara “Abrir”, el programa usa el método
getSelectedFile del objeto elegirFichero para recoger el camino del fichero elegido.
Este camino debe ser convertido a cadena con el método toString.
81. El programa aprovecha esto para mostrar dicho camino en pantalla gracias al típico
JOptionPane.
82. En el caso del que el usuario pulsara el botón “Cancelar” el programa muestra un
mensaje indicándolo.
- Hay que volver a dejar claro que el cuadro de diálogo “Abrir” realmente no abre
ningún fichero, sino que devuelve el camino del fichero elegido usando el código:
elegirFichero.getSelectedFile().toString()
CONCLUSIÓN
Estos objetos no abren ni guardan ficheros, solo permiten al usuario elegir el fichero
a abrir o guardar de forma sencilla.
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: PANELES DE DESPLAZAMIENTO
Paneles de Desplazamiento
Por ejemplo, un panel de desplazamiento podría contener una imagen tan grande que no se
viera entera:
Ejercicio guiado 1
- Vamos a practicar con los JScrollPane. Para ello, crea un nuevo proyecto.
F d ió Códi Lib D i i
Observa como tienes un JScrollPane que contiene una etiqueta.
- Esta imagen es tan grande que no se podrá ver entera dentro del panel de
desplazamiento. Ejecuta el programa y observarás el uso de las barras de
desplazamiento dentro del panel.
F d ió Códi Lib D i i
- Puedes mejorar el programa si agrandas el panel de desplazamiento de forma que
ocupe todo el formulario:
Ejercicio guiado 2
Los JScrollPane no solo están diseñados para contener imágenes. Pueden contener
cualquier otro elemento. Vamos a ver, con otro proyecto de ejemplo, otro uso de los
JScrollPane.
F d ió Códi Lib D i i
3. Ahora añade dentro del JScrollPane un panel normal (JPanel). En la ventana no
notarás ninguna diferencia, pero en el Inspector debería aparecer esto:
6. Los JPanel son objetos contenedores. Es decir, pueden contener otros objetos como
por ejemplo botones, etiquetas, cuadros de texto, etc.
7. En la pantalla aparecerá únicamente el JPanel, para que puede ser diseñado aparte
de la ventana completa:
F d ió Códi Lib D i i
8. Para distinguirlo de lo que es en sí la ventana, haremos las siguientes cosas con el
panel:
F d ió Códi Lib D i i
Es muy interesante que observes el Inspector. En él podrás observar la distribución
de los objetos en la ventana. Podrás ver como el JFrame contiene un JScrollPane
(scpDatos) que a su vez contiene un JPanel (panelDatos) que a su vez contiene una
serie de etiquetas y cuadros de textos a los que aún no les hemos asignado un
nombre:
F d ió Códi Lib D i i
9. Haz doble clic sobre el JFrame (en el Inspector) para poder ver globalmente la
ventana. En la pantalla debería aparecer esto:
Como ves, el JPanel contenido en el JScrollPane es más grande que él, por lo que no
se podrá visualizar completamente. Será necesario usar las barras de
desplazamiento del JScrollPane.
F d ió Códi Lib D i i
CONCLUSIÓN
Los JScrollPane son ideales para mostrar imágenes, paneles y otros elementos cuyo
tamaño pueda ser mayor que la propia ventana.
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: VARIABLES GLOBALES
Una propiedad es una variable que puede ser accedida desde cualquier evento programado.
Esta variable se inicializa a un valor cuando se ejecuta el programa y los distintos eventos
pueden ir cambiando su valor según se necesite.
Ejercicio guiado 1
Clase Principal
- Se pretende hacer un pequeño programa que controle los coches que van entrando y
van saliendo de un parking. En todo momento el programa debe decir cuantos
coches hay dentro del parking. Para ello debes crear una ventana como la que sigue:
F d ió Códi Lib D i i
- Esta ventana contiene lo siguiente:
Esta variable contendrá en todo momento los coches que hay actualmente en el
Parking. Esta variable podrá ser usada desde cualquier evento.
- Para crear una variable global haz clic en el botón “Origen” para acceder al código:
- Luego busca, al comienzo del código una línea que comenzará por
public class
F d ió Códi Lib D i i
Seguida del nombre de tu clase principal “Parking”.
- Cuando el programa arranque, será necesario que la variable global coches tenga un
valor inicial. O dicho de otra forma, será necesario inicializar la variable. Para
inicializar la variable iremos al constructor. Añade lo siguiente al código:
Inicialización de la propiedad
coches.
F d ió Códi Lib D i i
Inicializamos a cero ya que se supone que cuando arranca el programa no hay
ningún coche dentro del parking.
- Ahora que ya tenemos declarada e inicializada la variable global coches, esta puede
ser usada sin problemas desde cualquier evento que programemos.
coches=coches+1;
etiCoches.setText(“”+coches);
Como ves, se le añade a la variable coches uno más y luego se coloca su valor
actual en la etiqueta.
if (coches>0) {
coches=coches-1;
etiCoches.setText(“”+coches);
}
Como ves, se accede igualmente a la propiedad coches pero esta vez para restarle
una unidad. Luego se muestra el valor actual de coches en la etiqueta
correspondiente.
F d ió Códi Lib D i i
Se usa un if para controlar que no pueda restarse un coche cuando el parking esté
vacío. (Si hay cero coches en el parking no se puede restar uno)
- Ejecuta el programa y prueba los dos botones. Observa como la cantidad de coches
del parking aumenta o disminuye.
Lo realmente interesante de esto es que desde dos eventos distintos (desde dos
botones) se puede usar la variable coches. Esto es así gracias a que ha sido creada
como variable global, o dicho de otro modo, ha sido creada como propiedad de la clase
Parking.
coches=0;
etiCoches.setText(“0”);
F d ió Códi Lib D i i
CONCLUSIÓN
Las variables globales, también llamadas propiedades de la clase, son variables que
pueden ser usadas desde cualquier evento del programa. Estas variables mantienen
su valor hasta que otro evento lo modifique.
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: CENTRALIZAR CÓDIGO
Es muy habitual en Java que varios eventos tengan que ejecutar el mismo código. En este
caso se plantea la necesidad de “copiar y pegar” ese código en los distintos eventos a
programar:
Evento 1 Código A
Evento 2 Código A
Evento 3 Código A
Esta es una mala forma de programación, ya que se necesitara modificar el código, sería
necesario realizar la modificación en cada copia del código. Es muy fácil que haya olvidos y
aparezcan errores en el programa que luego son muy difíciles de localizar.
Lo mejor es que el código que tenga que ser ejecutado desde distintos eventos aparezca
solo una vez, y sea llamado desde cada evento:
Evento 1
Evento 2 Código A
Evento 3
Veamos algunos ejemplos en los que el código se puede repetir y como evitar esta
repetición.
Ejercicio guiado 1
- Crea un nuevo proyecto en java que se llame ProyectoCalculos. Este proyecto tendrá
un paquete llamado PaqueteCalculos. Y dentro de él creará un JFrame llamado
VentanaCalculos. El proyecto tendrá el siguiente aspecto:
F d ió Códi Lib D i i
- La VentanaCalculos debe estar diseñada de la siguiente forma:
F d ió Códi Lib D i i
- El objetivo de programa es el siguiente:
- Este es un ejemplo en el que al activarse uno de varios eventos distintos se tiene que
ejecutar el mismo código. Observa el caso de la suma:
Calcular la suma y
Activar Calcular – Sumar en el menú mostrarla en la etiqueta
de resultado
F d ió Códi Lib D i i
- Para que el código esté “centralizado”, es decir, que aparezca solo una vez, será
necesario construir en la clase un método. Un método en java es el equivalente de
una función o procedimiento en C. Veamos como hacerlo:
- Un buen sitio para programar tus procedimientos puede ser debajo del constructor.
Puedes distinguir fácilmente al constructor porque tiene el mismo nombre que la
clase que estás programando, o dicho de otro modo, tiene el mismo nombre que la
ventana que estás programando: VentanaCalculos.
Este es el constructor
F d ió Códi Lib D i i
Este es el procedimiento
que tienes que introducir en
el programa.
void Sumar() {
....
}
Si estudias las líneas del código, verás que lo que hace es recoger el contenido de
los dos cuadros de texto en dos variables de cadena llamadas cad1 y cad2.
Luego convierte dichas cadenas en números que almacena en dos variables enteras
llamadas a y b.
- Hay que destacar que este código no pertenece ahora mismo a ningún evento en
concreto, por lo que no tiene efecto ninguno sobre el programa. Será necesario pues
asociar los eventos correspondientes con este procedimiento.
- Interesa que al pulsar el botón “Sumar” se ejecute la suma, así pues entre en el
evento actionPerformed del botón “Sumar” y añada la siguiente línea:
Sumar();
- Como también interesa que al pulsar la opción del menú “Calcular-Sumar” se ejecute
la suma, entre en el evento actionPerformed de la opción del menú “Sumar” y añade
de nuevo la siguiente línea:
F d ió Códi Lib D i i
Sumar();
- También se quiere que al pulsar la tecla enter en el cuadro de texto del número 1 se
ejecute la suma. Por lo tanto, en el evento actionPerformed del cuadro de texto
txtNumero1 hay que añadir la siguiente línea:
Sumar();
- Y como también se quiere que al pulsar la tecla enter en el cuadro de texto del
número 2 se ejecute la suma, también habrá que introducir en su actionPerformed la
siguiente línea:
Sumar();
En cada uno de los eventos hay una llamada al procedimiento Sumar, que es el que
se encarga de realizar la suma.
actionPerformed btnSumar
Procedimiento
actionPerformed menuSumar
Sumar()
actionPerformed txtNumero1
actionPerformed txtNumero2
- En el caso de la resta sucede igual. Tenemos que varios eventos distintos deben
provocar que se realice una misma operación. En este caso tenemos lo siguiente:
Calcular la resta y
Activar Calcular – Restar en el menú mostrar el resultado.
F d ió Códi Lib D i i
Programa este
procedimiento.
- Ahora, es necesario que cuando se activen los eventos indicados antes, estos hagan
una llamada al procedimiento Restar para que se efectúe la resta. Así pues, entre en
el evento actionPerformed del botón “Restar” y añada esta línea de código:
Restar();
Restar();
actionPerformed btnRestar
Procedimiento
actionPerformed menuRestar
Restar()
F d ió Códi Lib D i i
- Finalmente se programará el borrado de los cuadros de texto a través del botón
“Borrar” y de la opción del menú “Borrar”. En primer lugar, programa el siguiente
método (puedes hacerlo debajo del método “Restar”):
Programa el
procedimiento Borrar...
- Ahora programa las llamadas al procedimiento borrar desde los distintos eventos. En
el evento actionPerformed del botón “Borrar” y en el evento actionPerformed de la
opción del menú “Borrar” programa la siguiente llamada:
Borrar();
CONCLUSIÓN
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: LAYOUTS
Para diseñar más cómodamente las ventanas, Java proporciona una serie de objetos
denominados Layouts, que definen la forma que tendrán los elementos de situarse en las
ventanas.
Así pues, un Layout define de qué forma se colocarán las etiquetas, botones, cuadros de
textos y demás componentes en la ventana que diseñamos.
Ejercicio guiado
“Diseño Libre”
- Las líneas azules que aparecen indican con qué otro elemento está relacionado un
componente de la ventana. La situación de un elemento dependerá siempre de la
situación del otro.
Dicho de otra forma, las líneas azules indican las distancias que siempre se
respetarán. Observa la siguiente imagen:
F d ió Códi Lib D i i
Tanto el botón como la
etiqueta estarán siempre
a esta distancia del borde
derecho de la ventana…
- Este comportamiento de los elementos en la ventana viene dado por una opción del
NetBeans llamada Diseño Libre (Free Design)
El Diseño Libre permite que los elementos de una ventana mantengan una
distribución relativa da igual el tamaño que tenga la ventana. Dicho de otra forma, los
elementos se redistribuyen al cambiar el tamaño de la ventana.
El problema del Diseño Libre es el poco control que se tiene sobre los elementos que
se añaden a la ventana.
F d ió Códi Lib D i i
elementos de la ventana. Cuantos más elementos tengamos en una ventana, más
difícil será el colocarlos usando el Diseño Libre.
“AboluteLayout. Posiciones Absolutas”
- El Diseño Libre es la opción que está activada por defecto cuando se crea un
proyecto en NetBeans. Sin embargo, esta opción se puede cambiar por distintos
“Layouts” o “Distribuciones”.
Como ves, aparece un objeto dentro del JFrame llamado AbsoluteLayout. Este objeto
define otra forma de situar los elementos en la ventana. Concretamente, la
distribución AbsoluteLayout permite al programador colocar cada elemento donde él
quiera, sin restricciones, sin tener en cuenta distancias relativas.
F d ió Códi Lib D i i
- Sitúa la etiqueta y el botón donde quieras. Observa que no aparece ninguna línea
guía que defina distancias relativas:
Verás que los elementos de la ventana son inamovibles aunque la ventana cambie
de tamaño. En cambio, en el Diseño Libre los elementos intentaban siempre estar
dentro de la ventana.
F d ió Códi Lib D i i
- Practiquemos ahora con otro tipo de distribución. Accede al Inspector y pulsa el botón
derecho del ratón sobre el objeto JFrame. Activa la opción Establecer Disposición –
FlowLayout.
- Observa la ventana. Los elementos se han colocado uno detrás de otro. Se han
colocado “en línea”. Esto es lo que hace el “FlowLayout”. Fuerza a los distintos
elementos a que se coloquen en fila.
F d ió Códi Lib D i i
alineación y permite que los elementos estén alineados a la izquierda, derecha o
centro. El FlowLayout tiene una alineación centro por defecto.
F d ió Códi Lib D i i
- Marca el GridLayout y cambia sus propiedades Filas y Columnas. Asigna a la
propiedad Filas un 2 y a la propiedad Columnas un 3.
F d ió Códi Lib D i i
- Ya que solo tienes dos elementos en la ventana (una etiqueta y un botón), añade
otros cuatro elementos más (cuatro botones) para observar como se distribuyen en la
cuadrícula.
“BorderLayout”
F d ió Códi Lib D i i
Zona oeste (parte izquierda de la ventana)
Zona centro.
- Haz clic con el derecho sobre el JFrame y asigna una distribución “BorderLayout”.
F d ió Códi Lib D i i
- Como se puede observar, cada botón se ha colocado en una zona, y su tamaño ha
variado hasta ocupar la zona entera. Tenemos un botón en el norte, otro al sur, uno
al este, otro al oeste y uno en el centro.
F d ió Códi Lib D i i
CONCLUSIÓN
Diseño Libre – Esta distribución viene activada por defecto en el NetBeans, y define
una distribución de componentes en la que se respetan las distancias entre ellos
cuando la ventana cambia de tamaño.
FlowLayout – En esta distribución los elementos se colocan uno detrás de otro. Los
elementos intentarán estar dentro de la ventana aunque esta se reduzca de tamaño.
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: LAYOUTS Y PANELES
La distribución AbsoluteLayout por ejemplo nos da mucha facilidad a la hora de colocar los
elementos en la ventana, pero sin embargo los componentes no se adaptan a los cambios
de tamaño.
El Diseño Libre en cambio permite crear ventanas en las que sus componentes se
“recolocan” según el tamaño de estas pero a cambio crece la dificultad del diseño.
Para aprovechar las ventajas de los distintos layouts y minimizar sus inconvenientes, es
habitual en java crear una estructura de paneles cada uno de ellos con un layout distinto,
según nuestras necesidades.
Normalmente, al JFrame se le asigna un layout que lo divida en zonas, como puede ser el
BorderLayout o el GridLayout. Luego, dentro de cada una de estas zonas se introduce un
panel (objeto JPanel). Y a cada uno de estos paneles se le asigna el layout que más le
convenga al programador (FlowLayout, Diseño Libre, AbsoluteLayout, etc…) Finalmente,
dentro de cada panel se añaden los componentes de la ventana.
JFrame
(BorderLayout o GridLayout)
Componentes Componentes
F d ió Códi Lib D i i
Ejercicio guiado
Se pretende crear un proyecto con una ventana de diseño complejo. Para ello sigue
los siguiente pasos:
- Cambia el nombre a este panel y llámalo panelTitulo, ya que contendrá el nombre del
programa.
F d ió Códi Lib D i i
- Añade otro panel, esta vez a la parte central. El panel se llamará panelDatos:
NOTA. A veces resulta complicado agregar un panel en una zona de la ventana cuando
tenemos un BorderLayout. Puedes entonces hacer clic con el derecho sobre JFrame en
el Inspector y activar la opción Agregar desde paleta – Swing – JPanel.
F d ió Códi Lib D i i
- Si el panel no se coloca en el sitio deseado, se puede seleccionar en el Inspector y
activar su propiedad Dirección, e indicar la zona donde se quiere colocar:
F d ió Códi Lib D i i
- El Inspector tendrá la siguiente forma ahora:
F d ió Códi Lib D i i
- Cada panel puede ser diseñado de forma individual, simplemente haciendo doble clic
sobre él. Así pues, empezaremos diseñando el panel panelBotonera. Haz doble clic
sobre él.
- En la parte izquierda del NetBeans aparecerá únicamente el panelBotonera.
Agrándalo para que tenga la siguiente forma:
- Ahora añade cuatro botones al panel. Observa como tienes libertad total para colocar
cada botón donde quieras. Procura que el panel quede así:
F d ió Códi Lib D i i
(No nos vamos a preocupar en este ejercicio de los nombres de los componentes)
- Ahora diseña el panel panelVerificación haciendo doble clic sobre él.
- Coloca en él cuatro casillas de verificación. El aspecto del panel al terminar debe ser
parecido al siguiente:
F d ió Códi Lib D i i
- Ahora se diseñará el panelTitulo. Haz doble clic sobre él.
- En este caso se le añadirá un FlowLayout. Recuerda que este layout hace que cada
elemento se coloque uno detrás de otro.
- Añade al panel dos etiquetas como las que siguen. Ponle un borde a cada una:
Observa las líneas “guía”. Indican que las etiquetas dependen de la parte derecha del
panel. A su vez cada una depende de la otra. Es como si estuvieran “enganchadas”,
como los vagones de un tren.
F d ió Códi Lib D i i
- El panelDatos lo vamos a complicar un poco. Haz doble clic sobre él para diseñarlo y
asígnale un GridLayout.
- A cada una de las divisiones del GridLayout del panelDatos le asignaremos un nuevo
panel. Añade al panelDatos cuatro paneles. Esto lo puedes hacer fácilmente
haciendo clic con el botón derecho del ratón sobre el panelDatos en el Inspector y
eligiendo la opción Añadir desde paleta – Swing – JPanel.
El aspecto del inspector debería ser como el que sigue, en lo que se refiere al
panelDatos:
Así pues, el panel panelDatos tiene forma de rejilla con cuatro celdas, y en cada
celda hay un panel. Puede imaginarse el panelDatos así:
panelDatos
F d ió Códi Lib D i i
PanelEtiqueta1 PanelCuadro1
PanelEtiqueta2 PanelCuadro2
CONCLUSIÓN
Para el diseño de ventanas muy complejas, ser suelen definir layouts que dividan en
zonas el JFrame, como por ejemplo el BorderLayout o el GridLayout.
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: DIÁLOGOS
Cuadros de Diálogo
Los cuadros de diálogo tienen forma de ventana aunque no poseen algunas características
de estas. Por ejemplo, no pueden ser minimizados ni maximizados.
Los cuadros de diálogo, aparte de las opciones que muestran, suelen contener dos botones
típicos: el botón Aceptar y el botón Cancelar. El primero de ellos da por válidas las opciones
elegidas y cierra el cuadro de diálogo. El segundo simplemente cierra el cuadro de diálogo
sin hacer ninguna modificación.
Para crear cuadros de diálogo en Java, se usa un tipo de objetos llamado JDialog. Estos
objetos pueden ser diseñados como si fueran ventanas, aunque representan realmente
cuadros de diálogo.
F d ió Códi Lib D i i
Ejercicio guiado
- Así pues entra en el código y declara una variable global iva y otra descuento tal
como se indica a continuación (recuerda que las variables globales se colocan justo
después de la línea donde se define la clase principal public class):
F d ió Códi Lib D i i
Variables globales
- Cuando el programa arranque, interesará que el iva por defecto sea 0, y que el
descuento por defecto sea 0 también, así que en el constructor, inicializaremos las
variables globales iva y descuento a 0:
Inicialización de
variables globales
double unidades;
double precio;
double total; //total
double cantiva; //cantidad iva
double cantdes; //cantidad descuento
double totalsiniva; //total sin iva
F d ió Códi Lib D i i
//Ahora calculo el precio total:
total = totalsiniva+cantiva-cantdes;
- Para añadir un cuadro de diálogo al proyecto, se tiene que añadir un objeto del tipo
JDialog sobre el JFrame.
- Los JDialog son objetos ocultos, es decir, objetos que se colocan en la parte del
Inspector llamada Otros Componentes, al igual que sucede con los menús
contextuales o los JFileChooser. Observa tu inspector, allí verás el JDialog que has
añadido:
- Los diálogos normalmente traen por defecto el layout BorderLayout. Para nuestro
ejemplo cambiaremos el layout del JDialog por el Diseño Libre:
F d ió Códi Lib D i i
- Los JDialog se pueden diseñar independientemente, al igual que los JPanel. Solo
tienes que hacer doble clic sobre el dialogoConfiguracion (en el inspector) y este
aparecerá en el centro de la ventana.
- Así pues debes diseñar el dialogoConfiguracion para que quede de la siguiente
forma:
F d ió Códi Lib D i i
F d ió Códi Lib D i i
- Se ha dicho que cuando se pulse el botón Configuración en la ventana principal,
debe aparecer el cuadro de diálogo dialogoConfiguracion, que acabas de diseñar:
dialogoConfiguracion.setSize(250,200);
dialogoConfiguracion.setLocation(100,100);
dialogoConfiguracion.setVisible(true);
F d ió Códi Lib D i i
- Ejecuta el programa y observa lo que sucede cuando pulsas el botón Configurar.
Debería aparecer el cuadro de diálogo en la posición programada y con el tamaño
programado:
- Los botones Aceptar y Cancelar del cuadro de diálogo aún no hacen nada. Así que
los programaremos. Empezaremos por el más sencillo, el botón Cancelar.
dialogoConfiguracion.dispose();
El método dispose se usa para cerrar un cuadro de diálogo. También se puede usar
con un JFrame para cerrarlo.
Una vez que se haya hecho esto, el cuadro de diálogo se debe cerrar.
F d ió Códi Lib D i i
iva = Double.parseDouble(txtIva.getText());
descuento=Double.parseDouble(txtDescuento.getText());
dialogoConfiguracion.dispose();
- Observe el código. Primero se traspasa los valores de los cuadros de texto a las
variables globales y luego se cierra el cuadro de diálogo.
- Compruebe el funcionamiento del programa de la siguiente forma:
o Ejecute el programa.
o Introduzca 5 unidades y 20 de precio.
o Si pulsa calcular, el total será 100. (No hay ni iva ni descuento al empezar el
programa)
o Ahora pulse el botón Configuración, e introduzca un iva del 16. El descuento
déjelo a 0. Acepte.
o Ahora vuelva a calcular. Observe como ahora el total es 116, ya que se tiene
en cuenta el iva configurado.
o Pruebe a configurar un descuento y vuelva a calcular.
F d ió Códi Lib D i i
o Pulsa sobre la ventana.
Pulsa sobre la
ventana.
La ventana se activa
colocándose por encima
del cuadro de diálogo.
o A veces, puede ser interesante que se active la ventana pero que el cuadro
de diálogo siga delante de ella. Para conseguir esto, es necesario activar la
propiedad del cuadro de diálogo llamada alwaysOnTop. Activa esta
propiedad:
F d ió Códi Lib D i i
o Ahora ejecuta el programa de nuevo y haz que se visualice el cuadro de
diálogo de configuración. Podrás comprobar que se puede activar la ventana
e incluso escribir en sus cuadros de textos, y que el cuadro de diálogo sigue
visible:
Se puede activar la
ventana trasera, e
incluso escribir en ella.
Esto es gracias a que el
cuadro de diálogo es no
modal.
2. Un cuadro de diálogo modal es aquel que no permite que se active otra ventana
hasta que este no se haya cerrado.
- Para convertir nuestro cuadro de diálogo en modal, será necesario que lo selecciones
en el inspector y busques la propiedad modal. Debes activar esta propiedad.
F d ió Códi Lib D i i
- Ahora ejecuta el programa comprueba lo siguiente:
o A continuación intenta activar la ventana haciendo clic sobre ella. Verás como
no es posible activarla. Es más, intenta escribir en sus cuadros de texto. No
será posible hacerlo. (Incluso observarás un parpadeo en el cuadro de diálogo
avisándote de ello). Esto es debido a que ahora nuestro cuadro de diálogo es
modal.
CONCLUSIÓN
Los objetos JDialog son los que permiten la creación y uso de cuadros de diálogo
en un proyecto java.
F d ió Códi Lib D i i
Existen dos tipos de cuadros de diálogo: los modales y no modales.
Los cuadros de diálogo modales no permiten que se active otra ventana hasta que el
cuadro de diálogo no se haya cerrado.
Los cuadros de diálogo no modales permiten trabajar con otra ventana a pesar de
que el propio cuadro de diálogo no haya sido cerrado.
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: MODELOS DE CUADRO DE LISTA
F d ió Códi Lib D i i
132. Añade dos botones al formulario. Uno de ellos tendrá el texto “Curso 1” y se
llamará btnCurso1 y el otro tendrá el texto “Curso 2” y se llamará btnCurso2.
ffffff. Lo que hace cada botón es rellenar el cuadro de lista con una serie de
nombres. En el caso del botón “Curso 1”, la lista se rellena con los nombres
Juan, María y Luis, mientras que en el caso del botón “Curso 2”, la lista se
rellena con los nombres Ana, Marta y Jose.
hhhhhh. Los modelos de las listas son objetos del tipo DefaultListModel.
F d ió Códi Lib D i i
iiiiii.Lo que hace el programa es crear un “modelo”. Luego rellena el “modelo” con
datos, y finalmente asocia el “modelo” al cuadro de lista. Veamos como se
hace todo esto.
modelo.addElement("Ana");
modelo.addElement("Marta");
modelo.addElement("Jose");
lstNombres.setModel(modelo);
144. Prueba a ejecutar el programa. Observa como cuando pulsas cada botón
cambia el contenido de la lista:
Click y cambia el
listado.
145. Ahora añade el siguiente código al evento mouseClicked del cuadro de lista:
F d ió Códi Lib D i i
etiResultado.setText(lstNombres.getSelectedValue().toString());
Esta instrucción hace que al seleccionar un elemento del cuadro de lista éste
aparezca en la etiqueta etiResultado. Recuerda que el método getSelectedValue
permite recoger el elemento seleccionado (hay que convertirlo a cadena con toString)
Click y aparece el
elemento
seleccionado en la
etiqueta.
147. Una propuesta. Añada un botón “Vaciar” llamado btnVaciar. Este botón
vaciará el contenido de la lista. Para esto lo único que tiene que hacer es crear un
modelo y, sin introducir ningún valor en él, asociarlo al cuadro de lista.
CONCLUSIÓN
Se puede crear un “modelo” y luego introducir datos en él. Luego se puede asociar
ese “modelo” a la lista. De esta manera se puede cambiar el contenido de la lista en
cualquier momento.
F d ió Códi Lib D i i
EJERCICIO GUIADO. JAVA: MODELOS DE CUADRO DE LISTA
154. Elimina todos los elementos que contenga el combo. Recuerda, debes usar la
propiedad “model” del combo para cambiar sus elementos.
155. Después de haber hecho todo esto, tu ventana debe quedar más o menos así:
int i;
for (i=0;i<10;i+=2) {
modelo.addElement("Nº "+i);
}
cboNumeros.setModel(modelo);
Al igual que pasa con los cuadros de lista, los combos tienen un objeto
“modelo” que es el que realmente contiene los datos. En el caso de los
combos, para crear un objeto “modelo” se usará esta instrucción:
F d ió Códi Lib D i i
DefaultComboBoxModel modelo = new DefaultComboBoxModel();
ccccccc. A continuación, se usa el objeto “modelo” creado y se rellena de datos.
Concretamente, se rellena con los números pares comprendidos entre 0 y 10.
cboNumeros.setModel(modelo);
Se pulsa y se rellena
automáticamente
int i;
DefaultComboBoxModel modelo = new DefaultComboBoxModel();
for (i=1;i<10;i+=2) {
modelo.addElement("Nº "+i);
}
cboNumeros.setModel(modelo);
165. La única diferencia de este código es el for, que está diseñado para que se
introduzcan los números impares comprendidos entre 0 y 10 dentro del modelo.
F d ió Códi Lib D i i
166. Finalmente se programará el actionPerformed del combo para que al
seleccionar un elemento este aparezca en la etiqueta. Esto se hace con una simple
instrucción:
etiResultado.setText(cboNumeros.getSelectedItem().toString());
167. Prueba el programa. Prueba los botones Pares e Impares y prueba el combo.
168. Sería interesante añadir un botón “Vaciar” llamado btnVaciar que vaciara el
contenido del combo. Esto se haría simplemente creando un modelo vacío y
asignarlo al combo. Se anima al alumno a que realice esta mejora.
CONCLUSIÓN
Un combo, al igual que los cuadros de lista, es un objeto que contiene a su vez otro
objeto denominado “modelo”.
F d ió Códi Lib D i i
Se puede crear un “modelo” y luego introducir datos en él. Luego se puede asociar
ese “modelo” al combo. De esta manera se puede cambiar el contenido del combo
en cualquier momento.
F d ió Códi Lib D i i
Fundación Código Libre Dominicano
Desarrollo
De aplicaciones
Java Con Netbeans
Ejercicios
METODOLOGÍA DE LA PROGRAMACIÓN
JAVA
PRIMEROS PROGRAMAS
Ejercicio 1
Ejercicio 2
Creará un programa java cuya ventana principal contenga los siguientes componentes:
- Cuando el usuario pulse el botón “Traspasa 1”, lo que se haya escrito dentro del cuadro
de texto se copiará dentro de la etiqueta 1.
- Cuando el usuario pulse el botón “Traspasa 2”, lo que se haya escrito dentro del cuadro
de texto se copiará dentro de la etiqueta 2.
F d ió Códi Lib D i i
Usará el método setText para situar el texto en la etiqueta, y getText para recoger el texto del
cuadro de texto.
Ejercicio 3
Se pide que realice un programa en java cuya ventana principal incluya los siguientes
componentes:
Tendrá que usar el método setText para colocar texto en la etiqueta y usar el método getText
para recoger el texto escrito en el cuadro de texto.
Ejercicio 4
Se pide que realice un programa en java cuya ventana principal contenga los siguientes
elementos:
- Cuando el usuario pulse el botón “Desactivar”, entonces los dos cuadros de texto se
desactivarán. Cuando el usuario pulse el botón “Activar”, los dos cuadros de texto se
volverán a activar.
F d ió Códi Lib D i i
Tendrá que usar la concatenación de cadenas. Recuerde que se pueden concatenar cadenas a
través del operador +.
Tendrá que usar el método setText para colocar el texto en la etiqueta y el método getText para
recoger el texto de cada cuadro de texto.
Tendrá que usar el método setEnabled para activar o desactivar cada cuadro de texto.
F d ió Códi Lib D i i
Ejercicio 5
Debe realizar un programa java cuya ventana principal contenga los siguientes elementos:
- Cuatro etiquetas, conteniendo distintas palabras cada una. Puede llamarlas: etiPal1,
etiPal2, etiPal3 y etiPal4.
- Otra etiqueta que contenga el texto “Ocultar”. Esta etiqueta se llamará etiOcultar y
tendrá un tamaño más grande que las otras y un color de fondo.
- Cuando el puntero del ratón “sobrevuele” la etiqueta etiOcultar, las etiquetas con las
palabras deben desaparecer.
Tendrá que programar los eventos mouseEntered y mouseExited para que el programa detecte
cuando el ratón entra o sale de la etiqueta etiOcultar.
Ejercicio 6
Debe realizar un programa java cuya ventana principal contenga los siguientes elementos:
- Una etiqueta que contenga su nombre. Esta etiqueta se llamará etiNombre. Esta
etiqueta debe tener un color de fondo.
- Un botón con el texto “Esquina”. Este botón se llamará btnEsquina.
- Un botón con el texto “Centro”. Este botón se llamará btnCentro.
- Un botón con el texto “Agrandar”. Este botón se llamará btnAgrandar.
- Un botón con el texto “Achicar”. Este botón se llamará btnAchicar.
- Cuando el usuario lleve el puntero sobre uno de los botones, el botón cambiará de
tamaño agrandándose. Cuando el puntero salga del botón, el botón volverá a su
tamaño normal.
Debe programar los eventos actionPerformed, mouseEntered y mouseExited para los botones.
Tendrá que usar el método setLocation para cambiar la posición de la etiqueta. Este método
recibe como parámetro la posición x e y donde situará el componente.
F d ió Códi Lib D i i
Tendrá que usar el método setSize para cambiar el tamaño de la etiqueta y de los botones.
Este método recibe como parámetro el ancho y alto del componente.
Se pide realizar un programa java que tenga los siguientes elementos en la ventana principal:
- Una etiqueta con el texto que quiera. Esta etiqueta se llamará etiTexto.
- Un botón con el texto “Azul”. Este botón se llamará btnAzul.
- Un botón con el texto “Rojo”. Este botón se llamará btnRojo.
- Un botón con el texto “Verde”. Este botón se llamará btnVerde.
- Un botón con el texto “Fondo Azul”. Este botón se llamará btnFondoAzul.
- Un botón con el texto “Fondo Rojo”. Este botón se llamará btnFondoRojo.
- Un botón con el texto “Fondo Verde”. Este botón se llamará btnFondoVerde.
- Un botón con el texto “Transparente”. Este botón se llamará btnTransparente.
- Un botón con el texto “Opaca”. Este botón se llamará btnOpaca.
Para cambiar el color del texto de una etiqueta, usará el método setForeground.
Para indicar el color azul usará Color.BLUE. Para indicar el color rojo, usará Color.RED. Y para
indicar el color verde usará Color.GREEN.
Para hacer que una etiqueta sea opaca o no, usará el método setOpaque.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
Ejercicio 1
(1) Un cuadro de texto llamado txtUnidades donde el usuario introducirá las unidades
vendidas.
(2) Un cuadro de texto llamado txtPrecio donde el usuario introducirá el precio unidad.
(3) Una etiqueta llamada etiTotalSinIva.
(4) Una etiqueta llamda etiIva.
(5) Una etiqueta llamada etiTotalMasIva.
(6) Un botón llamado btnCalcular.
(7) El usuario introducirá las unidades y el precio y luego pulsará el botón Calcular.
(8) El programa entonces calculará el total de la venta, el iva y el total más iva y presentará
dichos resultados en cada etiqueta.
Ejercicio 2
(15)El usuario introducirá las notas de los tres trimestres en los cuadros de texto
correspondientes.
(16)Cuando se pulse el botón Calcular, el programa calculará la nota media y la mostrará
en la etiqueta llamada etiNotaFinal.
(17)Si la nota final es menor de 5, entonces en la etiqueta etiResultado aparecerá la
palabra SUSPENSO.
(18)Si la nota final es 5 o más, entonces en la etiqueta etiResultado aparecerá la palabra
APROBADO.
(19)Si la nota final fuera un suspenso, entonces las etiquetas etiNotaFinal y etiResultado
deben aparecer de color rojo. En caso contrario aparecerán de color negro.
F d ió Códi Lib D i i
Ejercicio 3
El programa debe tener una ventana con al menos los siguientes elementos:
(23)El usuario introducirá un radio dentro del cuadro de texto llamado radio. Al pulsar la
tecla Enter sobre dicho cuadro de texto, el programa calculará el área y el perímetro y
los mostrará en las etiquetas correspondientes.
(24)Si el usuario introduce un radio negativo, en las etiquetas debe aparecer la palabra
“Error” en color rojo.
Ejercicio 4
Ejercicio 5
Realizar un programa que calcule la raíz cuadrada de un número. El programa tendrá los
siguientes elementos en la ventana únicamente:
Ejercicio 6
El usuario introducirá las dos palabras dentro de los cuadros de texto y luego pulsará el botón
Concatena. El resultado será que en la etiqueta etiTexto aparecerán las dos palabras escritas
concatenadas.
F d ió Códi Lib D i i
Por ejemplo, si el usuario escribe en el primer cuadro de texto “Lunes” y en el segundo
“Martes”, en la etiqueta aparecerá: “LunesMartes”.
Ejercicio 7
Se pide que cuando el usuario lleve el ratón sobre una de las etiquetas, aparezca en el cuadro
de texto el número correspondiente.
Los números se van añadiendo al cuadro de texto. Por ejemplo, si el usuario lleva el puntero
sobre la etiqueta Uno, luego sobre la etiqueta Tres y luego sobre la etiqueta Uno, en el cuadro
de texto debería haber aparecido lo siguiente: 131.
Añada un botón llamado btnBorrar, que al ser pulsado borre el contenido del cuadro de texto.
Ejercicio 8
ax2+bx+c=0
Dados unos valores para a, b y c, se debe calcular cuanto vale x.
Para saber el número de soluciones de una ecuación de segundo grado se debe realizar el
siguiente cálculo:
R = b2 – 4ac
x = -b / (2a)
Realice el programa para resolver las ecuaciones de segundo grado. El diseño de la ventana
queda a su elección. Procure que el programa indique cuando hay o no soluciones, y que las
muestre de forma adecuada.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
Ejercicio 1
- Dos cuadros de texto llamados txtA y txtB donde se introducirán los dos números.
- Cuando se pulse el botón “Calcular División” se calculará la división del número A entre
el B y el resultado aparecerá en la etiqueta etiResultado.
- Si el usuario introduce un valor 0 dentro del cuadro de texto del número B, entonces el
programa mostrará un mensaje de error (Use un JOptionPane.showMessage)
- Si el usuario introduce un valor menor que cero en cualquiera de los dos cuadros de
texto, entonces también se mostrará un error.
Ejercicio 2
Realice un programa que permita calcular el sueldo total de un empleado. Para ello, el
programa tendrá los siguientes elementos en la ventana:
F d ió Códi Lib D i i
Ejercicico 3
- El usuario introducirá un peso y una talla en los cuadros de texto. Luego pulsará el
botón calcular para calcular el índice de masa corporal, el cual se calcula así:
IMC CONCLUSIÓN
<18 Anorexia
>=18 y <20 Delgadez
>=20 y <27 Normalidad
>=27 y <30 Obesidad (grado 1)
>=30 y <35 Obesidad (grado 2)
>=35 y <40 Obesidad (grado 3)
>=40 y Obesidad mórbida
El mensaje puede ser algo así: “Su IMC indica que tiene anorexia”, por ejemplo. Este
mensaje aparecerá en un JOptionPane.showMessage.
- Cuando pulse el botón Limpiar, se borrarán los cuadros de texto Peso y Talla. Antes de
que esto ocurra, el programa debe pedir confirmación, con un cuadro de diálogo de
confirmación (JOptionPane.showConfirmDialog). El cuadro de confirmación tendrá el
siguiente aspecto:
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
CADENAS
Ejercicio 1
(4) El usuario introducirá una frase en el cuadro de texto, y luego pulsará el botón Analizar.
f. La frase en mayúsculas.
g. La frase en minúsculas.
h. Número de caracteres de la frase.
i. Número de caracteres de la frase sin contar los espacios.
(10)Si el usuario pulsa Analizar cuando no hay ninguna frase introducida en el cuadro de
texto, el programa debe mostrar un error emergente (JOptionPane)
Ejercicio 2
- El usuario introducirá una frase en el cuadro de texto txtFrase, y luego introducirá una
palabra en el cuadro de texto txtSubcadena, y luego pulsará el botón Analizar.
F d ió Códi Lib D i i
- Si la palabra no se encuentra en la frase, el programa mostrará un error emergente y
no se presentará nada en las etiquetas.
Ejercicio 3
- El usuario introducirá una frase en el cuadro de texto txtFrase, y tres palabras en los
cuadros de texto de las palabras.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
CADENAS (CONTINUACIÓN)
Ejercicio 1
El programa debe contar cuantas vocales tiene la frase. El funcionamiento será el siguiente:
(4) El usuario escribirá una frase en el cuadro de texto txtFrase. Luego se pulsará el botón
Analizar.
Ejercicio 2
(11)El usuario introducirá un DNI en el cuadro de texto llamado txtDNI y luego pulsará el
botón Preparar DNI. El resultado será que el DNI introducido aparecerá “preparado” en
la etiqueta etiDNI.
31.543.234-A
31.543.234 A
31.543.234A
31 543 234 A
etc.
Sin embargo, cuando el usuario pulse el botón Preparar DNI, en la etiqueta etiDNI debe
aparecer el DNI con el siguiente formato:
31543234A
F d ió Códi Lib D i i
(13)Si el usuario no introduce nada en el cuadro de texto del DNI y pulsa el botón, entonces
debe aparecer un error emergente (JOptionPane).
Ejercicio 3
Se pide hacer un programa que le permita al usuario introducir una palabra en latín de la
primera declinación, y a continuación generar sus “casos” en plural y singular.
Las palabras de la primera declinación en latín son sustantivos femeninos (la mayoría), que
terminan en a, como por ejemplo: ROSA o ANIMA.
Por ejemplo, para la palabra ROSA, sus casos son los siguientes:
Por ejemplo, para la palabra ANIMA, sus casos son los siguientes:
Debes observar que algunos casos son exactamente iguales a la palabra inicial, como por
ejemplo el Nominativo Singular.
Otros casos, en cambio, se construyen añadiendo algunas letras al final de la palabra inicial.
Por ejemplo, el Acusativo singular se construye añadiendo una “m” a la palabra inicial.
Para construir el Dativo y Ablativo plural, es necesario concatenar la palabra inicial (sin la a
final) con “is”. Por ejemplo, en el caso de la palabra Rosa, se concatenaría: Ros + is.
F d ió Códi Lib D i i
(18)Si el usuario introduce una palabra que no termine en “a”, entonces el programa dará
un error, ya que dicha palabra no es de la primera declinación.
PROGRAMACIÓN
JAVA
EXCEPCIONES
Ejercicio 1
Realizar un programa que le permita al usuario introducir una frase, una posición inicial y una
posición final. (Tres cuadros de texto llamados txtFrase, txtPosIni y txtPosFin.
El programa debe mostrar la subcadena contenida entre la posición inicial y la posición final
(use una etiqueta etiSubcadena)
El programa debe ser capaz de capturar las excepciones producidas y mostrar un mensaje de
error.
Ejercicio 2
Realizar un programa que pida las coordenadas de una recta, es decir, las coordenadas del
punto p1 (x1, y1) y las coordenadas del punto p2 (x2,y2).
Así pues el programa tendrá cuatro cuadros de texto: txtX1, txtY1, txtX2 y txtY2 donde el
usuario introducirá las coordenadas.
Añada un botón “Calcular” llamado btnCalcular que realice el cálculo. El código que introduzca
en este botón debe ser capaz de capturar cualquier tipo de excepción producida. Interesa que
aparezca un mensaje indicando el tipo de error producido, y el tipo de excepción.
Ejercicio 3
Realice un programa que le pida dos números al usuario. Ambos números deben estar
comprendidos entre 0 y 100.
Además, debe hacer que si el usuario introduce un número no comprendido entre 0 y 100, el
código genere una excepción propia
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
LA CLASE JFRAME
Ejercicio 1
(31)Si el usuario pulsa el botón “Estilo Java”, entonces toda la ventana cambiará a la
visualización Java.
(32)Si el usuario pulsa el botón “Estilo Windows”, entonces toda la ventana cambiará a la
visualización Windows.
(33)Si el usuario pulsa uno de los botones de color, entonces el fondo de la ventana se
cambiará al color indicado.
F d ió Códi Lib D i i
Además, el programa contará con las siguientes características:
(34)Al iniciarse el programa, este debe pedir una contraseña al usuario. Si el usuario
introduce la contraseña correcta, entonces el usuario entrará en el programa. En caso
contrario el programa se cerrará.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
Ejercicio 1
Se pide realizar un programa que tenga los siguientes elementos en la ventana principal:
(14)El usuario elegirá un tamaño para la pizza que quiere pedir. Este tamaño puede ser
uno solo de los siguientes: pequeña, mediana o familiar.
(15)El usuario elegirá también los ingredientes que desee. Puede seleccionar uno o varios
ingredientes.
(16)Al pulsar el botón Total, el programa calculará y mostrará en la etiqueta etiResultado el
precio de la pizza, teniendo en cuenta lo siguiente:
F d ió Códi Lib D i i
Una pizza mediana cuesta 9 euros.
Una pizza familiar cuesta 11 euros.
Si se le añade como ingrediente Bacon, hay que aumentar el precio de la pizza en 1,50
euros.
Si se le añade como ingrediente Anchoas, hay que aumentar el precio de la pizza en
1,80 euros.
Si se le añade como ingrediente Cebolla, hay que aumentar el precio de la pizza en
1,00 euros.
Si se le añade como ingrediente Pimiento, hay que aumentar el precio de la pizza en
1,20 euros.
(17)Al ejecutar el programa, debe estar seleccionada la opción pizza familiar por defecto, y
no debe estar seleccionada ninguno de los ingredientes.
(18)Al iniciarse el programa, debe aparecer un cuadro indicando el nombre del programa.
Por ejemplo: PIZZERÍA JAVA, y el nombre del programador.
(19)Al intentar cerrar el programa, este debe pedir confirmación para salir. Solo si el
usuario acepta salir del programa este se cerrará.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
LISTAS Y COMBOS
Ejercicio 1
(21)Un cuadro de texto donde se introducirán las unidades que se envían, llamado
txtUnidades.
Península
Canarias
Extranjero
Normal
Urgente
F d ió Códi Lib D i i
(24)Un botón “Calcular” llamado btnCalcular.
(25)Una etiqueta con un borde llamada etiResultado.
(26)Otras etiquetas informativas.
Península – 20
Canarias – 25
Extranjero – 30
Normal – 3
Urgente – 10
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
Ejercicio 1
(39)El usuario elegirá una de las opciones: Trimestre 1, Trimestre 2, Trimestre 3, Trimestre
4.
(40)A continuación el usuario pulsará el botón Rellenar, y entonces el cuadro de lista se
rellenará con los meses correspondientes al trimestre elegido.
(41)Por ejemplo, si el usuario elige el Trimestre 2 y pulsa el botón, entonces el cuadro de
lista contendrá: Abril, Mayo, Junio.
(42)Cuando el usuario pulse el botón Vaciar, el cuadro de lista se vaciará.
F d ió Códi Lib D i i
(43)Cuando el usuario haga clic sobre un elemento de la lista, este debe aparecer en la
etiqueta etiMes.
Ejercicio 2
Se pide realizar un programa que tenga el siguiente aspecto:
(61)Al elegir cualquiera de los números en el combo, este debe mostrarse en la etiqueta
etiResultado.
(62)Al pulsarse el botón “Vaciar” el combo se vacia.
A tener en cuenta.
(63)Si el usuario introduce algo que no sea un número en los cuadros de texto, el programa
debería mostrar un error.
(64)El número inicial debe ser menor que el número final. En caso contrario el programa
debe mostrar un error.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
JTOGGLEBUTTONS
Ejercicio 1
- Cuando el usuario pulse Total, en la etiqueta debe aparecer la suma de los números de
los botones seleccionados. Por ejemplo, si están seleccionados el 2 y el 4, aparecerá
un 6.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
JSLIDER
Ejercicio 1
Una empresa de productos químicos necesita calcular la cantidad de agua y sales que necesita
mezclar para fabricar un detergente. Para ello hay que tener en cuenta tres factores:
- Un JSlider llamado deslizadorLitros que represente los litros a fabricar. Sus valores
estarán comprendidos entre 1 y 100. El valor inicial del deslizador será 50.
- Una etiqueta con borde llamada etiLitros donde aparecerá la cantidad de litros elegida
en el deslizador de litros.
- Una etiqueta con borde llamada etiCalidad donde aparecerá la cantidad de calidad
elegida en el deslizador de calidad.
- Una etiqueta con borde llamada etiDensidad donde aparecerá la cantidad de densidad
elegida en el deslizador de calidad.
- Una etiqueta con borde etiLitrosAgua, que contenga el total de litros de agua
calculados.
- Una etiqueta con borde etiSales, que contenga el total de sales calculados.
F d ió Códi Lib D i i
El usuario arrastra los
deslizadores...
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
JSPINNER
Ejercicio 1
Se propone hacer un juego sencillo, que simule la apertura de una caja a través de una
combinación.
(1) Tres JSpinner a los que se les llamará: spiCentenas, spiDecenas y spiUnidades. Estos
JSpinner solo admitirán los valores entre 0 y 9.
(5) El usuario modificará los valores de los JSpinner y luego pulsará el botón Abrir.
(6) Si los valores de los JSpinner coinciden con la clave, 246, entonces en la etiqueta debe
aparecer el mensaje “Caja Abierta”.
(7) Si los valores de los JSpinner forman un número menor que 246, entonces en la
etiqueta debe aparecer el mensaje: “El número secreto es mayor”.
(8) Si los valores de los JSpinner forman un número mayor que 246, entonces en la
etiqueta debe aparecer el mensaje: “El número secreto es menor”.
Nota:
int x;
F d ió Códi Lib D i i
x = Integer.parseInt(spiValor.getValue().toString()) ;
(10)Sea el número A las centenas, el B las decenas y el C las unidades. Para calcular el
número correspondiente hay que hacer el siguiente cálculo:
N = A * 100 + B * 10 + C
Ejemplo de funcionamiento:
Pulsas Abrir...
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
JSROLLBAR
Ejercicio 1
Imagine que le encargan realizar un programa que contenga un ecualizador. Para permitir al
usuario el control de las distintas frecuencias se usarán varias barras de desplazamiento.
La ventana del programa que debe construir debe ser similar a la siguiente:
(1) Cinco etiquetas con borde que puede llamar etiFrecuencia1, etiFrecuencia2, etc…
(3) Cinco cuadros de verificación que puede llamar chkFrecuencia1, chkFrecuencia2, etc…
(4) Un panel con título y dentro de él tres botones de opción a los que puede llamar
optPelícula, optConcierto y optPlano. (Para estos tres botones de radio necesitará un
objeto del tipo ButtonGroup al que puede llamar grupoEcualización)
(5) Las cinco barras de desplazamiento deben tener valores comprendidos entre un
mínimo de 0 y un máximo de 10. El incremento unitario debe ser de 1 y el incremento
en bloque de 2.
(6) Cada vez que se mueva una barra, en su etiqueta correspondiente aparecerá el valor
de dicha barra (un valor que estará entre 0 y 10) Comprueba que cuando el usuario
active al máximo una barra en la etiqueta aparezca un 10.
(7) Las casillas de verificación indican el bloqueo o no de cada barra. Si el usuario activa
una casilla de verificación, entonces su barra correspondiente quedará bloqueada de
forma que no pueda ser modificada. Cuando se vuelva a desactivar la casilla la barra
se volverá a activar (Use el método setEnabled)
F d ió Códi Lib D i i
a. Si el usuario activa la opción Película, las barras quedarán con los siguientes
valores respectivamente: 2, 5, 8, 5, 2
b. Si el usuario activa la opción Concierto, las barras quedarán con los siguientes
valores respectivamente: 9, 5, 1, 5, 9
(9) Cuando el programa se inicie, todas las barras deben estar a 5 y la opción Plano debe
estar activada.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
BARRA DE MENÚS
Ejercicio 1
Le encargan un programa que controle las luces de las oficinas de un edificio. Concretamente,
se tienen que controlar tres oficinas, y cada una de ellas tiene dos luces principales y una de
seguridad.
La ventana principal del programa debe mostrar tres paneles como el que sigue:
Se supondrá que las distintas luces de cada oficina se pueden encender o apagar activando o
desactivando los cuadros de verificación.
El programa además debe de contar con un menú con una opción llamada “Activación” y otra
llamada “Info”
(20)La opción “Apagar Todas” desactivará todos los cuadros de verificación de las luces.
(21)La opción “Encender Todas” activará todos los cuadros de verificación de las luces.
F d ió Códi Lib D i i
(23)Si se activa la opción “Dia – Oficina 1”, entonces se encenderán (activarán) las luces
principal y secundaria de la oficina 1, y se apagará (desactivará) la luz de seguridad de
dicha oficina.
(24)Si se activa la opción “Dia – Oficina 2”, entonces se encenderán (activarán) las luces
principal y secundaria de la oficina 2, y se apagará (desactivará) la luz de seguridad de
dicha oficina.
(25)Si se activa la opción “Dia – Oficina 3”, entonces se encenderán (activarán) las luces
principal y secundaria de la oficina 3, y se apagará (desactivará) la luz de seguridad de
dicha oficina.
(26)Si se activa la opción “Dia – Todas”, entonces todas las oficinas tendrán las luces
principal y secundarias encendidas, y apagadas las luces de seguridad.
(27)Si se activa la opción “Noche – Oficina 1”, entonces se apagarán las luces principal y
secundaria de la oficina 1 y se encenderá la luz de seguridad.
(28)Si se activa la opción “Noche – Oficina 2”, entonces se apagarán las luces principal y
secundaria de la oficina 2 y se encenderá la luz de seguridad.
(29)Si se activa la opción “Noche – Oficina 3”, entonces se apagarán las luces principal y
secundaria de la oficina 3 y se encenderá la luz de seguridad.
(30)Si se activa la opción “Noche – Todas”, entonces se apagarán todas las luces
principales y secundarias de todas las oficinas y se encenderán todas las luces de
seguridad.
F d ió Códi Lib D i i
La opción Info del menú contendrá lo siguiente:
(34)La opción Acerca de... mostrará un JOptionPane que contendrá el nombre del
programa y del programador.
MEJORA OPCIONAL
Sería interesante que cada cuadro de verificación estuviera acompañado de una pequeña
imagen que representara una bombilla encendida o apagada según el estado de la luz.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
BARRA DE HERRAMIENTAS
Ejercicio 1
F d ió Códi Lib D i i
El objetivo del ejercicio es crear una barra de herramientas que contenga un botón para
algunas de las opciones principales del menú. Concretamente, la barra de herramientas
contendrá los siguientes botones:
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
MENÚS CONTEXTUALES
Ejercicio 1
Se va a añadir una mejora más en el programa de luces realizado en las hojas anteriores.
Concretamente se añadirá un menú contextual que contenga las siguientes opciones:
Apagar Todas
Encender Todas
------------------- (Separador)
Modo Día
Modo Noche
------------------- (Separador)
Principales
Secundarias
Seguridad
Este menú aparecerá cuando el usuario haga clic con el botón derecho del ratón sobre el fondo
de la ventana de su programa. Es decir, tendrá que programar el clic del ratón sobre el
formulario.
Las opciones del menú contextual coinciden con las opciones de la barra de menús de la
siguiente forma:
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
Notas Iniciales
Supongamos que tiene en su proyecto un objeto del tipo JFileChooser llamado elegirFichero.
A través del método getSelectedFile obtiene el fichero que ha elegido el usuario. El método
getSelectedFile devuelve en realidad un objeto del tipo File.
resp=elegirFichero.showOpenDialog(this);
if (resp==JFileChooser.APPROVE_OPTION) {
f = elegirFichero.getSelectedFile();
}
Si observa este código, verá que se crea una variable f de tipo File. Y f es el fichero elegido por
el usuario en el cuadro de diálogo Abrir.
Los objetos del tipo File poseen diversos métodos que permiten obtener información sobre el
fichero y realizar algunas operaciones con ellos. He aquí algunos métodos que se pueden usar:
Por ejemplo:
Por ejemplo:
Por ejemplo:
if (f.exists() == true ) {
JOptionPane.showMessageDialog(null, “El fichero f existe”);
} else {
JOptionPane.showMessageDialog(null, “El fichero f no existe”);
}
Por ejemplo:
F d ió Códi Lib D i i
Ejercicio
Teniendo en cuenta las ideas expuestas, realizar un programa cuya ventana tenga el siguiente
aspecto:
(12)En la etiqueta nombre del fichero aparecerá el nombre del fichero (use getName())
(13)En la etiqueta camino del fichero aparecerá el camino completo del fichero (use
getPath())
Pida una confirmación antes de eliminar el fichero. Tenga cuidado al comprobar esta
opción.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
VARIABLES GLOBALES
Ejercicio 1
- Cuando el usuario pulse el botón “Resultados”, deben aparecer en las etiquetas los
siguientes datos:
- El botón “Reiniciar” reinicia el proceso borrando todo lo que hubiera en las etiquetas de
resultados y reiniciando las variables globales.
Para que sirva de ayuda, se recomienda que use las siguientes variables globales:
- Una variable double llamada mayor. Contendrá en todo momento el número mayor
introducido.
- Una variable double llamada suma. Contendrá en todo momento la suma de los
números introducidos.
- Una variable int llamada cuenta. Contendrá en todo momento la cuenta de todos los
números introducidos hasta ahora.
Al comenzar el programa, y al pulsar el botón “Reiniciar”, será necesario que estas tres
variables se inicien a 0.
Nota. Se supondrá que todos los número introducidos serán mayores o iguales a 0.
F d ió Códi Lib D i i
Ejercicio 2
- Si el número introducido por el usuario coincide con el número elegido al azar por la
máquina, entonces el usuario gana y se le debe sumar lo apostado a la cantidad que
tenía en dicho momento. Si el usuario pierde entonces se le debe restar lo apostado a
la cantidad que tenía. El total que le quede debe aparecer en la etiqueta resultado.
- Solo se necesita una variable global de tipo double a la que puedes llamar ganancias.
Esta variable estará inicializada al comienzo del programa a 100.
Para hacer que el ordenador calcule un número aleatorio entre 1 y 10 debes usar el siguiente
código:
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
CENTRALIZAR CÓDIGO
Ejercicio 1
Además:
(7) Una barra de herramientas con el nombre barraHerramientas, que contenga tres
botones:
h. Un botón herramientasSumar.
i. Un botón herramientasRestar.
j. Un botón herramientasReiniciar.
(11)Asigne a estos botones el icono que quiera. Por ejemplo, iconos de relojes.
Además:
F d ió Códi Lib D i i
(12)La ventana contendrá una barra de menús a la que puede llamar barraMenus. Esta
barra contiene una opción “Acción” a la que puede llamar menuAccion.
(20)Si luego, pulsa el botón sumar, o bien activa el botón sumar de la barra de
herramientas, o bien activa la opción sumar del menú, entonces los minutos escritos se
suman a la hora que se muestra.
(21)En cambio, si el usuario pulsa el botón restar, o bien activa el botón restar de la barra
de herramientas, o bien activa la opción restar de la barra de menús, entonces los
minutos escritos se restan a la hora que se muestra.
(22)Si el usuario pulsa el botón reiniciar de la barra de menús o pulsa la opción reiniciar del
menú, entonces la hora que se muestra se reinicia a las 00:00 horas.
F d ió Códi Lib D i i
Un ejemplo:
El usuario introduce 90
minutos y luego pulsa
“Sumar”
F d ió Códi Lib D i i
Supongamos ahora que el
usuario introduce un 40 y
luego pulsa “Restar”
A TENER EN CUENTA
(23)Se aconseja que realice un procedimiento Sumar que se encargue de hacer la suma de
minutos.
F d ió Códi Lib D i i
(26)Llame desde los distintos eventos al procedimiento que corresponda.
(27)Se aconseja tener una variable global hora que contenga en todo momento la hora
actual.
(28)Se aconseja tener una variable global minutos que contenga en todo momento los
minutos actuales.
Sumar minutos…
Restar minutos…
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
CUADROS DE DIÁLOGO
Ejercicio 1
Para ello, debe realizar un proyecto con una ventana como la que sigue:
Esta ventana tiene tres cuadros de textos, para cada uno de los costes. Si se desea, se puede
introducir directamente cada uno de los costes en estos cuadros de textos y al pulsar el botón
Calcular aparecerá la suma de los tres en la etiqueta Total.
Por otro lado, cada cuadro de texto tiene asignado un botón con tres puntos que permitirá
facilitar el cálculo de cada coste a través de un cuadro de diálogo.
F d ió Códi Lib D i i
por instalación en el cuadro de texto correspondiente de la ventana principal y luego se cerrará
el cuadro de diálogo.
Por ejemplo, si el usuario introduce 3 alumnos y 12 horas, el coste por formación será:
Al pulsar el botón Aceptar, se calculará dicho coste y se introducirá en el cuadro de texto del
coste de formación de la ventana principal (luego el cuadro de texto se cerrará).
Si se pulsa el botón Cancelar, el cuadro de diálogo simplemente se cerrará, sin que ocurra
nada más.
F d ió Códi Lib D i i
Al pulsar Aceptar, el programa calculará el coste de mantenimiento y lo presentará en el cuadro
de texto correspondiente de la ventana principal (y luego se cerrará el cuadro de diálogo)
MEJORAS
Ayuda
Al pulsar este botón, aparecerá un cuadro de diálogo de ayuda con este aspecto (haz que no
sea modal y que esté siempre por encima de la ventana principal:
F d ió Códi Lib D i i
Al pulsar el botón Cerrar, el cuadro de diálogo simplemente se cerrará.
Para hacer el texto, usa el objeto JTextPane, y su propiedad text. Este objeto permite crear
cuadros con gran cantidad de texto. Ten en cuenta que cuando añadas un JTextPane este
aparecerá dentro de un JScrollPane.
Se añadirá un nuevo cuadro de diálogo al proyecto que servirá como pantalla de presentación
(a estos cuadros de diálogo se les suele denominar Splash)
Diseñe este cuadro de diálogo como quiera. Puede añadir varias imágenes, colocar el texto
donde quiera, etc.
Debe mostrar este cuadro de diálogo al comenzar el programa (en el evento windowOpened
del formulario)
El cuadro de diálogo debe tener un botón Cerrar, o bien, debe tener la posibilidad de cerrarse
cuando el usuario haga clic sobre él en cualquier parte.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
Ejercicio 1
Realice un proyecto cuya ventana tenga el siguiente diseño. Este diseño lo tiene que hacer
totalmente desde código, sin usar la ventana de diseño del NetBeans:
Ejercicio 2
Realice un proyecto cuya ventana principal tenga el siguiente diseño. Este diseño lo tiene que
hacer directamente desde código, sin usar la ventana de diseño del NetBeans.
F d ió Códi Lib D i i
Tenga en cuenta lo siguiente:
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
Ejercicio 1
- Si pulsa el botón Área se calculará el área del círculo. (actionPerformed del botón de
Área)
- Si pulsa el botón Perímetro se calculará el perímetro del círculo. (actionPerformed del
botón de Perímetro)
- Si pulsa el botón Limpiar en el cuadro de texto aparecerá un 0 y la etiqueta de
resultado (la de color rojo) se vaciará. (actionPerformed del botón Limpiar)
Todo el programa debe ser realizado directamente desde código, sin usar la ventana de
diseño de NetBeans.
Ejercicio 2
Realice un programa para calcular la velocidad de un vehículo. La ventana del programa tendrá
el siguiente diseño:
F d ió Códi Lib D i i
El programa funcionará de la siguiente forma:
- El usuario introducirá un Espacio y un Tiempo, y al pulsar Enter (actionPerformed) en
cualquiera de los dos cuadros de textos aparecerá la velocidad en la etiqueta de
resultados de color amarillo.
Tendrá que programar por tanto el evento actionPerformed de cada cuadro de texto.
Tanto el diseño como la programación de eventos debe realizarla directamente desde código,
sin usar la ventana de diseño del NetBeans.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
Ejercicio 1
En la ventana hay dos etiquetas. Una de ellas es de color negro y la otra es de color gris. Están
situadas de tal forma que la etiqueta de color negro simula la sombra de la otra etiqueta.
La etiqueta de color gris debe tener asociados los siguientes eventos del ratón:
- mousePressed. Cuando se pulse un botón del ratón sobre la etiqueta, esta debe
moverse de sitio de forma que parezca que se ha pulsado como si fuera un botón
(observa la imagen)
Para conseguir esto, debes colocar la etiqueta gris sobre la etiqueta negra.
Cuando suceda este evento también debes cambiar el texto de la etiqueta por “Está
pulsado”
F d ió Códi Lib D i i
- mouseReleased. Cuando se suelte el botón del ratón, la etiqueta volverá a su
posición normal, y el texto cambiará a “Pulsado”.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
Ejercicio 1
Realice un programa que tenga el siguiente aspecto:
En la ventana hay simplemente un JSlider (deslizador) y una etiqueta que contiene inicialmente
el valor 50.
Se pide lo siguiente:
2. Interesa que cuando se modifique el valor del JSlider, dicho valor aparezca en la
etiqueta. Esto se tiene que realizar programando el evento correspondiente desde
código. Aquí tiene la información necesaria:
3. Interesa que al girar la rueda del ratón cambie el valor del JSlider. Para controlar el
movimiento de la rueda del ratón debe asignar un evento al formulario (this). Aquí tiene
la información necesaria del evento para la rueda del ratón:
PISTA:
El objeto evt pasado como parámetro del evento de la rueda del ratón contiene
información sobre como se ha movido la rueda. Este objeto tiene un método llamado
getUnitsToScroll que devuelve un número entero que indica cuanto se ha movido la
rueda. Este número puede ser positivo o negativo según hacia donde se movió la
rueda.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
Ejercicio 1
La ventana sobre la que trabajamos también tiene sus propios eventos. Estos eventos son los
siguientes:
Todos los eventos llevan como parámetro un objeto evt del tipo WindowEvent.
Teniendo en cuenta esto, realizar un programa cuya ventana tenga únicamente una etiqueta.
Nota: Una forma de desactivar la ventana es hacer clic sobre la barra de tareas. Luego se
puede volver a activar haciendo clic sobre la ventana.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
VECTORES DE COMPONENTES
Ejercicio 1
Cada uno de los botones debe contener como texto un día de la semana.
Al pulsar el botón “Aceptar” debe aparecer en una de las etiquetas el número de botones
activados. También debe aparecer en la otra etiqueta los días de la semana elegidos (activos)
Ejercicio 2
F d ió Códi Lib D i i
Diseñe la ventana totalmente desde código y usando vectores. Tendrá que usar los siguientes
vectores:
Tendrás que construir cada vector y luego tendrás que construir los elementos de dichos
vectores, colocándolos en la ventana.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
VECTORES DE COMPONENTES
Ejercicio 1
Realizar un programa donde aparezcan diez botones conteniendo los números entre el 0 y 9.
Cada vez que se pulse uno de los botones, en un cuadro de texto de la ventana se añadirá el
dígito correspondiente, como si estuvieramos usando una calculadora.
Añadir también un botón “Borrar” (no perteneciente al vector) que permita borrar el contenido
del cuadro de texto.
Se pulsó el 9 y luego
el 5
int vectorx[]={10,40,70,10,40,70,10,40,70,10};
int vectory[]={10,40,70,10,40,70,10,40,70,10};
Y luego se puede aplicar los valores de estos vectores en el momento de usar setBounds:
for (…) {
…
vBotones[i].setBounds(vectorx[i],vectory[i], 20,20);
…
}
F d ió Códi Lib D i i
Ejercicio 2
Se pide hacer un programa que muestre 8 etiquetas, cada una con el nombre de una provincia
andaluza. Estas etiquetas estarán definidas al principio con color azul de fondo y texto negro.
Creará un vector para hacer el programa que contenga las ocho etiquetas (vector de JLabel) y
las situará en el formulario como desee.
- Al hacer clic sobre una etiqueta (mouseClicked), el color de fondo de esta cambiará a
verde, mientras que el color de fondo de todas las demás se colocará en azul (para
cambiar el color de fondo: setBackground y setOpaque)
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
Ejercicio 1
Crear un proyecto Java en NetBeans cuya ventana principal tenga el siguiente aspecto:
(1) Al iniciarse el programa, debe estar activada por defecto la opción Pared Norte.
(2) El botón Asignar asignará el ancho y alto que se haya introducido a la pared que esté
seleccionada en ese momento.
CLASE RECTANGULO
F d ió Códi Lib D i i
CLASE RECTANGULO
Base (double)
Altura (double)
Base – 100
Altura – 50
Métodos:
Métodos set:
Métodos get:
Otros métodos:
Cuadrar – este método debe hacer que la Altura tenga el valor de la Base.
(5) ParedNorte
(6) ParedSur
(7) ParedOeste
(8) ParedEste
Para programar cada botón de la ventana principal, solo tiene que ayudarse dando órdenes a
las cuatro paredes o pidiéndoles información.
F d ió Códi Lib D i i
Ejercicio 2
PRIMERA PARTE
Trabajamos de programador para una empresa de venta por correo. Esta empresa recibe
pedidos de clientes y necesita controlar la situación de cada pedido.
Para facilitar la realización de aplicaciones para esta empresa se decide crear una CLASE de
objetos llamada PEDIDO.
La Clase Pedido permitirá crear objetos de tipo pedido. Estos objetos nos proporcionarán
información sobre el estado del pedido y nos facilitará la programación de los proyectos para la
empresa.
F d ió Códi Lib D i i
CLASE PEDIDO
Métodos set
setArticulo – permite asignar el nombre del artículo al objeto pedido
setUnidades – permite asignar el número de unidades pedidas
setPrecio – permite asignar un precio unidad al artículo del pedido
setGastosEnvio – permite asignar la cantidad de gastos de envío del pedido
setDescuento – permite asignar el tanto por ciento de descuento del pedido
Métodos get
getArticulo – devuelve el nombre del artículo del pedido
getUnidades – devuelve el número de unidades del artículo
getPrecio – devuelve el precio del artículo del pedido
getGastosEnvio – devuelve los gastos de envío del pedido
getDescuento – devuelve el tanto por ciento de descuento del pedido
F d ió Códi Lib D i i
SEGUNDA PARTE
Realizar un proyecto cuya ventana principal tenga el siguiente aspecto:
(9) En el panel “Datos del Pedido” se introducirán los siguientes datos del pedido a enviar:
a. Nombre del Artículo
b. Unidades pedidas
c. Precio unidad del artículo
d. Gastos de envío
e. Tanto Por Ciento de descuento.
(10) Al pulsar el botón “Aceptar Pedido”, todos estos datos deben asignarse a un
objeto llamado ped de tipo Pedido.
(11)Al pulsar el botón “Ver Desglose”, deben aparecer en las distintas etiquetas (de color
verde en la imagen) los siguientes datos del pedido:
(12) Para hacer esto solo tendrá que pedirle información al objeto ped usando sus
métodos get y luego colocar esta información en cada etiqueta.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
POO. HERENCIA
EJERCICIO 1
Interesa crear una etiqueta propia cuya función sea la de mostrar temperaturas.
Propiedades
temperatura – double
Métodos
setTemperatura()
Este método recibe como parámetro un double con la temperatura a mostrar. Esta
temperatura se almacena en la propiedad temperatura.
10 ºC
getTemperatura()
mostrarRangoColor()
Este método asignará un color a la etiqueta según la temperatura que contenga. Aquí
está la escala de colores a usar:
<0 Azul
>= 0 y < 10 Cyan
>= 10 y < 25 Magenta
>= 25 y < 35 Naranja
>= 35 Rojo
cambiarTemperatura()
Este método recibe un valor double como parámetro. Si este valor es positivo, entonces
la temperatura aumenta en este valor. Si el valor es negativo, la temperatura
disminuye.
F d ió Códi Lib D i i
Un ejemplo de uso de una etiqueta de este tipo:
Debe programar la clase EtiquetaTemperatura de forma que herede de las etiquetas normales
de java (JLabel)
EJERCICIO 2
Realiza un proyecto cuya ventana principal tenga el siguiente aspecto:
En la parte superior añadirá (a través de código) una etiqueta del tipo EtiquetaTemperatura,
que estará inicializada a 0 ºC
En la parte inferior añadirá tres botones y un cuadro de texto (esto lo puede hacer desde la
ventana de diseño). Cada vez que se pulse el botón +, la temperatura de la etiqueta aumentará
en la cantidad de grados indicados en el cuadro de texto. Y cuando se pulse el botón -, la
temperatura disminuirá.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
Planteamiento Inicial
Todos los proyectos que hacemos en el trabajo tienen que llevar un cuadro de diálogo de
presentación que contenga:
Resulta un rollo tener que programar el cuadro de presentación cada vez que nos encargan un
nuevo proyecto, así que programaremos una Clase Propia que derive de la clase JDialog, y
que represente un cuadro de diálogo que contenga el nombre del programa, la versión y el
programador.
Gracias a esta clase que vamos a programar, no tendremos que perder tiempo cada vez que
necesitemos añadir una presentación a los futuros proyectos que hagamos en la empresa.
Clase DialogoPresentacion
Se programará una clase propia que se llamará DialogoPresentacion. Esta clase será un
cuadro de diálogo, o, dicho de otra forma, heredará de la clase JDialog.
F d ió Códi Lib D i i
Todos estos elementos están dentro de un JPanel al que se le ha asignado un borde con
relieve.
setNombrePrograma
(4) Recibirá una cadena con el nombre del programa, y esta cadena se introducirá en la
etiqueta etiNombrePrograma.
setVersion
(5) Recibirá una cadena con la versión del programa, y esta cadena se introducirá en la
etiqueta etiVersion.
setNombreProgramador
(6) Recibirá una cadena con el nombre del programador, y esta cadena se introducirá en la
etiqueta etiNombreProgramador.
Cuando el usuario pulse el botón “Empezar”, lo único que tiene que suceder es que se cierre el
cuadro de diálogo.
Proyecto Ejemplo
Este proyecto debe incluir una presentación que aparezca al principio. Esta pantalla de
presentación debe contener los siguientes datos:
Tendrá por supuesto, que incluir la clase DialogoPresentacion en su proyecto, y crear un objeto
del tipo DialogoPresentacion. Debe asignar a este objeto los tres datos: nombre del programa,
versión y programador. Y hacer que aparezca la presentación cuando se ejecute el programa.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA
PROGRAMACIÓN MDI
Planteamiento Inicial
Se pretende realizar un programa capaz de abrir ficheros de texto (.txt). Este programa será
MDI, es decir, será capaz de abrir varios ficheros, mostrando sus contenidos en distintas
ventanas.
F d ió Códi Lib D i i
Ventana Principal
La ventana principal del programa constará de un menú con las siguientes opciones:
Archivo
Abrir
Cerrar
Cerrar Todos
Salir
Ventana
Cascada
Mosaico Horizontal
Mosaico Vertical
panelInterno
(JDesktopPane)
Ventana Interna
Debe añadir a su proyecto una clase JInternalFrame para diseñar las ventanas internas.
Una ventana interna constará únicamente de un objeto JTextPane que ocupará toda la
ventana.
Los objetos JTextPane son similares a los cuadros de texto (JTextField) con la diferencia de
que pueden contener grandes cantidades de texto en varias líneas. Llame al objeto JTextPane
con el nombre txtTexto.
F d ió Códi Lib D i i
txtTexto
(JTextPane)
Estas ventanas internas contendrán el texto del fichero que se abra. Para facilitar la tarea de
abrir un fichero y colocar su texto en la ventana interna debe añadir el siguiente método a la
clase ventana interna:
Este método recibe el camino de un fichero, y coloca dentro del JTextPane (el panel de texto)
el texto contenido en el fichero. Aunque no es necesario entender el código de este método, en
la parte final del enunciado se da una explicación de su funcionamiento.
F d ió Códi Lib D i i
Opciones principales del programa
Se comenta a continuación la forma en que deben funcionar las distintas opciones del
programa:
Si el usuario selecciona un fichero, entonces tendrá que crear una ventana interna llamada por
ejemplo vi, y mostrarla en el panel Interno.
vi.ponerTexto(caminoficheroseleccionado)
Al abrir un fichero de texto en una ventana, deberá aparecer el camino del fichero en la barra
de título de la ventana interna.
F d ió Códi Lib D i i
Opción Ventana – Mosaico Horizontal
Esta opción hará visible todas las ventanas mostrándolas en horizontal, ocupando todo el panel
interno.
Para ello, tendrás que obtener el tamaño vertical del panel interno, y dividirlo por el número de
ventanas abiertas en él. Esa cantidad será la altura de cada ventana.
Una vez calculado el ancho y alto de cada ventana debes colocar cada ventana una debajo de
otra.
F d ió Códi Lib D i i
F d ió Códi Lib D i i
Opción Ventana – Mosaico Vertical
Esta opción hará visible todas las ventanas mostrándolas en vertical, ocupando todo el panel
interno.
Para ello, tendrás que obtener el tamaño horizontal del panel interno, y dividirlo por el número
de ventanas internas abiertas en él. Esa cantidad será el ancho de cada ventana.
Una vez calculado el ancho y alto de cada ventana debes colocar cada ventana una al lado de
otra.
F d ió Códi Lib D i i
EXPLICACIÓN MÉTODO ponerTexto
Para realizar este ejercicio es necesario añadir a la clase de la ventana interna el siguiente
método. No es necesario entender el código de este procedimiento para hacer el ejercicio, pero
en cualquier caso, aquí hay una explicación de este:
Este método recibe un camino de fichero de texto y muestra dentro de un JTextPane el texto
que contiene dicho fichero.
- Se crea un objeto File a partir del camino del fichero (El camino del fichero es un
String)
- Se engancha al objeto File un objeto del tipo FileReader. (Los objetos FileReader son
canales de lectura, que permiten extraer información del fichero)
- Se engancha al canal FileReader un objeto BufferedReader. (Los objetos
BufferedReader dan facilidad al programador para extraer el texto del fichero)
- Finalmente, a través del método readLine del objeto BufferedReader se pueden extraer
una a una las líneas de texto del fichero.
- Una vez finalizado el trabajo con el fichero se cierra el canal FileReader y el canal
BufferedReader.
La creación de un objeto File a partir del camino del fichero se hace con la siguiente
instrucción:
F d ió Códi Lib D i i
FileReader lectura = new FileReader(fi);
Una vez hecho esto, tenemos un objeto llamado entrada del tipo BufferedReader que posee un
método llamado readLine que permite leer una línea de texto del fichero. A través de este
método vamos leyendo líneas de texto del fichero.
Hay que tener en cuenta que si al usar readLine obtenemos el valor null, es que ya no hay más
texto en el fichero.
Todo esto se aprovecha para crear una cadena larga con el contenido del fichero:
String linea;
String texto="";
linea = entrada.readLine();
while(linea!=null) {
texto = texto+linea+"\n";
linea = entrada.readLine();
}
El código anterior crea una variable texto que contiene el texto completo del fichero. Este
código extrae una a una las líneas de texto del fichero y las va concatenando en la variable
texto.
Como hemos terminado con la manipulación del fichero, es bueno cerrar los canales de
comunicación con el fichero (el canal FileReader y el canal BufferedReader creados):
entrada.close();
lectura.close();
txtTexto.setText(texto);
Todo esto debe estar dentro de un try ... catch ya que es un código susceptible de tener errores
de ejecución (es decir, de lanzar excepciones)
F d ió Códi Lib D i i
PROGRAMACIÓN
MODELO E-R
Una empresa necesita un programa para controlar las ventas que realiza diariamente.
La empresa tiene una lista de clientes cuyos datos quiere controlar. Los datos que la empresa
quiere guardar de cada cliente es : el CIF, el nombre, la ciudad y un teléfono de contacto.
La empresa tiene una serie de comerciales que son los que realizan las ventas. La empresa
quiere controlar la información de sus comerciales. Concretamente necesita almacenar de ellos
sus nombres y apellidos y su móvil. A cada comercial se le asigna un número en la empresa
para distinguirlos.
Diariamente, los comerciales realizan ventas de productos a los clientes. Interesa almacenar
información sobre dichas ventas. De cada venta interesa almacenar el nombre del producto
que se vende, las unidades vendidas del artículo, el precio del producto y la fecha en que se
efectuó la venta. También interesa saber la forma de pago.
Una venta en concreto se realiza a un solo cliente. Por otro lado, un cliente comprará muchas
cosas a la empresa. Es decir, se le pueden hacer muchas ventas a un cliente.
SE PIDE :
F d ió Códi Lib D i i
SUPUESTO Nº 2. « TRANSPORTES »
Una empresa cuenta con una serie de camiones que usa para transportar diversos productos.
La empresa necesita un programa que gestione toda la información producida por esta
actividad.
Concretamente, la empresa necesita almacenar información sobre los camiones que posee.
Necesita almacenar la matrícula de cada camión, la marca y el modelo y el año de compra.
Por otro lado, la empresa tiene una serie de conductores. De cada conductor se quiere
almacenar el nombre, los apellidos, el móvil y el sueldo que gana. A cada conductor se le
asigna un número en la empresa. No hay dos conductores con dos números iguales.
Cada transporte concreto está encargado por un cliente. A la empresa le interesa tener
información de los clientes que encargan transportes. La información que interesa almacenar
de cada cliente es : el CIF del cliente, el nombre de la empresa, la dirección de la empresa, el
teléfono de la empresa.
En cada transporte participa un solo conductor, y, por supuesto, un conductor realiza muchos
transportes mientras trabaja para la empresa.
Cada transporte está encargado por un solo cliente. Pero ten en cuenta que un cliente puede
encargar muchos transportes.
SE PIDE :
F d ió Códi Lib D i i
SUPUESTO Nº 3. « MEDICIONES »
Una empresa química realiza mediciones constantemente de los materiales que contiene la
tierra de distintas parcelas de cultivo, y le interesaría tener un control de toda la información
que esto genera. Para ello le encargan un programa para gestionar esta información.
A esta empresa le interesaría guardar información sobre cada medición que se hace. Interesa
almacenar lo siguiente: fecha en que se hace la medición, hora, temperatura ambiente en el
momento de hacer la medición, humedad del aire y un comentario sobre la medición (en este
comentario se indicará el resultado de la medición) Cada medición se numera, de forma que no
puede haber dos mediciones con el mismo número.
Las mediciones las realizan químicos especializados contratados por la empresa. Esta
empresa desea almacenar los datos de estos químicos: nombre, apellidos y teléfono de
contacto.
Un químico realiza muchas mediciones, pero una medición la realiza solo un químico.
En un mismo terreno se pueden realizar diversas mediciones, pero tenga en cuenta que una
medición está realizada en un solo terreno.
SE PIDE :
F d ió Códi Lib D i i
SUPUESTO Nº4. “REVISIONES MÉDICAS”
De cada revisión interesa almacenar la fecha y hora en que se hizo, peso y altura del paciente
y otros resultados de dicha revisión. Cada revisión se numera de forma que no haya dos
revisiones con el mismo número.
Cada revisión se realiza a un solo paciente, aunque a un paciente se le pueden hacer varias
revisiones mientras está ingresado.
Los médicos realizan revisiones a sus pacientes. Hay que tener en cuenta que un mismo
médico puede realizar revisiones a distintos pacientes, pero un paciente tiene asignado un solo
médico para las revisiones.
SE PIDE :
F d ió Códi Lib D i i
PROGRAMACIÓN
TRASPASO A TABLAS
Introduzca luego algunos datos en las tablas. Invéntese los datos, pero procure que tengan
cierto sentido. Tenga en cuenta que los datos correspondientes a las claves y claves foráneas
tendrán que coincidir para que la base de datos tenga coherencia.
SUPUESTO Nº 2. « TRANSPORTES »
Introduzca luego algunos datos en las tablas. Invéntese los datos, pero procure que tengan
cierto sentido. Tenga en cuenta que los datos correspondientes a las claves y claves foráneas
tendrán que coincidir para que la base de datos tenga coherencia.
SUPUESTO Nº 3. « MEDICIONES »
Introduzca luego algunos datos en las tablas. Invéntese los datos, pero procure que tengan
cierto sentido. Tenga en cuenta que los datos correspondientes a las claves y claves foráneas
tendrán que coincidir para que la base de datos tenga coherencia.
Introduzca luego algunos datos en las tablas. Invéntese los datos, pero procure que tengan
cierto sentido. Tenga en cuenta que los datos correspondientes a las claves y claves foráneas
tendrán que coincidir para que la base de datos tenga coherencia.
F d ió Códi Lib D i i
PROGRAMACIÓN
SUPUESTO Nº 1 « LIMUSINAS »
Por un lado se quiere almacenar la información de los clientes que solicitan el uso de una
limusina. Se almacenará el nombre, apellidos, DNI y teléfono del cliente.
Por otro lado se quiere almacenar la información de las distinas limusinas propiedad de la
empresa. Se almacenará la matrícula, la marca y el modelo.
Una limusina es alquilada por muchos clientes (en momentos distintos claro está, un día la
alquila un cliente y otro día la alquila otro)
Por otro lado, un cliente alquila muchas limusinas (en momentos distintos también, un día
alquila una limusina, y a la semana siguiente puede alquilar otra, etc)
Interesa saber la fecha en que un cliente alquila una limusina, y el nombre del chófer que
condujo en el viaje.
SE PIDE :
(8) Este supuesto produce una relación Muchas a Muchas entre las entidades limusinas y
clientes. Represente dicha relación.
(9) A continuación identifique la entidad intermedia que elimina la relación Muchas a
Muchas.
(10)Añada los atributos que considere necesarios a la entidad intermedia.
(11)Realice el Modelo Entidad Relación completo del supuesto teniendo en cuenta la nueva
entidad introducida y sus atributos.
(12)Realice el traspaso a tabla de dicho modelo.
F d ió Códi Lib D i i
SUPUESTO Nº 2 « RESERVAS HOTEL »
Un hotel quiere guardar un histórico con todas las reservas realizadas en el hotel por sus
clientes. Concretamente se quiere guardar lo siguiente :
Información sobre sus clientes : nombre del cliente, apellidos, DNI y país.
Un cliente puede haber reservado varias habitaciones (no tiene por qué ser a la vez : un verano
puede alojarse en la habitación nº 124, pero al verano siguiente puede alojarse en la habitación
nº 535 del mismo hotel)
En una habitación se alojan muchos clientes (no a la vez, claro está : una semana está alojado
el cliente Juan González y a la semana siguiente está alojado el cliente Ana Pérez)
SE PIDE :
(13)Este supuesto produce una relación Muchas a Muchas entre las entidades
habitaciones y clientes. Represente dicha relación.
(14)A continuación identifique la entidad intermedia que elimina la relación Muchas a
Muchas.
(15)Añada los atributos que considere necesarios a la entidad intermedia.
(16)Realice el Modelo Entidad Relación completo del supuesto teniendo en cuenta la nueva
entidad introducida y sus atributos.
(17)Realice el traspaso a tabla de dicho modelo.
F d ió Códi Lib D i i
SUPUESTO Nº 3 « TALLER MECÁNICO »
Un taller mecánico quiere guardar información sobre todas las reparaciones que se realizan en
él. Para ello se quiere guardar información sobre lo siguiente :
Coches : Interesa almacenar la información de los coches que han sido reparados en el taller.
Se almacenará la matrícula, marca y modelo del coche.
Debes tener en cuenta que un mecánico repara muchos coches (no a la vez, se supone,
primero uno y luego otro)
Por otro lado, un coche puede ser reparado por varios mecánicos (es de suponer que un coche
puede sufrir varias averías a lo largo de su vida, y cada una de estas avería puede ser
reparada por un mecánico distinto)
Interesa almacenar también el coste de cada reparación, así como el número de horas que se
usaron para hacer la reparación.
SE PIDE :
(16)Este supuesto produce una relación Muchas a Muchas. Represente dicha relación.
(17)A continuación identifique la entidad intermedia que elimina la relación Muchas a
Muchas.
(18)Añada los atributos que considere necesarios a la entidad intermedia.
(19)Realice el Modelo Entidad Relación completo del supuesto teniendo en cuenta la nueva
entidad introducida y sus atributos.
(20)Realice el traspaso a tabla de dicho modelo.
F d ió Códi Lib D i i
SUPUESTO Nº 4 « VIDEOCLUB »
Un videoclub quiere almacenar información sobre los alquileres de películas que se hicieron. Le
interesa almacenar información sobre las películas y sobre sus socios :
Películas : se almacenará el número del DVD (no hay dos DVD con el mismo número), el título
de la película que contiene, el nombre del director y el tipo de película.
Socios : se almacenará el número de socio (no hay dos socios con el mismo número), el
nombre y apellidos del socio, su teléfono y dirección.
Hay que tener en cuenta que una película se alquila a muchos socios (No a la vez, claro está :
el DVD es alquilado a un socio, y cuando este lo devuelve, se vuelve a alquilar a otro, y así
sucesivamente)
Por otro lado, un socio alquila muchas películas (No a la vez, claro está : primero alquila una, y
al día siguiente alquila otra, y así sucesivamente)
Interesaría almacenar también la fecha en que produce cada alquiler y lo que pagó el socio por
el alquiler.
SE PIDE :
(36)Este supuesto produce una relación Muchas a Muchas. Represente dicha relación.
(37)A continuación identifique la entidad intermedia que elimina la relación Muchas a
Muchas.
(38)Añada los atributos que considere necesarios a la entidad intermedia.
(39)Realice el Modelo Entidad Relación completo del supuesto teniendo en cuenta la nueva
entidad introducida y sus atributos.
(40)Realice el traspaso a tabla de dicho modelo.
F d ió Códi Lib D i i
PROGRAMACIÓN
En las hojas de ejercicios anteriores ha diseñado las bases de datos para distintos supuestos.
Ha realizado el Modelo Entidad – Relación y luego ha realizado el traspaso a Tablas.
Ahora se pide que cree las bases de datos correspondientes a dichos traspasos a Tablas en
Access para los siguientes supuestos de hojas anteriores:
SUPUESTO « TRANSPORTES »
SUPUESTO « MEDICIONES »
Crear un fichero de base de datos llamado HOTEL usando el programa Access. Introducir en él
las tablas diseñadas para este supuesto. Introducir algunos datos en las tablas (Intente que los
datos sean coherentes)
Crear un fichero de base de datos llamado TALLER usando el programa Access. Introducir en
él las tablas diseñadas para este supuesto. Introducir algunos datos en las tablas (Intente que
los datos sean coherentes)
F d ió Códi Lib D i i
PROGRAMACIÓN
Entre en la base de datos MANEMPSA (usada en las hojas de ejercicios guiados) y añada
registros a las tablas hasta que estas queden así:
Tabla Trabajadores
Tabla Coches
Tabla Clientes
Tabla Servicios
F d ió Códi Lib D i i
Ahora, realice las siguientes consultas en la base de datos. Guarde cada una con el nombre
que se indica. Se recomienda que compruebe cada consulta antes de guardarla.
En ella deben aparecer los campos fecha del servicio, tipo, cantidad y comentario de
aquellos servicios cuyo tipo sea Limpieza.
En ella deben aparecer los campos número del servicio, fecha, tipo y cantidad de
aquellos servicios que hayan costado menos de 180 euros.
En ella deben aparecer los campos número del servicio, fecha, tipo y cantidad de
aquellos servicios que fueron realizados antes del 1 – 1 – 2006
En ella deben aparecer los campos número de servicio, cantidad, tipo y comentario de
todos aquellos servicios que fueron de fontanería y costaron 250 o más euros.
En ella deben aparecer los campos número de servicio, cantidad, tipo y comentario de
los servicios de Fontanería y los servicios de Electricidad.
En ella deben aparecer los campos fecha del servicio, cantidad, tipo, comentario,
nombre y apellidos del trabajador y nombre del cliente de aquellos servicios que sean
del tipo Electricidad.
Debes tener en cuenta que los campos nombre y apellidos del trabajador pertenecen a
la tabla Trabajadores, mientras que el nombre del cliente pertenece a la tabla Clientes.
Los demás campos pertenecen a la tabla Servicios.
F d ió Códi Lib D i i
(27)Crear una consulta llamada Servicios realizados por Juan
En ella deben aparecer los campos fecha del servicio, cantidad, tipo, comentario,
nombre del cliente y nombre y apellidos del trabajador de todos aquellos servicios
realizados por el trabajador con DNI 12.321.567-B
Ten en cuenta que tendrás que usar varias tablas para hacer la consulta.
En ella deben aparecer los campos fecha del servicio, tipo, cantidad, nombre del
cliente y nombre y apellidos del trabajador de todos aquellos servicios que se hayan
realizado a una Academia (es decir, el nombre del cliente debe contener la palabra
“academia”)
En ella aparecerán los campos fecha del servicio, tipo, cantidad, apellidos del
trabajador, nombre del cliente, CIF del cliente de todos aquellos servicios que se hayan
realizado entre el 1 del 1 de 2006 y el 31 del 12 del 2006
En ella aparecerán los campos fecha del servicio, tipo, cantidad, nombre del cliente,
dirección del cliente, DNI del trabajador para todos aquellos servicios realizados en la
calle Larga.
En ella deben aparecer los campos fecha del servicio, tipo cantidad, nombre y apellidos
del trabajador y fecha de entrada del trabajador de todos aquellos servicios realizados
por los trabajadores que entraron en la empresa a partir del 1 – 1 – 2006.
Para crear esta consulta tienes que usar las tablas Trabajadores y Servicios.
En ella deben aparecer los campos CIF, nombre del cliente, dirección del cliente de
todos aquellos clientes que gestionen seguros (deben contener en el nombre la palabra
“seguros”)
En ella deben aparecer los campos CIF, nombre del cliente, dirección del cliente y
teléfono fijo de todos aquellos clientes que sean academias o papelerías.
En ella deben aparecer los campos matrícula, marca y modelo de los seat de la
empresa. También interesa que aparezca el nombre y apellido del conductor de cada
coche.
F d ió Códi Lib D i i
(35)Crear una consulta llamada Servicios realizados con CITROEN
En ella debe aparecer el listado de servicios que han sido realizados usando alguno de
los citroen de la empresa.
En esta consulta deben aparecer los siguientes campos: matrícula del vehículo, marca
y modelo. Nombre y apellidos del trabajador que hizo el servicio. Nombre y dirección
del cliente al que se le hizo el servicio. Tipo de servicio y cantidad.
F d ió Códi Lib D i i
PROGRAMACIÓN
EJERCICIO 1
Las siguientes consultas son las realizadas en la hoja anterior. Se le pide al alumno que vuelva
a hacer dichas consultas pero esta vez usando el lenguaje SQL (se le ha añadido a los
nombres la palabra SQL para distinguirlas de las consultas de la hoja anterior)
En ella deben aparecer los campos fecha del servicio, tipo, cantidad y comentario de
aquellos servicios cuyo tipo sea Limpieza.
En ella deben aparecer los campos número del servicio, fecha, tipo y cantidad de
aquellos servicios que hayan costado menos de 180 euros.
En ella deben aparecer los campos número del servicio, fecha, tipo y cantidad de
aquellos servicios que fueron realizados antes del 1 – 1 – 2006
En ella deben aparecer los campos número de servicio, cantidad, tipo y comentario de
todos aquellos servicios que fueron de fontanería y costaron 250 o más euros.
En ella deben aparecer los campos número de servicio, cantidad, tipo y comentario de
los servicios de Fontanería y los servicios de Electricidad.
En ella deben aparecer los campos fecha del servicio, cantidad, tipo, comentario,
nombre y apellidos del trabajador y nombre del cliente de aquellos servicios que sean
del tipo Electricidad.
Debes tener en cuenta que los campos nombre y apellidos del trabajador pertenecen a
la tabla Trabajadores, mientras que el nombre del cliente pertenece a la tabla Clientes.
Los demás campos pertenecen a la tabla Servicios.
En ella deben aparecer los campos fecha del servicio, cantidad, tipo, comentario,
nombre del cliente y nombre y apellidos del trabajador de todos aquellos servicios
realizados por el trabajador con DNI 12.321.567-B
F d ió Códi Lib D i i
Ten en cuenta que tendrás que usar varias tablas para hacer la consulta.
En ella deben aparecer los campos fecha del servicio, tipo, cantidad, nombre del
cliente y nombre y apellidos del trabajador de todos aquellos servicios que se hayan
realizado a una Academia (es decir, el nombre del cliente debe contener la palabra
“academia”)
En ella aparecerán los campos fecha del servicio, tipo, cantidad, apellidos del
trabajador, nombre del cliente, CIF del cliente de todos aquellos servicios que se hayan
realizado entre el 1 del 1 de 2006 y el 31 del 12 del 2006
En ella aparecerán los campos fecha del servicio, tipo, cantidad, nombre del cliente,
dirección del cliente, DNI del trabajador para todos aquellos servicios realizados en la
calle Larga.
En ella deben aparecer los campos fecha del servicio, tipo cantidad, nombre y apellidos
del trabajador y fecha de entrada del trabajador de todos aquellos servicios realizados
por los trabajadores que entraron en la empresa a partir del 1 – 1 – 2006.
Para crear esta consulta tienes que usar las tablas Trabajadores y Servicios.
En ella deben aparecer los campos CIF, nombre del cliente, dirección del cliente de
todos aquellos clientes que gestionen seguros (deben contener en el nombre la palabra
“seguros”)
En ella deben aparecer los campos CIF, nombre del cliente, dirección del cliente y
teléfono fijo de todos aquellos clientes que sean academias o papelerías.
En ella deben aparecer los campos matrícula, marca y modelo de los seat de la
empresa. También interesa que aparezca el nombre y apellido del conductor de cada
coche.
En ella debe aparecer el listado de servicios que han sido realizados usando alguno de
los citroen de la empresa.
F d ió Códi Lib D i i
En esta consulta deben aparecer los siguientes campos: matrícula del vehículo, marca
y modelo. Nombre y apellidos del trabajador que hizo el servicio. Nombre y dirección
del cliente al que se le hizo el servicio. Tipo de servicio y cantidad.
Realice también estas otras consultas usando el lenguaje SQL (asígneles el nombre que
quiera):
La condición es que no tengan teléfono 2 (dicho de otra forma, que el campo teléfono 2
sea nulo)
La condición es que vivan en una calle, es decir, que su dirección comience por “C/”
Condición: ninguna.
(7) Mejore la consulta anterior de forma que también se muestre el nombre del trabajador
que conduce cada coche.
F d ió Códi Lib D i i
(8) Se pide mostrar un listado de servicios con las siguientes características:
Condición: mostrar los servicios de limpieza que hayan costado menos de 250 euros.
(9) Mejore la consulta anterior de forma que también se muestre la dirección donde se hizo
el servicio.
F d ió Códi Lib D i i
PROGRAMACIÓN
PREPARACIÓN
Los ejercicios que vienen a continuación modificarán el contenido de las tablas. En el caso de
equivocación es posible perder todos los datos contenidos en la tabla con la que se está
trabajando. Para evitar problemas, se harán copias de las tablas y se trabajará con las copias.
En este ejercicio de preparación se explica brevemente como realizar una copia de una tabla.
Siga los pasos que se indican a continuación:
(14)En la zona de tablas, haga clic con el botón derecho sobre la tabla Trabajadores y
active la opción Copiar.
(15)En una zona en blanco haga clic con el botón derecho y active la opción Pegar.
(16)Aparecerá un cuadro de diálogo indicando que va a copiar una tabla. Tiene que indicar
el nombre que tendrá la copia. En nuestro ejemplo, el nombre será Trabajadores2.
Pulse aceptar.
(17)Si todo ha ido bien, verás que ha aparecido una nueva tabla llamada Trabajadores2. Si
la abres, observarás que su contenido es el mismo que Trabajadores.
EJERCICIO:
Clientes Clientes2
Coches Coches2
Servicios Servicios2
(Nota: para los siguientes ejercicios usaremos las copias de las tablas, para así mantener
intacto el contenido de las tablas originales)
F d ió Códi Lib D i i
INSERCIÓN DE REGISTROS
EJERCICIOS:
Rosa González, con DNI 11.567.789-D, cobra 1100,60 euros y entró en la empresa el 2
de marzo del 2006. No tiene asignado un coche.
Benito Rodríguez, con DNI 56.456.345-W, cobra 500 euros y entró en la empresa el 10
de Diciembre de 2005. El coche que tiene asignado tiene de matrícula 4454-EEE
SEAT Córdoba con matrícula 4454-EEE. Año 2004. Está asignado al trabajador con
DNI 56.456.345-W
MODIFICACIÓN DE REGISTROS
EJERCICIOS:
(51)Se pide asignar a los trabajadores de la tabla Trabajadores2 que hayan entrado antes
del año 2005 un sueldo de 1400 euros.
(52)En la tabla Trabajadores2 asigne al trabajador con DNI 33.987.987-F el coche con
matrícula 4454-EEE.
(53)La trabajadora llamada Ana ha sido suspendida de empleo. Asigne un valor 0 al sueldo
de esta trabajadora en la tabla Trabajadores2.
(55)Se han detectado algunos errores de datos en el cliente con CIF B44556666.
Concretamente, el nombre del cliente es Seguros La Cruz, su dirección es C/Lealas 10,
y su teléfono fijo es el 956 30 90 90. Se pide que en la tabla Clientes2 haga dichos
cambios a dicho cliente.
F d ió Códi Lib D i i
ELIMINACIÓN DE REGISTROS
(41)Eliminar de la tabla Servicios2 a todos los servicios del año 2004 (es decir, cuya fecha
esté comprendida entre 1-1-2004 y 31-12-2004)
(43)Eliminar de la tabla Servicios2 aquellos servicios en los que se haya instalado algún
recambio (es decir, que el campo comentario contenga la palabra “recambio”)
(45)En la tabla Clientes2, eliminar a todos los clientes que no tengan móvil (es decir, que
el campo móvil sea nulo)
(46)En la tabla Clientes2, eliminar a todos los clientes que tengan una empresa de seguros
(es decir, que contengan la palabra “seguros” en el nombre del cliente)
EJERCICIO FINAL
Para la realización de los ejercicios anteriores se han hecho copias de las tablas de la base de
datos. Una vez realizados dichos ejercicios estas tablas no son necesarias. Puede borrarlas
simplemente haciendo clic con el botón derecho sobre ellas y activar la opción eliminar.
F d ió Códi Lib D i i
PROGRAMACIÓN
EJERCICIO 1
Debe aparecer la marca, modelo y año de cada coche, y además deben aparecer
ordenados por año ascendentemente.
Debe aparecer el CIF del cliente, el nombre y la dirección. Los clientes deben aparecer
ordenados por nombre.
Debe aparecer el tipo de servicio, la cantidad del servicio y el CIF del cliente. Deben
aparecer ordenados por cantidad de mayor a menor.
Debe aparecer el número del servicio, el DNI del trabajador que realizó el servicio, el
tipo de servicio y el coste. Debe aparecer ordenado por número de servicio de menor a
mayor.
F d ió Códi Lib D i i
Este botón es igual que el anterior, solo que en vez de mostrar los servicios de limpieza
se tienen que mostrar los servicios de electricidad.
Cuando se pulse este botón, interesa que aparezca en un JOptionPane la suma de las
cantidades de todos los servicios realizados.
Cuando se pulse este botón interesa que aparezca en un JOptionPane los datos del
quinto servicio realizado.
Interesa que aparezca el número del servicio, el tipo de servicio y el coste de dicho
servicio.
Cuando se pulse este botón interesa que aparezca en un JOptionPane un listado con
los servicios de fontanería.
Interesa que aparezca el nombre y apellidos del trabajador que hizo el servicio, el tipo
de servicio y el coste del servicio.
Cuando se pulse este botón interesa que aparezca en un JOptionPane un listado con
los servicios con una cantidad menor de 200 euros.
Interesa que aparezca el nombre del trabajador que hizo el servicio, el tipo de servicio,
el coste y el nombre del cliente al que se le hizo el servicio. Haz que el listado salga
ordenado por coste de mayor a menor.
F d ió Códi Lib D i i
PROGRAMACIÓN
EJERCICIO 1
Concretamente deben aparecer el nombre, apellidos, sueldo, fecha de entrada y matrícula del
coche que conduce.
El listado debe aparecer ordenado por fechas ascendentemente (es decir, primero los
trabajadores con más antigüedad, y luego los más recientes)
F d ió Códi Lib D i i
Si el trabajador no tuviera asignada un coche, en el campo matrícula debería aparecer la
cadena “sin coche”.
La fecha debe aparecer en formato: Dia del Mes del Año. Por ejemplo: 3 del 5 del 2001
F d ió Códi Lib D i i
PROGRAMACIÓN
Realizar una pequeña aplicación de base de datos que maneje la base de datos MANEMPSA.
Al pulsar este botón aparecerá en el JTextPane el listado con todos los servicios realizados por
la empresa ordenados por fecha de forma ascendente.
Deben aparecer en el listado los siguientes campos: fecha del servicio, tipo, coste y
comentario.
Al pulsar el botón “Mayor que” aparecerá el listado de servicios cuyo coste sea mayor a dicha
cantidad.
Al pulsar el botón “Menor que” aparecerá el listado de servicios cuyo coste sea menor a dicha
cantidad.
Al pulsar el botón “Igual a” aparecerá el listado de servicios cuyo coste sea igual a dicha
cantidad.
Al pulsar el botón “Distinto de” aparecerá el listado de servicios cuyo coste sea distinto a dicha
cantidad.
F d ió Códi Lib D i i
Al pulsar el botón “Igual a”, el programa mostrará el listado de servicios cuyo tipo sea igual al
texto introducido.
Por ejemplo, si el usuario introduce el texto “Limpieza”, el programa mostrará los servicios cuyo
tipo sea igual a “Limpieza”.
Al pulsar el botón “Contiene a”, el programa mostrará el listado de servicios cuyo tipo contenga
el texto del cuadro de texto.
Por ejemplo, si el usuario introduce el texto “ía”, el programa mostrará el listado de servicios de
Fontanería, Carpintería, etc. Es decir, todos los servicios que contengan “ía” en el tipo.
(42)Un cuadro de texto para el día, otro para el mes y otro para el año.
(43)Un botón “Anterior a”
(44)Un botón “Posterior a”
(45)Un botón “En el año”
Luego, si el usuario pulsa el botón Anterior a el programa mostrará el listado de servicios que
hayan sido anteriores a la fecha indicada.
Si el usuario pulsa Posterior a el programa mostrará el listado de servicios que hayan sido
posteriores a la fecha indicada.
Si el usuario pulsa el botón En el año, el programa mostrará el listado de servicios que hayan
sido realizados en el año indicado en el cuadro año. (En este caso no se tienen en cuenta los
cuadros día y mes)
F d ió Códi Lib D i i
PROGRAMACIÓN
ALTAS DE REGISTROS
Realizar una pequeña aplicación de base de datos que maneje la base de datos MANEMPSA.
Al pulsar este botón, aparecerá en un panel de texto el listado de coches de la empresa. Deben
aparecer todos los campos de los coches.
Este panel contendrá una serie de cuadros de texto que permitirán introducir los datos de un
nuevo coche que se quiera añadir.
Dentro del panel también tendremos un botón Alta que al ser pulsado efectuará la introducción
del nuevo coche en la tabla.
Al pulsarse el botón Alta, deberá mostrarse el contenido de la tabla coches en el panel, y allí
deberá aparecer el listado incluyendo el nuevo coche introducido.
(El código del botón Alta deberá construir una consulta SQL válida del tipo INSERT INTO que
permita introducir los datos del nuevo coche)
F d ió Códi Lib D i i
PROGRAMACIÓN
BAJA DE REGISTROS
Al pulsar el botón Eliminar coche, se borrará de la tabla el coche cuya matrícula se haya escrito
en el cuadro de texto.
F d ió Códi Lib D i i
PROGRAMACIÓN
MODIFICACIÓN DE REGISTROS
(20)Un panel de modificación que contenga un cuadro de texto por campo de la tabla
coches (Este panel será muy parecido al panel de introducción de coches)
(21)Un botón Buscar al lado del cuadro de texto de la matrícula.
(22)Un botón Efectuar Modificación.
El usuario tendrá que introducir una matrícula y luego pulsará el botón Buscar. Al pulsar este
botón, el programa rellenará los cuadros de texto con los datos del coche que tenga dicha
matrícula. Si no existe un coche con dicha matrícula entonces el programa mostrará un
mensaje de error.
Una vez rellenos los cuadros de texto con los datos del coche, el usuario realizará
modificaciones en dichos datos y luego pulsará el botón Efectuar Modificación.
Al pulsar este botón se efectuará la modificación de los datos de este coche en la tabla coches
y se presentará el listado completo de la tabla coches en el panel del programa.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA – JTABLE
EJERCICIO Nº1
Se pide que realice una aplicación que muestre una tabla con las siguientes columnas:
Este botón añadirá una nueva fila a la tabla con los siguientes valores:
Este botón eliminará la fila donde que esté seleccionada en ese momento.
Este botón mostrará en un JOptionPane la nota media del alumno de la fila que esté
seleccionada. También debe indicar en ese JOptionPane si el alumno ha aprobado o
no.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA – JTABLE
EJERCICIO Nº1
Realiza un programa que contenga un JTable y un botón. El botón tendrá el texto “Clientes” y al
pulsarse se mostrará en la tabla el contenido de la tabla clientes de la base de datos
MANEMPSA.
EJERCICIO Nº2
Realiza un programa igual al anterior pero que permita mostrar el contenido de la tabla
servicios de la base de datos MANEMPSA.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA – JTABLE
EJERCICIO Nº1
Realiza un programa que permita realizar Altas, Bajas y Modificaciones en la tabla clientes de
la base de datos MANEMPSA.
Este programa debe mostrar en todo momento un JTable con el contenido actualizado de la
tabla clientes.
El programa debe tener tres botones. Un botón Eliminar, otro botón Nuevo Cliente y un botón
Modificar Cliente.
Al pulsar Nuevo Cliente aparecerá un cuadro de diálogo donde el usuario introducirá los datos
de un nuevo cliente.
Al pulsar Modificar Cliente aparecerá un cuadro de diálogo donde el usuario podrá cambiar los
datos del cliente que haya seleccionado en el JTable.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA – JTABLE
EJERCICIO Nº1
Se pide ahora que añada un cuadro de diálogo de filtrado al ejercicio de la hoja anterior que
permita filtrar por los distintos campos de la tabla de clientes.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA – JTABLE
EJERCICIO Nº1
Se pide que mejore el programa de la hoja anterior de forma que el cuadro de diálogo de
filtrado permita al usuario decidir la ordenación del listado.
Por otro lado, se pide que junto al JTable donde aparece el listado de clientes aparezca el
número de clientes que se está mostrando en todo momento en el JTable.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA – iREPORT
EJERCICIO Nº1
Crear una DSN llamada EjercicioDSN que haga referencia a la base de datos MANEMPSA que
tiene almacenada en Mis Documentos.
EJERCICIO Nº2
En el programa iReport, crear una conexión llamada Conexión Ejercicio que esté creada a
partir de la DSN del ejercicio anterior.
EJERCICIO Nº3
Crear un informe usando la conexión Conexión Ejercicio del ejercicio anterior donde aparezca
el listado de clientes de la base de datos MANEMPSA ordenado por nombre de cliente.
El título de este listado debe ser: Listado de Clientes y luego guarde el informe con el nombre
clientes.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA – iREPORT
EJERCICIO Nº1
Crea un listado de clientes usando la opción mago de informes de iReport. Este listado debe
mostrar los siguientes campos: nombre, dirección y los dos teléfonos. El listado debe salir
ordenado por nombre.
Una vez creado el listado, debe realizar las siguientes modificaciones en él:
(48)El título del listado debe ser: “Clientes de MANEMPSA”. Y debe tener las siguientes
características:
ww.Color de fondo: Azul.
xx. Tamaño de la letra: 18.
yy. Color de letra: Blanco.
zz. En cursiva.
(2) Los datos del listado deben tener las siguientes características:
a. Deben tener alineación centro.
b. Deben tener un tamaño de letra de 10 y el tipo de letra debe ser Comic Sans.
c. Los nombres deben aparecer en color verde, al igual que las direcciones.
d. Los teléfonos deben aparecer en color rojo y en negrita.
Una vez hecho esto, si quiere experimentar realizando algún cambio más, hágalo.
F d ió Códi Lib D i i
PROGRAMACIÓN
JAVA – iREPORT
EJERCICIO Nº1
Se pide realizar un informe en el que aparezcan los servicios realizados al cliente “Seguros
Segasa”, cuyo CIF es ‘B11223212’.
(31)En el encabezado de página debe aparecer una ficha como la que sigue:
Ficha de Cliente.
(33) El listado de servicios debe mostrar los datos: Fecha del servicio, tipo y
cantidad ordenado ascendentemente por fechas. Por supuesto, este listado debe
aparecer con su encabezado. Sería interesante que destacara el encabezado
colocándolo en negrita y separándolo del listado de datos a través de una línea.
(34)En la zona del pie de columna, añada simplemente una línea horizontal.
(35)En la zona del pie de página y del pie de última página debe aparecer el siguiente texto
centrado:
MANEMPSA
Mantenimiento Integral a Empresas
F d ió Códi Lib D i i