domingo, 10 de abril de 2016

028.- Introducción a la Programación Orientada a Objetos - POO - Java y NetBeans


Introducción a la Programación Orientada a Objetos – 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 se define como un elemento que tiene unas propiedades y métodos.

Un objeto posee unas características (ancho, alto, color, etc…). A las características de un objeto se les llama propiedades.

Un objeto es un elemento “inteligente”. A un objeto se le puede dar órdenes y él obedecerá. A estas órdenes se les llama métodos. Con los métodos podemos cambiar las características del objeto, pedirle información, o hacer que el objeto reaccione de alguna forma.

En Java todo son objetos. Veamos algunos ejemplos de uso de objetos en Java:


Ejemplo N° 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 una etiqueta le podemos dar órdenes, a través de sus métodos.

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(20,20,100,30);

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 dé 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 no se muestre en la ventana usando el método setVisible:

etiTexto.setVisible(false);



Ejemplo N° 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.BLUE);


Otros métodos que permiten cambiar las propiedades del objeto cuadro de texto son:

setVisible       - permite poner visible o invisible el cuadro de texto
setEnabled    - permite activar o desactivar el cuadro de texto
setEditable    - permite hacer que se pueda escribir o no en el cuadro de texto
setText         - permite modificar el texto del cuadro de texto
setBounds     - permite cambiar el tamaño y posición del objeto
setToolTipText         - permite asociar un texto de ayuda al cuadro de texto
etc

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:

String cadena = txtCuadro.getText();


Otros métodos que devuelven información del cuadro de texto son:

getWidth               - devuelve el ancho que tiene el cuadro de texto
getHeight               - devuelve el alto que tiene el cuadro de texto
getSelectedText       - devuelve el texto que está seleccionado dentro del cuadro de texto
getToolTipText        - devuelve el texto de ayuda que tiene asociado el cuadro de texto
etc

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();


Otros métodos que ordenan al cuadro de texto son:

repaint         - le ordena al cuadro de texto que se vuelva a pintar
copy            - le ordena al cuadro de texto que copie el texto que tenga seleccionado
cut              - le ordena al cuadro de texto que corte el texto que tenga seleccionado
paste           - le ordena al cuadro que pegue el texto que se hubiera copiado o cortado
etc




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.

Para poder usar un objeto hay que declararlo y construirlo.


Declaración de un Objeto:

La declaración de un objeto es algo similar a la declaración de una variable. Es en este momento cuando se le da un nombre al objeto. Para declarar un objeto se sigue la siguiente sintaxis:

Clase nombreObjeto;


Por ejemplo, para declarar la etiqueta del ejemplo N° 1, se usará el siguiente código:

JLabel etiTexto;


Para declarar, en cambio, el cuadro de texto del ejemplo N° 2, se usará el siguiente código:

JTextField txtCuadro;



Construcción de un Objeto:

En el momento de la “construcción” de un objeto, se le asignan a este una serie de propiedades iniciales. Es decir, unas características por defecto. Se puede decir que es el momento en que “nace” el objeto, y este nace ya con una forma predeterminada, que luego el programador podrá cambiar usando los métodos del objeto.

Es necesario construir el objeto para poder usarlo. La construcción del objeto se hace a través del siguiente código general:

nombreObjeto = new Clase();


Por ejemplo, para construir la etiqueta del ejemplo N° 1, se hará lo siguiente:

etiTexto = new JLabel();


Para construir el cuadro de texto del ejemplo N° 2, se hará lo siguiente:

txtCuadro = new JTextField();


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 hará lo siguiente:

JLabel etiTexto = new JLabel();


En general, para declarar y construir un objeto en una sola línea se sigue la siguiente sintaxis:

Clase nombreObjeto = new Clase();




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:

JLabel etiTexto = new JLabel();
JLabel etiResultado = new JLabel();
JLabel etiMensaje = new JLabel();


En el ejemplo se han declarado y construido tres etiquetas llamadas etiTexto, etiResultado y etiMensaje. Las tres etiquetas al momento de ser creadas 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”);
etiMensaje.setBackground(Color.BLUE);
etiMensaje.setText(“Cadena”);


En el ejemplo se le ha dado, usando el método setBackground un color distinto a cada etiqueta, además se ha cambiado el texto de cada una. De este modo se le da forma a cada etiqueta.



Hasta ahora has usado objetos aunque no tengas mucha conciencia de ello. Por ejemplo ha usado etiquetas, cuadros de texto, botones, botones de opción y demás en los temas anteriores. Como práctica y para ampliar tus conocimientos investiga y responde las siguientes interrogantes:

-        ¿Cuál es el nombre de la clase de los botones normales que usa en sus ventanas?
-        ¿Cómo declararías un botón llamado btnAceptar, y otro llamado btnCancelar?
-        ¿Cómo construirías dichos botones?
-        Indica algunos métodos para cambiar propiedades de dichos botones (métodos set)
-        Indica algunos métodos para pedirle información a dichos botones (métodos get)
-        Indica algún método para dar órdenes a dichos botones (algún método que no sea ni set ni get)









CONCLUSIONES:

Un Objeto es un elemento que tiene una serie de características llamadas PROPIEDADES.

Por otro lado, al objeto se le pueden dar órdenes que cumplirá de inmediato. A dichas órdenes se les denomina MÉTODOS.

Los métodos se pueden dividir básicamente en tres tipos:

Para cambiar las propiedades del objeto (Métodos set)
Para pedir información al objeto (Métodos get)
Para dar órdenes al objeto.


Todo objeto pertenece a una CLASE.

La CLASE nos permite declarar objetos y construirlos:


Declaración:

     CLASE nombreObjeto;


Construcción:

     nombreObjeto = new CLASE();


Declaración y Construcción en una misma línea:

     CLASE nombreObjeto = new CLASE();

En la construcción de un objeto se asignan unas propiedades (características) por defecto al objeto que se construye, aunque luego, estas características pueden ser cambiadas según necesidad y criterio del desarrollador.



sábado, 9 de abril de 2016

027.- Vectores de Componentes y Eventos Desde Código - Java y NetBeans


Asignación de eventos a los elementos de un vector de componentes:

En Java se pueden crear vectores de componentes, como ya se vio en el post anterior. Estos vectores pueden contener un grupo de etiquetas, cuadros de texto, botones, etc.

Gracias a los vectores de componentes se pueden crear rápidamente por código estos componentes y trabajar sobre ellos sin tener que usar muchas líneas de código.

En esta hoja se verá cómo se pueden asignar eventos a los componentes de un vector.


Ejercicio:


  1. Crea un 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 de la clase:



  1. Vamos a situar en la ventana 5 botones, y para ello usaremos un vector de botones, que tendremos que declarar en la zona de variables globales (propiedades de la clase):



  1. Dentro del método crearVentana construiremos el vector y construiremos cada uno de los botones que contiene, asignando las distintas características de cada uno. Debes añadir el siguiente código dentro del método crearVentana:



  1. En el código anterior se crea un vector de cadenas (String) con el texto de cada botón.

Luego se construye el vector de botones, asignándole 5 botones.

A continuación, usando un bucle for, construimos cada botón del vector, le asignamos el texto correspondiente, le asignamos su posición y su tamaño, y lo colocamos en el panel de contenido de la ventana.


  1. Ejecuta el programa para observar su aspecto hasta ahora:



  1. Ahora, interesaría asignar un evento actionPerformed a cada botón. Esto se hará aprovechando el que todos los botones pertenezcan a un vector, usando un bucle for. Añade el siguiente código al final del método crearVentana:



Este código asigna a cada botón un evento actionPerformed que hace una llamada a un método al que he llamado botonActionPerformed. (Esta llamada da error porque aún no ha sido programado dicho evento. Esto se hará a continuación.)

Hay que tener en cuenta que cuando se pulse cualquiera de los botones, se ejecutará el método botonActionPerformed. Programa este procedimiento (fuera de crearVentana, por supuesto) de la siguiente forma:



  1. Ejecuta el programa y observa el resultado. Cuando pulsas cualquiera de los botones, se ejecuta la respuesta al evento y esta lo que hace es mostrar un mensaje a través de un JOptionPane donde aparece el texto “Has pulsado uno de los botones.”.

El método botonActionPerformed sirve como respuesta para todos los botones. El problema que plantea esto es, ¿cómo saber qué botón se ha pulsado? Es aquí donde entra en funcionamiento el parámetro ae (ActionEvent) que suelen llevar todos los eventos.

  1. Modifica el método botonActionPerformed de forma que quede así:



Este código resulta muy interesante. El parámetro ae tiene siempre un método llamado getSource que devuelve el componente de la ventana sobre el que ha sucedido el evento. De esta manera obtenemos el botón que ha sido pulsado. (Observa que es necesario hacer un cast) Aprovechamos esto para introducir el botón en una variable auxiliar que hemos llamado botonPulsado.

Luego solo hay que usar la variable botonPulsado como un botón normal y corriente. Por ejemplo, la usamos en el JOptionPane mostrando el texto que contiene el botón pulsado con el método getText.

  1. Ejecuta el programa y observa el resultado, por ejemplo al pulsar el botón Aplicar se muestra lo siguiente:





CONCLUSIONES:

Se pueden asignar eventos a los elementos de un vector a través de un bucle for que recorra los distintos elementos del vector y le asigne el evento o eventos necesarios.

Cuando se asigna un mismo método de respuesta a eventos de varios componentes, es necesario usar el parámetro ae (ActionEvent) junto con el método getSource para averiguar el componente sobre el que ha sucedido el evento.


La forma general de acceder al elemento sobre el que sucedió el evento es la siguiente:

TipoComponente  var = (TipoComponente) ae.getSource();

La variable var contendrá el componente activado.



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.