sábado, 9 de abril de 2016

026.- Vectores, Matrices o Arrays - Java y NetBeans


Vectores, Matrices o Arrays en Java:

El manejo de vectores en Java es similar al manejo de vectores en el lenguage de programación C. Solo hay que tener en cuenta que un vector en Java se tiene primero que declarar, y luego se tiene que construir, ya que los vectores son, al igual que todo en Java, objetos.


Declaración de un vector:

Para declarar un vector se seguirá la siguiente sintaxis:

tipoDatos  nombreVector[];

tipoDatos es el tipo de datos de los elementos del vector (int, double, String, etc.)
nombreVector es el nombre que tú quieras darle a tu vector.

Por ejemplo, supongamos que queremos crear un vector de enteros llamado v. La declaración será la siguiente:

int v[];


Como puedes ver, en la declaración de un vector no se indica la dimensión de éste, es decir, el número de elementos que tiene. Esto se hace en la construcción del vector.



Construcción de un vector:

Para construir un vector que ya haya sido declarado se sigue la siguiente sintaxis:


nombreVector = new tipoDatos[dim];

·       nombreVector es el nombre del vector a construir.
·       tipoDatos  es el tipo de datos del vector.
·       dim  es la dimensión del vector (el número de elementos).


Por ejemplo, si queremos que el vector v declarado antes tenga 10 elementos, tendremos que hacer lo siguiente:

v = new int[10];


En el momento de la construcción del vector, podemos usar una variable entera  para asignar el número de elementos que se quiera.

Por ejemplo, en el siguiente caso el número de elementos del vector v viene dado por la variable num:

v = new int[num];




Acceso a los elementos de un vector:

Una vez declarado el vector y construido, este se puede usar de la misma manera que en C. Se puede acceder a un elemento del vector escribiendo el nombre del vector y entre corchetes el índice del elemento que quieres usar. Recuerda que los índices comienzan a numerarse desde 0.


Ejemplo N° 1:

etiMensaje.setText("El Valor es: " + v[6]);

Aquí se coloca en una etiqueta el valor contenido en la sétima posición del vector v.



Ejemplo N° 2:

        for (int i = 0; i < 10; i++) {
            v[i] = 100;
        }


Este código recorre un vector de 10 elementos y almacena en dichos 10 elementos el número 100.




Longitud de un vector:

Una forma rápida de saber la longitud que tiene un vector es usar lo siguiente:

nombreVector.length


Por ejemplo, si el vector se llama v, su longitud (el número de elementos que tiene) sería:

v.length



El siguiente código rellena el vector v con ceros, da igual el número de elementos que tenga:

for (int i = 0; i < v.length; i++) {
v[i] = 0;
}





Creación de un vector e inicialización con datos al mismo tiempo:


Es posible crear un vector e introducir datos directamente en él al mismo tiempo. La forma general de hacerlo sería la siguiente:


tipoDatos nombreVector[] = {elemento1, elemento2, elemento3, …, elementoN};



Por ejemplo:

int v[] = {6, 3, 1, 2};


Este código crea un vector con cuatro números enteros: 6, 3, 1, 2.



Ejemplo 2:


String coloresArcoiris[] = {"Rojo", "Naranja", "Amarillo", "Verde", "Azul", "Añil", "Violeta"};



Este código crea un vector que contiene 7 cadenas, correspondientes a los colores del arcoíris.






VECTORES DE COMPONENTES:

En Java, se pueden crear vectores de etiquetas, cuadros de texto, botones, etc.

Esto es tremendamente útil cuando se tienen que definir muchos componentes con una función parecida, y que tengan que ser tratados en conjunto.

Por otro lado, nos ahorra mucho tiempo ya que no se tienen que diseñar estos elementos en la misma ventana de diseño.

Los vectores de componentes se usan igual que se ha indicado antes. Observa el siguiente ejemplo:


JLabel vectorEtiquetas[];  //aquí se crea un vector de etiquetas llamado vectorEtiquetas


vectorEtiquetas = new JLabel[6]; //aquí se construye el vector, asignando 6 etiquetas



//ahora trabajamos con las etiquetas del vector usando el bucle for
for (int i = 0; i < vectorEtiquetas.length; i++) {
vectorEtiquetas[i] = new JLabel(); //se construye cada etiqueta
vectorEtiquetas[i].setBounds(10, 10 + i * 30, 100, 20); //se asigna posición y tamaño
vectorEtiquetas[i].setText("Etiqueta " + i); //se asigna un texto
this.getContentPane().add(vectorEtiquetas[i]); //se coloca en la ventana
}





Realiza el siguiente ejercicio para entender el ejemplo:


Ejercicio:


  1. Crea un nuevo proyecto en java.

  1. Empecemos definiendo desde código las características de la ventana. Crearemos el método crearVentana, y lo llamaremos desde el método constructor del proyecto:



  1. Vamos a situar en la ventana 10 cuadros de verificación (JCheckBox). Para ello usaremos un vector de 10 JCheckBox. Este vector se declarará en la zona de variables globales (será necesario añadir el típico import):



  1. La construcción de los vectores de componentes, se realiza en el método constructor (en nuestro caso en el método crearVentana, que es llamado desde el método constructor). Construiremos el vector de forma que contenga 10 JCheckBox:



  1. Se acaba de construir un vector con 10 cuadros de verificación. Ahora, es necesario construir cada uno de los cuadros del vector y asignarle ciertas propiedades. Esto se hace con un bucle for que recorre los elementos del vector. (Añade el siguiente código dentro del método crearVentana):



  1. Analiza este código que se acaba de añadir:

    1. Observa como cada elemento del vector debe ser construido:

vectorCuadros[i] = new JCheckBox();

    1. El texto que tendrá cada elemento será: “Cuadro de Verificación: 0”, “Cuadro de Verificación: 1”, “Cuadro de Verificación: 2”, etc…

vectorCuadros[i].setText("Cuadro de Verificación: " + i);

    1. Los cuadros de verificación se colocan uno debajo de otro. Estudia la línea siguiente y observa como varía la posición vertical de cada cuadro:

vectorCuadros[i].setBounds(10, 10 + 30 * i, 300, 20);

    1. Luego agrego cada cuadro de verificación en el panel de contenidos de la ventana.
       
this.getContentPane().add(vectorCuadros[i]);


  1. Ejecuta el programa y observa el resultado:



  1. Mejoremos la presentación de los cuadros cambiando los rótulos de cada uno. Para ello, será necesario usar otro vector auxiliar que contenga los textos de cada uno de los cuadros. Modifica el código anterior de forma que quede así:



  1. En este código puedes observar como se usa un vector de String que se crea conteniendo 10 colores. Luego, ese vector se usa para asignar cada color al texto de cada cuadro. Si ejecutas el programa, verás que cada cuadro tiene su texto correspondiente a un color.



  1. Ahora añade un botón con su evento actionPerformed. Añade en la zona de variables globales lo siguiente:

JButton btnAceptar;

         Y luego, dentro de crearVentana, añade el siguiente código:



  1. Ahora programaremos la respuesta al evento actionPerformed de forma que el programa diga cuantos cuadros hay seleccionados. Para ello, se tendrá que programar el procedimiento btnAceptarActionPerformed, cuya llamada se encuentra en el código anterior (la línea que da error):

Así pues, fuera de crearVentana, programa el siguiente procedimiento:



  1. En este código se puede observar como se usa un bucle for para recorrer fácilmente el vector de cuadros y averiguar cuáles de ellos están seleccionados. Aumentamos un contador y lo demás es sencillo.

Si este programa se hubiera hecho desde diseño, el código para contar el número de cuadros seleccionados sería mucho más engorroso. Piénsalo.


  1. Ejecuta el programa. Selecciona varios cuadros y pulsa el botón Aceptar. Observa el resultado:




CONCLUSIONES:

En Java, los vectores deben declararse y luego construirse. Es en la construcción del vector cuando se le asigna a este el número de elementos.

Los vectores en Java pueden ser usados de la misma forma que en el lenguaje de programación C.

En Java se pueden crear vectores de componentes: etiquetas, cuadros de texto, botones, etc. facilitando luego el trabajo con todos estos elementos en conjunto y facilitando las labores de diseño.



domingo, 27 de marzo de 2016

025.- Creación de Eventos en General Desde Código - Java y NetBeans


EVENTOS DESDE CÓDIGO
CONSIDERACIONES GENERALES

Se finalizará el estudio de los eventos desde código, planteando de forma general el código necesario para programarlos.

A la hora de programar eventos sobre un componente concreto, será necesario tener en cuenta lo siguiente:

-        Primero hay que enlazar el componente con el oyente o adaptador correspondiente al evento.

-        El oyente o adaptador contendrá aquellos eventos que interesen programar.

-        Cada evento tiene un parámetro asociado con información sobre el evento.

-        Cada evento realiza una llamada a un método y es en este método donde se programa la respuesta al evento.


La sintaxis general de programación de eventos es la siguiente:



Componente.MetodoParaAñadirOyente(new TipoOyente() {

     public void evento1(TipoEvento evt) {
          LlamadaAProcedimiento1(evt);
     }

     public void evento2(TipoEvento evt) {
          LlamadaAProcedimiento2(evt);
     }

     ...otros eventos...
});



Para poder programar un evento es necesario conocer lo siguiente:

-        El componente sobre el que se programará.
-        El tipo oyente o adaptador al que pertenece el evento.
-        El método usado para asignar el oyente al componente.
-        El nombre del evento.
-        El tipo de evento para el parámetro.




EJEMPLO 1 (EVENTOS DEL RATÓN):


Los eventos de ratón son: mouseEntered, mouseExited, mousePressed, mouseReleased, mouseClicked.

Pertenecen al adaptador MouseAdapter.

El adaptador se asigna al componente con el método addMouseListener.

Los métodos llevan como parámetro un objeto del tipo MouseEvent.

Conociendo esto, si queremos programar los eventos del ratón de una etiqueta llamada etiMensaje, sólo tenemos que hacer lo siguiente:



etiMensaje.addMouseListener(new MouseAdapter() {

     public void mouseEntered(MouseEvent evt) {
          etiMensajeMouseEntered(evt);
     }

     public void mouseExited(MouseEvent evt) {
          etiMensajeMouseExited(evt);
     }

     public void mousePressed(MouseEvent evt) {
          etiMensajeMousePressed(evt);
     }

     public void mouseReleased(MouseEvent evt) {
          etiMensajeMouseReleased(evt);
     }

     public void mouseClicked(MouseEvent evt) {
          etiMensajeMouseClicked(evt);
     }

});



EJEMPLO 2 (EVENTOS DEL TECLADO):


Los eventos de teclado controlan las pulsaciones de tecla. Entre ellos, podemos mencionar a los siguientes:

-        keyPressed, que define la pulsación de una tecla.
-        keyReleased, que define el momento en que se suelta una tecla.
-        keyTyped, que define el pulsar-soltar una tecla.

Los eventos de teclado pertenecen al adaptador KeyAdapter.

El adaptador anterior se asigna a un componente a través del método addKeyListener.

Los eventos de teclado llevan como parámetro un objeto del tipo KeyEvent.

Sabiendo lo anterior, si se quisieran programar los eventos de teclado de un cuadro de texto llamado txtDato el código necesario sería el siguiente:


txtDato.addKeyListener(new KeyAdapter() {

     public void keyPressed(KeyEvent evt) {
          txtDatoKeyPressed(evt);
     }

     public void keyReleased(KeyEvent evt) {
          txtDatoKeyReleased(evt);
     }

     public void keyTyped(KeyEvent evt) {
          txtDatoKeyTyped(evt);
     }

});



Como puedes observar, la programación de eventos siempre se hace de la misma forma, solo tienes que conocer el adaptador/oyente, el método para asignar dicho adaptador/oyente, el nombre de los eventos, y el tipo de objeto que llevan como parámetro.

Sabiendo estos datos, la programación siempre se hace igual.

El problema que se plantea en cambio es el siguiente:

Si surge un nuevo evento YY el cual quiero usar desde código, ¿cómo puedo saber cuál es su adaptador/oyente, el método para asignar dicho adaptador/oyente al componente, y el tipo de datos del parámetro?

Para este caso, se aconseja crear un proyecto de prueba desde la ventana de diseño y asignar el evento YY que se quiere estudiar a un componente. Luego simplemente hay que analizar el código generado por el NetBeans.




CONCLUSIONES:

Para programar desde código un evento es necesario conocer lo siguiente:

- El nombre del evento / eventos del mismo grupo.
- El oyente/adaptador al que pertenece el evento / eventos.
- El método para asignar el oyente/adaptador al componente sobre el que actúa el evento.
- El tipo de datos de objeto recibido como parámetro por el evento.

Conociendo estos datos, la programación siempre se hace igual:


Componente.MetodoParaAñadirOyente(new NombreOyenteAdaptador() {

     public void nombreEvento1(TipoDatoParametro evt) {
          LlamadaAProcedimientoEvento1(evt);
     }

     public void nombreEvento2(TipoDatoParametro evt) {
          LlamadaAProcedimientoEvento2(evt);
     }
});



Se puede aprender mucho sobre los eventos asociándolos desde diseño y luego mirando en el código generado.

024.- Creación de Eventos del Ratón Desde Código - Java y NetBeans


EVENTOS DEL RATÓN DESDE CÓDIGO:

Se estudió en el post anterior la forma de programar eventos desde código. Concretamente se estudió como programar eventos de acción. En esta hoja se estudiará como programar eventos de ratón.

Los eventos de ratón son los siguientes:

-        mouseEntered
o   Indica que el puntero del ratón entró en la superficie del elemento (etiqueta, botón, etc)
-        mouseExited
o   Indica que el puntero del ratón salió de la superficie del elemento (etiqueta, botón, etc)
-        mousePressed
o   Indica que un botón del ratón ha sido presionado sobre el elemento.
-        mouseReleased
o   Indica que un botón del ratón ha sido soltado sobre el elemento.
-        mouseClicked
o   Indica que se ha pulsado y soltado un botón del ratón.

Como se dijo en la hoja anterior, todos los eventos pertenecen a un objeto “oyente” o “adaptador”. En este caso concreto, todos los eventos del ratón pertenecen a un objeto “adaptador” llamado MouseAdapter.

Cada uno de los eventos se programará dentro del adaptador MouseAdapter. Cada evento es en realidad un procedimiento que recibe un parámetro con información sobre el evento. Este parámetro, en el caso de los eventos del ratón, es del tipo MouseEvent.

Cada evento a su vez hace una llamada a un método, y es en este procedimiento donde realmente se programa la respuesta al evento.

Todo esto resulta complicado al principio, pero verás que en realidad siempre es igual. Solo hay que conocer el nombre de cada evento, el adaptador u oyente al que pertenece y el tipo de parámetro que recibe cada evento.




COMO ENLAZAR EVENTOS DE RATÓN CON UN COMPONENTE:


Supongamos que tenemos un componente (botón, etiqueta, etc...) llamado YYY.

Si queremos asociarle eventos de ratón, tendremos que añadir el siguiente código dentro del método constructor:

YYY.addMouseListener(new MouseAdapter() {

     public void mouseEntered(MouseEvent evt) {
          YYYMouseEntered(evt);
     }

     public void mouseExited(MouseEvent evt) {
          YYYMouseExited(evt);
     }

     public void mousePressed(MouseEvent evt) {
          YYYMousePressed(evt);
     }

     public void mouseReleased(MouseEvent evt) {
          YYYMouseReleased(evt);
     }

     public void mouseClicked(MouseEvent evt) {
          YYYMouseClicked(evt);
     }

});


Veamos este mismo código comentado:





EJERCICIO:

  1. Crea un nuevo proyecto en NetBeans.

  1. Accede al código del proyecto.



  1. Inserta una llamada dentro del método constructor a un método creacionVentana de la siguiente forma:



  1. La ventana va a contener dos etiquetas, que tendremos que declarar en la zona de variables globales:



  1. Ahora vamos a diseñar la ventana. Introduce el siguiente código dentro del procedimiento creacionVentana:



  1. Ejecuta ya el programa para observar el resultado de nuestro diseño. El aspecto debe ser el siguiente:



  1. El objetivo del programa es simple. Queremos que al entrar el puntero del ratón dentro de la superficie de la etiqueta azul, aparezca un mensaje en la otra etiqueta indicándolo. También queremos que aparezca un mensaje cuando sale el puntero del ratón de la etiqueta. Y también al pulsar un botón del ratón sobre dicha etiqueta.

  1. Para hacer esto, necesitamos crear un MouseAdapter que contenga los siguientes eventos: mouseEntered, mouseExited y mousePressed. Observa que no es necesario que contenga el mouseReleased ni el mouseClicked.

Luego, el MouseAdapter se asignará a la etiqueta azul etiColor.

  1. Primero programaremos el enlace del adaptador MouseAdapter con la etiqueta etiColor. Programa al final del método creacionVentana lo siguiente:



  1. Observa el código:

    1. Se añade un MouseAdapter al objeto etiColor.

    1. El MouseAdapter que se añade solo contiene los tres eventos que necesitamos: mouseEntered, mouseExited y mousePressed.

    1. Será necesario añadir imports para las clases MouseAdapter y MouseEvent.

    1. Es normal que las llamadas a los procedimientos de cada evento den error (subrayado con líneas rojas) ya que todavía no han sido programados.

  1. Ahora se programará cada procedimiento que es llamado desde cada evento. Recuerda que esto debe hacerse fuera del método creacionVentana. Aquí tienes lo que debes programar:



  1. Ahora ya puedes ejecutar el programa y comprobar lo que sucede cuando interactúas con el ratón sobre la etiqueta de color azul.


  1. Vamos a añadir una pequeña mejora que nos servirá para estudiar ese objeto llamado evt del tipo MouseEvent que llevan todos los eventos de ratón como parámetro.

Se dijo antes que este parámetro contiene información sobre la acción del ratón. Por ejemplo, nos puede servir para saber cuantas veces se pulsó el ratón, con qué botón, etc. Aprovecharemos este parámetro para indicar qué botón del ratón es el que se ha pulsado sobre la etiqueta.

Cambia el método etiColorMousePressed y déjalo de la siguiente forma:



  1. En el código anterior aprovechamos los métodos que tiene el objeto evt para averiguar que botón se ha pulsado. Usamos el método getButton que nos dice el botón pulsado. Aprovechamos las constantes de la clase MouseEvent para saber si se pulsó el botón izquierdo, central o derecho.

  1. Ejecuta el programa y comprueba el funcionamiento.


CONCLUSIONES:

Hay grupos de eventos que pertenecen a un mismo oyente o adaptador. Por ejemplo, los eventos de ratón pertenecen al adaptador llamado MouseAdapter.

Si se quiere asignar eventos de ratón a un componente YYY, hay que usar el siguiente código:

YYY.addMouseListener(new MouseAdapter() {
    
public void mouseEntered(MouseEvent evt) {
          YYYMouseEvent(evt);
     }

     ... otros eventos de ratón ...
});


Ten en cuenta que solo añades al adaptador aquellos eventos que necesites.

Cada evento de ratón lleva como parámetro un objeto evt del tipo MouseEvent que contiene información sobre el evento ocurrido (qué botón del ratón se pulsó, cuantas veces, etc.).