Quantcast
Channel: CoDejaVu
Viewing all 129 articles
Browse latest View live

Premio Liebster Award

$
0
0
Con esta entrada quiero hacer un pequeño break a los temas que venimos trabajando....... y porqué??? básicamente porque hace pocos días recibí una grata y motivante sorpresa, CoDejaVu fue uno de los 11 blogs condecorados con el ya muy famoso Premio Liebster Award....


¿Pero que es?

En Internet circulan gran cantidad de premios que se conceden a bloggers por parte de otros bloggers para motivar, incentivar o simplemente dar un pequeño reconocimiento por la labor realizada..........el Premio Liebster Award es uno de ellos, un premio sencillo pero con un gran fondo de inspiración y apoyo para cada uno de los premiados....

¿El Premio?

Me sorprendió bastante encontrar un mensaje donde me decían que había sido premiado, y me invitaban a conocer cual era ese premio...........que gran sorpresa al darme cuenta que alguien de otro país, creador de un blog con un enfoque completamente diferente al mio, ve en este algo de interés y brinda con el premio un gran apoyo he incentivo para continuar.....

Ese alguien es Ma Bm, el creador de un blog muy interesante sobre puntos de vista en torno a la sociedad que nos rodea....... y digo "nos" porque indagando un poco en sus artículos me doy cuenta que se comparten las mismas vivencias y voces de protesta en muchos lugares del mundo, un espacio que invito a conocer en inconformistacivilizado......Ma Bm Muchas Gracias por la Mención.

Sobre el premio debemos saber que trae una serie de reglas básicas como parte del proceso.............estas son :
  • Nombrar y agradecer el premio a la persona que te lo concedió. 
  • Contestar las preguntas que haya formulado quién lo otorga.
  • Conceder el premio a once blogs que te gusten, que estén empezando o que tengan menos de doscientos seguidores.
  • Elaborar 11 nuevas preguntas para los blogs que premias.
  • Informar del premio a cada uno de los premiados.
  • Visitar los blogs que han sido premiados junto al tuyo. 
  • Para no romper la cadena, evitar mandar el premio al blog que te lo envió. 
Bueno, Empecemos!!!

Las Respuestas!!!

Aquí van las preguntas publicadas por Ma Bm:

1 ¿Porque hiciste un blog?
Porque Quiero brindar un poco del conocimiento aprendido por medio de blogs como este, además de mantenerme actualizado y dar un repaso a todo lo que realizo.....entre otras razones que menciono aquí.
2 ¿Que famoso te gustaría que lo siguiera?

Nunca he pensado en eso, es mas, no soy de los que siguen famosos, desde que empecé he pensado mas en que estudiantes o personas deseosas de aprender vean en CoDejaVu una buena herramienta para hacerlo.
3 ¿Cual es tu objetivo con el blog?
El objetivo principal es brindar una herramienta de consulta con temas que alguna vez me tocó consultar, además de continuar aprendiendo para enseñar
4 ¿Cual es tu blog favorito?
Llevo muy poco en el mundo de blogger, y aunque hay muchos bloggs que visito constantemente no tengo uno favorito...........estoy en proceso de clasificación....
5 ¿De que otro tema te gustaría tener un blog?
Me gustan los blogs que enseñan a los demás, me gustaría otro donde se enseñaran a realizar cosas útiles en la vida diaria tipo reparaciones, manualidades o cosas practicas en general.....
6 ¿Que famoso te gustaría que escribiera un blog?
Soy mas de seguir contenido que famosos....
7 ¿Que crees que hace tu blog diferente?
Existen muchos blogs similares, pero la mayoría brindan la ayuda puntual muchas veces pensando en solo un tipo de visitante, con mi blog trato de explicar todo al detalle asumiendo que el lector apenas inicia en este mundo, por eso se hace con un lenguaje natural y bindando entradas que facilitan el proceso, desde lo mas básico hasta lo mas complejo.....
8 ¿Te cuesta hacer entradas?
Al principio no se por donde empezar, pero después que empiezo ya no se como finalizar.......
9 ¿Que dirías a la gente para animarla a escribir blogs?
Que son una gran herramienta no solo para quien lo lee sino para quien lo escribe, ya que permite darse a conocer y mantenerse activo con sus puntos de vista, algo de lo que somos dueños y libres de realizar.
10 ¿A quien va dirigida tu publicación?
Va dirigida a todos los que queremos aprender y mantener fresco lo aprendido
11 Define tu blog en un tweet 
El conocimiento es Compartido...

Los Premiados!!!


En las reglas dicen que se premian 11 blogs, sin embargo en la búsqueda de los ganadores encontré 15 que para mi deben ser mencionados, por eso romperé por un momento esa regla y los mencionaré a todos. (no es tan fácil ni justo descartar solo porque si :S)

Bueno aquí van...

farorecuerdos: Blog de poesías, relatos y enseñanzas...

psicologalaeliana: Psicología - temas de interés sobre crecimiento y superación personal

escarlataestudio: Diferentes inspiraciones sobre filosofía, política, sociedad, actualidad entre otros...

piensaenbrooklyn: Noticias diferentes  he interesantes en la red

enjoyableteachingenglish: Un muy buen blog para la enseñanza del ingles

untiempoimperfecto: Tal como dice en su descripción, un rincón para la ciencia-ficción, el terror y la fantasía

diariodeunamamifeliz: Vivencias de madre, realmente agradable he interesante

christianggimenez: Otra Herramienta sobre Informática, programación y temas relacionados

escribiendosobrearteyartesania : Arte opiniones y algo mas

lagrutadelfreak : Un muy buen blog sobre curiosidades, tecnología y humor entre otros....

tecnojab : Muy buena Herramienta sobre tecnología

dineroyyo : Temas varios, belleza, manualidades y mucho mas

viernesretro: Un espacio interesante que nos traslada a una época no muy lejana...

personalizaciondeblogs: muchos temas importantes sobre el trabajo con blogs

lamujeratravesdeltiempo: Un ya antes premiado blog sobre mujeres que hicieron historia


Mis Preguntas a los Premiados!!!

1. Porque creaste un blog?
2. Cuanto tiempo dedicaste para escoger el nombre del blog?
3. Cuanto tiempo le dedicas al blog?
4. planificas lo que publicas en el blog?
5. Que ha cambiado desde que iniciaste hasta ahora?
6. De donde obtienes lo que publicas en el blog?
7. te has querido rendir con este proyecto de ser blogger?
8. Recomendarías tener un blog? 
9. Aparte de trabajar en el blog, a que mas te dedicas
10. Que le recomendarías al blog que te premia?
11. Hay algo de tu blog que quisieras cambiar?

Bueno, Un saludo a los condecorados con este premio, tal vez ya han sido premiados con otros o con el mismo pero otro reconocimiento no esta de mas!!!



También te podría Interesar. 


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

Que son los Patrones de Diseño ?

$
0
0
Volviendo a las labores, esté será el inicio de una serie de entradas sobre los patrones de diseño, en esta ocasión vamos a ver conceptos en general para responder preguntas como por ejemplo ¿que son?, ¿cual es su aplicación en el desarrollo de software?, problemas y soluciones que brindan...........mencionaremos algunos de los patrones mas usados y daremos paso a próxima entradas con ejemplos Java....

No vamos a entrar en detalle sobre datos históricos, creadores o profundizar mucho sobre alguno de los patrones, tocaremos lo básico que debemos saber para trabajar con estos, en otros artículos intentaré dar ejemplos de cada uno..............Empecemos!!!!

¿Que Son?

Los Patrones de diseño son herramientas para solucionar problemas de Diseño enfocados al desarrollo de software, estos patrones deben ser reusables permitiendo así que sean adaptados a diferentes problemáticas.

Cuando hablamos de problemáticas nos referimos a condiciones o problemas reiterativos en el desarrollo de software donde la solución se encuentra identificada mediante la aplicación de una serie de pasos, adaptando el sistema a una estructura definida por un patrón, garantizando que esta solución pueda ser aplicada cuantas veces sea necesario en circunstancias similares, evitando así la búsqueda de otras soluciones cuando estas ya se han dado anteriormente...

Existen 3 grupos de patrones:
  • Creacionales: Giran en torno a la creación de Objetos
  • Estructurales: Se enfocan en la estructura de clases y objetos que las componen
  • De Comportamiento: Definen el modo en que las clases y objetos son relacionados, el comportamiento he interacción entre ellos.

Algunos Patrones.

Vamos a ver algunos de los principales patrones de diseño, daremos una pequeña descripción en torno al problema y la solución................mas adelante realizaremos algunos ejemplos de aplicación.

Modelo Vista Controlador (MVC)

Es un patrón estructural que permite separar la información y lógica de negocio de la parte visual de la aplicación y la lógica que gestiona las relaciones y eventos del sistema. 

Problema : Cuando tenemos código que no es fácilmente controlado o mantenible, debido a que tenemos muchas funcionalidades en una sola clase y principalmente cuando queremos dar una representación visual pero al tener todo centralizado no se puede realizar con eficacia.

Solución: Se aplica el MVC donde reestructuramos nuestro código fuente separándolo en 3 partes funcionales con comportamientos definidos que posteriormente son relacionadas entre si, facilitando la mantenibilidad y flexibilidad del código, estas 3 partes son el Modelo, la Vista y el Controlador.
  • Modelo : Representa la información y los datos procesados por el sistema, gestionando la forma como se accede a estos y la lógica de negocio de la aplicación. 
  • Controlador : Representa el puente de interacción entre el Modelo y la Vista, define la forma como se relacionan los componentes de la aplicación. 
  • Vista : Es la representación del modelo mediante una interfaz gráfica de usuario, es la forma como el usuario interactúa con el sistema, permitiendo la ejecución de eventos he ingreso de información que serán procesados por el Modelo.

Observer

Es un patrón de comportamiento permite actualizar automáticamente el estado de un objeto dependiendo del estado de un objeto principal, cuando el objeto principal cambia sus objetos dependientes se actualizan.


Problema : Cuando tenemos una dependencia de 1 a muchos entre objetos, y se espera que cuando el estado de un objeto cambie, todos los objetos dependientes de este también cambien de forma automática, por ejemplo se tiene una aplicación de venta de productos administrada por diferentes vendedores con diferentes aplicativos (web, escritorio, móvil), se espera que cada vez que cambie la cantidad de productos disponibles, la aplicación de cada vendedor automáticamente actualicé el modulo de ventas con los nuevos valores sin necesidad de recargar la página o actualizar manualmente el sistema para que muestre los cambios.

Solución: Se aplica el patrón observador para desacoplar la clase que contenga objetos dependientes, estableciendo relaciones entre los objetos, para esto se tiene una clase SujetoConcreto que sera el objeto principal y tendremos los objetos cliente o dependientes que serian de clase ObservadorConcreto, cuando el estado del SujetoConcreto cambia, se envía una señal a cada uno de sus Observadores y estos automaticamente cambian su estado basados en el estado del objeto principal.



Value Object (VO)

Consiste básicamente en la agrupación de datos dentro de un objeto, estos datos representan los campos de una tabla o entidad de la BD y facilitan su mantenimiento y transporte dentro del sistema.


Problema : Al momento de pasar argumentos de un objeto a un método puede ocasionar que el método reciba gran cantidad de datos pasados como parámetros, si posteriormente se requiere la modificación de uno de esos argumentos se obliga a que todos los métodos que reciban estos argumentos sean cambiados, presentándose problemas de acoplamiento y mantenibilidad.

Solución: Se crean clases que representan las tablas de la BD que utiliza el sistema, de esta manera las propiedades o atributos de la clase serán los campos de la entidad, permitiendo encapsular la información y facilitando la manera en que estos son transportados, así al momento de enviar los parámetros a un método, se envía un solo objeto que los contiene.


Data Access Object (DAO)

Facilita y estructura el acceso a la información de una Base de Datos, separando la persistencia de objetos de la lógica de acceso a datos, brindando mayor flexibilidad ya que por ejemplo al momento de hacer un cambio en la lógica de negocio, esto seria transparente para la lógica de acceso a la información.

Problema : Se tienen diferentes implementaciones para el acceso a datos, de esta manera al cambiar el proveedor de  BD o la forma de conexión puede afectar la manera de acceder a los datos teniendo que implementar nuevamente el proceso en todos los componentes vinculados.

Solución: Se utilizan clases DAO para encapsular todos los accesos a la fuente de datos desacoplando de esta manera la lógica de negocio de la lógica de acceso a datos, estableciendo mayor organización y facilitando la mantenibilidad y extensibilidad del código fuente.


Delegate.

Permite extender y reutilizar la funcionalidad de una clase sin utilizar el mecanismo de herencia.


Problema : Se requiere el acceso a atributos de otras clases pero estos no se pueden heredar, ya que el lenguaje no permite la herencia múltiple o solo se quiere acceder a cierta información de la clase (La clase A no desea todos los métodos de la clase B)

Solución: Se utiliza el patrón Delegate reemplazando la relación "Es Un" por la relación "Usa" delegando la responsabilidad de ejecutar un proceso concreto usando otro objeto con los permisos para realizarlo, esto se hace por medio de conceptos como la composición o agregación.


Abstract Factory

Representa una fabrica de objetos, permitiendo la construcción de familias de objetos, es decir tipos de objetos con el mismo enfoque o relaciones.


Problema : Se requiere la creación de diferentes grupos de objetos, sin que se especifique la forma de hacerse, el cliente (la clase que ejecute el evento de creación) que solicite el objeto no necesita saber como se creará, este proceso deberá ser transparente para el, el cliente solo requiere una instancia de alguno de los grupos de objetos disponibles.


Solución: Se utiliza el patrón Abstract Factory para independizar la manera como se crearán los objetos concretos de forma que sea independiente de la clase que los solicita, por ejemplo si queremos crear un objeto hamburguesa podemos usar el patrón para definir familias de Hamburguesas agrupándolas por hamburguesas McDonald´s, Wendy´s y Texas, sin importar el tipo siempre se creara un objeto
hamburguesa pero con las características propias de cada grupo de familia disponible.


Singleton

Permite la creación de una única instancia de clase permitiendo que sea global para toda la aplicación.


Problema : Se debe restringir la creación de un tipo especifico de objetos a una única instancia garantizando un punto único de acceso para todo el sistema.

Solución: Se utiliza el patrón Singleton como mecanismo para limitar el numero de instancias de la clase, compartiendo la misma instancia por diferentes objetos del sistema, obteniendo una variable global para toda la aplicación.


Decorator

Este patrón permite agregar funcionalidades o responsabilidades a objetos de forma transparente y dinámica, sin ser dependiente de la herencia en su totalidad.

Problema :Cuando se quiere adherir responsabilidades o comportamientos específicos a un objeto pero de forma dinámica, es decir, permitiendo al usuario aplicar el comportamiento que desea, extendiendo funcionalidades de otras clases sin estar obligado a hacerlo mediante la herencia.

Solución: Se utiliza el patrón Decorator para adherir funcionalidades a un objeto implementando y creando relaciones con otras clases para incorporar dichas funcionalidades de forma dinámica, por ejemplo si tenemos una clase ventana, podemos usar el patrón para adherir otros comportamientos como por ejemplo darle estilos a la ventana, diferentes colores, bordes, tamaño, marco, entre otros componentes que deseamos vincular, los cuales se encuentran en diferentes clases.

 
Adapter.

Permite la cooperación entre clases para extender sus funcionalidades a clases de diferentes tipos, que no pueden usarlas por mecanismos comunes como la herencia.




Problema : Cuando se quiere utilizar una clase existente, pero su interfaz no es compatible o no esta relacionada con la clase que la va a utilizar.

Solución: Utilizando el patrón Adapter podemos relacionar clases incompatibles entre si, generando un mecanismo que permita extender su comportamiento por medio de una clase puente que sirva como interfaz entre la clase en cuestión y el resto de clases que quieran hacer uso de sus funcionalidades.


Conclusiones.

Como vimos los patrones de diseño nos permiten dar soluciones a  diferentes problemáticas comunes, algunas simples otras con mayor grado de complejidad, no siempre es necesario usar estos patrones sin embargo se recomienda su aplicación para buscar siempre un sistema mas optimo y con una arquitectura definida, cual o cuales aplicar depende de las necesidades del sistema.

Estos son algunos de los Patrones mas usados, existen muchos mas pero por cuestiones de organización y tamaño vamos a ver si se pueden exponer mas adelante, por el momento esta información nos sirve para dar un contexto base de lo que son y las posibles soluciones que brindan, en la próximas entradas trabajaremos cada uno de ellos mediante un ejemplo practico...


Referencias.

Head First Design Patterns



También te podría Interesar. 


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

Ejemplo Modelo Vista Controlador

$
0
0
En la entrada sobre patrones de Diseño se habla sobre el patrón MVC, en esta oportunidad vamos explicar un ejemplo practico donde se aplica este modelo mostrando la forma de independizar los componentes de nuestro sistema, además lo  combinaremos con los patrones DAO y VO para facilitar el manejo de la información.

Por cuestiones de tamaño no vamos a hacer la aplicación paso a paso, pero si se explicará la lógica de la misma, al final se presenta una opción de descarga del código fuente donde veremos la aplicación en funcionamiento.

El problema.

Se solicita desarrollar un sistema de administración de usuarios con un CRUD (Create, Read, Update, Delete) básico  nos advierten que la aplicación es un prototipo inicial el cual esta propenso a cambios, pues aún no se tienen definidas las ventanas con las que se va a trabajar ni la información requerida, por le momento se trabajará con una BD MySql, pero posiblemente se tenga que migrar a otro sistema gestor....

La solución.

Se aplica el MVC permitiendo independizar la lógica y la parte visual del sistema usando para eso un controlador que administra los procesos sirviendo como puente entre estos.

para la BD se usa MySql, reutilizando la BD creada en el ejemplo de conexión con Java, el Scritp es el siguiente.
CREATE DATABASE /*!32312 IF NOT EXISTS*/`codejavu` /*!40100 DEFAULT CHARACTER SET latin1 */;

USE `codejavu`;

/*Table structure for table `persona` */

DROP TABLE IF EXISTS `persona`;

CREATE TABLE `persona` (
`id` int(10) NOT NULL,
`nombre` varchar(30) default NULL,
`edad` int(3) default NULL,
`profesion` varchar(30) default NULL,
`telefono` decimal(10,0) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

/*Data for the table `persona` */
De esta forma se crea la Base de Datos a la que se va a apuntar, la cual contiene solo una tabla Persona con la que se realizan todas las operaciones CRUD.

El diagrama de clases de nuestro sistema es:
Como vemos tenemos la parte visual compuesta por las clases VentanaPrincipal, VentanaRegistro, VentanaBuscar, la lógica de negocio se establece en el modelo el cual se compone por la clase Logica y Conexión y aplicamos los patrones DAO y VO por medio de las clases PersonaDao y PersonaVo y por ultimo el controlador se define en la clase Coordinador, encargada de establecer todas las relaciones del sistema, la clase Principal prepara las instancias iniciales del sistema y posteriormente lo ejecuta.

Veamos como funciona el Patrón: 

El Modelo.

Como se mencionó, en el modelo tenemos la lógica de negocio, serán todas las clases vinculadas con el CRUD a nivel interno, que en ultimas es en lo que gira nuestro sistema.

Clase Logica.

Esta clase permite realizar las operaciones asociadas a la lógica de negocio como tal, desde ella realizamos las validaciones y llamados a las operaciones CRUD del sistema.

En caso de que se requieran procesos adicionales asociados a la lógica de negocio, aquí será donde se creen los métodos para dichos procesos, por ejemplo el método validarRegistro determina si los datos son correctos y permite registrar la persona en el Dao.

public void validarRegistro(PersonaVo miPersona) {
PersonaDao miPersonaDao;
/*Valida que solo se ingresen id de 3 digitos*/
if (miPersona.getIdPersona() > 99) {
miPersonaDao = new PersonaDao();
miPersonaDao.registrarPersona(miPersona);
}else {
JOptionPane.showMessageDialog(null,"El documento de la persona debe" +
" ser mas de 3 digitos","Advertencia",JOptionPane.WARNING_MESSAGE);
}
}


Clase Conexión.

En esta clase tenemos la cadena de conexión con la que trabajará nuestra aplicación, en ella se define la base de datos, el usuario, password y driver de conexión, si por ejemplo en un futuro se nos pide conectarnos a una base de datos diferente o establecer un sistema gestor distinto (pero con la misma estructura de tablas y campos), tan solo modificaremos esta clase y dicho cambio sera transparente para el resto del sistema.
(Tener en cuenta que los datos de login y password corresponden a los que yo dejé por defecto al instalar MySql, es decir login root y sin contraseña)
public Conexion() {
try{
//obtenemos el driver de para mysql
Class.forName("com.mysql.jdbc.Driver");
//obtenemos la conexión
conn = DriverManager.getConnection(url,login,password);

if (conn!=null){
System.out.println("Conección a base de datos "+bd+" OK");
}
}
catch(SQLException e){
System.out.println(e);
}catch(ClassNotFoundException e){
System.out.println(e);
}catch(Exception e){
System.out.println(e);
}
}


Clase PersonaVo.

Al utilizar este tipo de clases, aplicamos el patrón Value Object o VO (Anteriormente conocidas como DTO Data Transfer Object) en el que representamos las entidades (Tablas) de la base de datos, la tabla persona tiene los campos id, nombre, edad, profesión  teléfono  entonces nuestra clase Vo tendrá estos mismos atributos y de esta manera podremos transportar un objeto persona con todos estos valores por medio de los métodos set y get decada atributo.

Este patrón nos facilita enormemente el transporte de la información, evitando que se envíen gran cantidad de parámetros a un método cuando queremos hacer un registro o actualización, también en caso de que se modifique la tabla de la BD, nuestra clase deberá ser modificada así como los métodos que obtienen la información, mas no los métodos que la transportan.

/**
* @return the idPersona
*/
public Integer getIdPersona() {
return idPersona;
}
/**
* @param idPersona the idPersona to set
*/
public void setIdPersona(Integer idPersona) {
this.idPersona = idPersona;
}

Clase PersonaDao.

Cuando utilizamos estas clases, aplicamos el patrón Data Access Object o DAO, básicamente este patrón consiste en centralizar los procesos de acceso a la base de datos evitando inconsistencias y posibles problemáticas cuando esto se realiza a lo largo de la aplicación.
Con este patrón independizamos la lógica de negocio de la lógica de acceso a datos obteniendo mayor organización y flexibilidad en el sistema.

public void eliminarPersona(String codigo)
{
Conexion conex= new Conexion();
try {
Statement estatuto = conex.getConnection().createStatement();
estatuto.executeUpdate("DELETE FROM persona WHERE id='"+codigo+"'");
JOptionPane.showMessageDialog(null, " Se ha Eliminado" +
" Correctamente","Información",JOptionPane.INFORMATION_MESSAGE);
estatuto.close();
conex.desconectar();

} catch (SQLException e) {
System.out.println(e.getMessage());
JOptionPane.showMessageDialog(null, "No se Elimino");
}
}


La Vista.

Aquí se define la parte visual del sistema, en la vista estableceremos todas las ventanas o interfaces gráficas de usuario, mediante las cuales representamos todo el modelo permitiendo la interacción entre la aplicación y el cliente.

Clase VentanaPrincipal.


Esta clase representa la ventana inicial de la aplicación, posee un área de texto con una pequeña descripción y 2 botones que darán inicio a los eventos principales del sistema.

se comunica con el modelo mediante la clase coordinador y desde esta se cargan las otras ventanas de la aplicación.

Clase VentanaRegistro.


Permite el ingreso de información a la BD, en ella se evidencian todos los campos de la tabla Persona y presenta un medio gráfico para las clases PersonaVo y PersonaDao, al ejecutar el evento de registro se establece comunicación entre el coordinador y la clase Lógica donde se encuentran todas las validaciones y casos para el ingreso de información.


Clase VentanaBuscar.


Esta clase permite realizar las operaciones de Consulta, Actualización y eliminación de la tabla Persona, igual que la anterior representa la parte visual del modelo y se ejecutan los eventos para la lógica de los procesos anteriores, la forma de obtener los datos y como se le envían parámetros de consulta a la BD.


El Controlador.

Esta parte del patrón es la que define la lógica de administración del sistema, establece la conexión entre la vista y el modelo.

Clase Principal.

Esta clase contiene el método main que ejecuta la aplicación, el método hace un llamado al método iniciar el cual crea las instancias de las clases ventanas y la clase Logica  estableciendo las relaciones con la clase Coordinador.

A cada instancia de las clases se les envía una instancia de la clase Coordinador, y a la instancia de Coordinador se le envía cada instancia de las clases, esto por medio de los métodos set y get estableciendo las relaciones necesarias y por ultimo se usa la instancia de la clase VentanaPrincipal para cargarla en pantalla.

private void iniciar() {
/**Se instancian las clases*/
miVentanaPrincipal=new VentanaPrincipal();
miVentanaRegistro=new VentanaRegistro();
miVentanaBuscar= new VentanaBuscar();
miLogica=new Logica();
miCoordinador= new Coordinador();

/**Se establecen las relaciones entre clases*/
miVentanaPrincipal.setCoordinador(miCoordinador);
miVentanaRegistro.setCoordinador(miCoordinador);
miVentanaBuscar.setCoordinador(miCoordinador);
miLogica.setCoordinador(miCoordinador);

/**Se establecen relaciones con la clase coordinador*/
miCoordinador.setMiVentanaPrincipal(miVentanaPrincipal);
miCoordinador.setMiVentanaRegistro(miVentanaRegistro);
miCoordinador.setMiVentanaBuscar(miVentanaBuscar);
miCoordinador.setMiLogica(miLogica);

miVentanaPrincipal.setVisible(true);
}


Clase Coordinador.

Esta clase contiene toda la lógica de relaciones en el aplicativo, es el puente entre el modelo y las vistas.

Puede contener instancias locales tanto de clases de la vista como de clases del modelo, estas instancias tienen sus respectivos métodos set y get permitiendo el flujo de llamados del sistema.

Cuando se desea registrar una persona desde la clase VentanaRegistro se hace un llamado al método registrarPersona() de la clase Coordinador, posteriormente esta clase llama al método ValidarRegistro() de la clase Logica y esta a su vez realiza las validaciones correspondientes para determinar si se llama o no al método RegistrarPersona() de la clase PersonaDao.

public Logica getMiLogica() {
return miLogica;
}

public void setMiLogica(Logica miLogica) {
this.miLogica = miLogica;
}

public void mostrarVentanaRegistro() {
miVentanaRegistro.setVisible(true);
}

public void mostrarVentanaConsulta() {
miVentanaBuscar.setVisible(true);
}

public void registrarPersona(PersonaVo miPersona) {
miLogica.validarRegistro(miPersona);
}

La Aplicación.

El Sistema esta desarrollado como un proyecto Eclipse, En la siguiente imagen vemos que se crearon tres paquetes principales y de esta forma se tiene independiente la parte de la vista, el modelo y el controlador, el paquete modelo posee los paquetes conexión  dao y vo ya que aunque pertenecen al modelo y la lógica de negocio debe establecerse también su independencia con respecto a las operaciones, es decir, las clases Vo por ejemplo no poseen métodos de operaciones asociadas a la lógica de negocio, tan solo deben representar las tablas de la BD, entonces en el paquete vo se agruparán todas las clases equivalente a entidades.

El proyecto tiene los directorios db y conector, estos directorios se crearon solamente para agregar el script de creación de la BD y el mysql connector, este ultimo debe ser agregado al build path para que el sistema pueda funcionar (sobre el proyecto, clic derecho/configure Build path... ).


Conclusiones.

Como vimos tenemos un proyecto funcional que realiza las operaciones básicas del CRUD, y donde todas sus partes se encuentran separadas por  funcionalidades, separando la parte visual de la lógica de negocio y estableciendo relaciones entre ellas............ en si se desarrolló como ejemplo practico, existen validaciones muy básicas y procesos simples pero pensado en modo de ejemplo sin mayor complejidad, también se utilizan algunos conceptos vistos en entradas anteriores como es el caso del manejo de excepciones, patrones entre otros...

Descarga.

En el link de descarga se encuentra el archivo .rar con la aplicación, solo es cuestión de descomprimir y abrir con Eclipse...

Y Listo, como se mencionó es un ejemplo simple, sin mucha lógica para aplicar, pero la intención es dar a conocer un poquito mas claro como se puede aplicar el MVC, espero que este ejemplo sea de utilidad..... ;)  


 

Ejemplo Patrón Observer

$
0
0
Vamos a realizar un pequeño y muy común ejemplo sobre el Patrón Observer....... en la entrada sobre Patrones de Diseño tocamos en términos generales que hace el patrón y como podríamos utilizarlo, (si no la han visto los invito a visitarla) en esta ocasión repasaremos un poco sobre su estructura he implementación y posteriormente daremos inicio al ejemplo.....

¿Que es?

Básicamente debemos saber que el patrón Observer es un patrón de comportamiento que permite relacionar diferentes objetos entre si en torno a uno Principal, así cada vez que este ultimo cambie su estado, los demás también cambiaran de forma automática....

Podemos decir entonces que dicho patrón se compone de un objeto observable u Observado (SujetoConcreto) y objetos observadores (ObservadorConcreto)....

Un  Objeto Observable puede tener uno o mas Observadores, como vemos el ObservadorConcreto implementala interface Observer (propia de Java) la cual permite informar sobre los cambios en los objetos observables mediante una llamada al método update()...

java también nos proporciona la Clase Observable de la cual extienden las clases o sujetos concretos (los observados), esta clase provee varios métodos importantes como por ejemplo registerObserver(), removeObserver(), notifyObservers() entre otros necesarios para el funcionamiento del patrón, mas adelante en nuestro ejemplo veremos como lo podemos usar.


El Problema.

Nos solicitan desarrollar una paleta de colores donde el usuario1 pueda seleccionar y visualizar el color que le guste, a la vez dicha selección debe ser controlada en tiempo real por el usuario2 y el usuario3 que hacen seguimiento a la selección realizada, el problema radica en que estos usuarios se encuentran en habitaciones distintas y no pueden ver la selección del usuario1...

La Solución.

Aplicaremos el Patrón Observador ya que según la solicitud, los usuarios 2 y 3 deben ser informados de manera automática sobre la selección del usuario1, (esto descarta la posibilidad de que ambos usuarios tengan que refrescar el sistema, pantalla o ventana para estar al tanto del color elegido por el usuario1) de esta forma podríamos definir que el usuario1 sera el observado y los demás los observadores.............sin embargo podemos manipular nuestra solución para que todos tengan ambos roles.


La Aplicación.

Crearemos 3 Ventanas que presentarán las aplicaciones de los usuarios, dichas ventanas implementarán las interfaz Observer, siendo cada una un ObservadorConcreto,  tenemos también la ClaseObservador la cual extenderá de la clase Observable siendo así el sujetoConcreto, pero como mencionamos anteriormente vamos a hacer que todas las aplicaciones de los usuarios tengan ambos roles, para esto asociaremos a las clases "Ventanas" con la ClaseObservador mediante instancias de esta ultima y de esta forma nuestras clases Ventanas serán tanto Observadores Concretos como Sujetos Concretos, donde el rol dependerá de la función de cada una...


ClaseObservador.

Esta clase sera el medio por el cual las clases VentanaSelección, VentanaColor, y VentanaOpciones podrán convertirse en SujetosConcretos (Usando métodos set y get...)...........la claseObservador extiende de Observable heredando los métodos requeridos para notificar a los observadores sobre los cambios realizados, para esto usaremos el atributo colorSeleccionado activando los eventos de setChanged() y notifyObservers()

public class ClaseObservador extends Observable{

private int colorSeleccionado;
private String color;

public ClaseObservador(){

}
public void setColorSeleccionado(int i) {
this.colorSeleccionado = i;
setChanged();
notifyObservers();
}
public int getColorSeleccionado() {
return colorSeleccionado;
}
public void setColor(String color) {
this.color = color;
}
public String getColor() {
return color;
}
}


Clase Principal.

Esta sera la clase encargada de dar inicio al sistema, además en ella también estableceremos las relaciones entre la ClaseObservador y las Clases "Ventanas", crearemos instancias de cada Clase y luego mediante el método addObserver() (Heredado de Observable) agregaremos todos los ObservadoresConcretos a nuestro SujetoConcreto.

public static void main(String[] args) 
{
ClaseObservador observador=new ClaseObservador();
VentanaOpciones miVentanaOpciones=new VentanaOpciones(observador);
VentanaColor miVentanaColor=new VentanaColor(observador);
VentanaSeleccion miVentanaSeleccion=new VentanaSeleccion(observador);

/**Aqui se Agregan los observadores*/
observador.addObserver(miVentanaColor);
observador.addObserver(miVentanaSeleccion);
observador.addObserver(miVentanaOpciones);
}

VentanaColor.

Esta será la clase que simulará la aplicación manejada por el usuario1, esta clase implementará la interfaz Observer y definirá el comportamiento del método update() que como mencionamos anteriormente es llamado cada vez que la ClaseObservador cambia de estado, también crearemos una instancia de dicha clase para convertir a VentanaColor en un SujetoConcreto y de esta forma las demás ventanas serán informadas cuando esta cambie mediante los eventos definidos por el usuario....

VentanaOpciones.

Esta clase corresponde a la aplicación del usuario2, brindaremos la opción al usuario de seleccionar algún color, en esta clase también definimos una instancia de ClaseObservador de modo que por medio del evento generado y la instancia mencionada podamos dar un comportamiento de SujetoConcreto, igual que la anterior también implementa la interfaz Observer...(El combo se actualiza si el usuario1 cambia de color)

VentanaSelección.

Representa la aplicación del usuario3, esta ventana a diferencia de las anteriores no posee ninguna opción disponible para el usuario, tan solo cumplirá el rol de ObservadorConcreto, posee una instancia de ClaseObservador mediante la cual estará informando al usuario sobre la opción seleccionada en alguna de las ventanas, todo esto gracias al método update() de la interfaz Observer.


Conclusiones.

Y Listo!!!...............Como vemos el ejemplo es muy básico, no tenemos paquetes ni cosas complejas, solo se busca cumplir con el objetivo de dar a entender la aplicación del patrón Observer, simulamos las ventanas como 3 aplicaciones diferentes, sin embargo este patrón también puede ser combinado con diferentes proyectos para hacer mucho mas real su aplicación.


Referencias.

Head First Design Patterns

Descarga.

En el link de descarga se encuentra el archivo .rar con la aplicación, solo es cuestión de descomprimir y abrir con Eclipse...

Espero que este ejemplo sea de Utilidad y sirva como base para su aplicación en futuros desarrollos ;)




Ejemplo Patron Delegate

$
0
0
En esta entrada veremos de forma simple el funcionamiento del patrón Delegate, su uso es muy sencillo y común, tal vez muchos de nosotros trabajamos este patrón sin saberlo ya que va muy de la mano con el manejo de objetos y relación entre clases............ a continuación veremos un ejemplo básico de su aplicación.


¿Que es?


Como dijimos en la entrada sobre patrones de diseño, el patrón delegate Permite extender y reutilizar la funcionalidad de una clase sin utilizar el mecanismo de herencia, donde la Clase C puede acceder a los método de la Clase B por medio de una instancia de esta ultima (No confundir con Bussines Delegate)...

El problema.

Vamos a hacer una aplicación pequeña donde nos piden realizar operaciones matemáticas pero los métodos de dichas operaciones se encuentran en clases diferentes...

La Solución. 

Como nos dicen que los métodos a utilizar se encuentran en diferentes clases podemos utilizar el Patrón Delegate por medio de la relación "Usa" para indicar sobre la asociación y toma de funcionalidades entre la clase principal y las clases con operaciones, delegando la responsabilidad de ejecutar un proceso concreto usando otro objeto con los permisos para realizarlo.

La Aplicación.

El ejemplo es muy simple, vamos a crear una aplicación pequeña donde podamos ingresar 2 números, encontrar el mayor, el menor y posteriormente calcular su división, muy básico pero lo realizaremos usando el patrón Delegate......Veamos

Clase OperacionesMatematicas.

Esta clase tiene el método dividir() que sera la operación principal de nuestra aplicación, posee los atributos numero1 y numero2 que serán heredados por la clase Ingreso desde donde se aplicará el patrón Delegate.
public class OperacionesMatematicas 
{
public double numero1;
double numero2;

/**
* Permite dividir 2 numeros
* @param numero1
* @param numero2
* @return
*/
public double dividir(double numero1, double numero2)
{
return (numero1/numero2);
}
}


Clase Organiza.

Esta clase posee los métodos calculaMayor() y calculaMenor(), los cuales reciben los dos números ingresados por el usuario definiendo así el dividendo y el divisor.........como estos métodos son importantes por la aplicación y en vista de que java no posee la herencia múltiple, esta clase sera usada por medio del patrón Delegate para tener acceso a los métodos mencionados.
public class Organiza {
/**
* Metodo para calcular el mayor de entre 2 numeros
* @param a
* @param b
* @return
*/
public double calculaMayor(double a, double b){
if (a > b)
return a;
else
return b;
}

/**
* Metodo para calcular el menor de entre 2 numeros
* @param a
* @param b
* @return
*/
public double calculaMenor(double a, double b) {
if (a < b)
return a;
else
return b;
}
}

Clase Ingreso.

Esta clase permite obtener los números ingresados por el usuario, Se usa el mecanismo de herencia para obtener la funcionalidad de dividir que se encuentra en la clase OperacionesMatematicas, sin embargo antes de esto necesitamos definir cual es el dividiendo y el divisor por medio de los métodos que se encuentran en la clase Organiza.

Aquí es donde aplicamos el patrón Delegate, ya que como se ha mencionado anteriormente el lenguaje no permite la herencia múltiple así que la única manera de acceder a estos métodos es por medio de la relación "Usa" que provee el patrón Delegate, asi, creando una instancia de la clase Organiza delegamos las funciones al objeto miOrganizapara acceder a los metodos que calculan el numero mayor y el menor....
public class Ingreso extends OperacionesMatematicas
{
Organiza miOrganiza;
double mayor,menor;
public Ingreso()
{
miOrganiza=new Organiza();/**delega para emplear la relacion "Usa"*/
}

/**
* Permite el ingreso de 2 numeros enteros para el posterior
* calculo de su division
*/
public void ingresar()
{
try {
numero1=Integer.parseInt(JOptionPane.showInputDialog("valor1: "));
numero2=Integer.parseInt(JOptionPane.showInputDialog("valor2: "));
/**Usa miOrganiza para obtener el mayor*/
mayor=miOrganiza.calculaMayor(numero1, numero2);
/**Usa miOrganiza para obtener el menor*/
menor=miOrganiza.calculaMenor(numero1, numero2);

JOptionPane.showMessageDialog(null,"La division entre:" +
""+mayor+"/"+menor+" = "+dividir(mayor, menor));

} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Error en el ingreso de datos");
}
}
}


Clase Principal.

Esta clase simplemente contiene el método main() y realiza el llamado a la clase Ingreso, donde inicia la aplicación...

public class Principal {  
public static void main(String[] args){
Ingreso miIngreso=new Ingreso();
miIngreso.ingresar();
}


Conclusiones.

Como vemos este patrón es muy simple y lo mas normal es que muchos de nosotros lo hayamos utilizado sin saber, básicamente podemos extender nuestro sistema utilizando funcionalidades de otras clases, sin necesidad de utilizar la herencia.........el ejemplo fue muy simple y no tiene mayor grado de complejidad, pero sin importar el contexto de la aplicación en la que se utilice el objetivo será el mismo..... 



También te podría Interesar. 


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo.... 

Ejemplo Patrón Abstract Factory

$
0
0
Siguiendo con la secuencia de entradas sobre patrones de diseño, en esta ocasión realizaremos un ejemplo usando el Patrón Abstract Factory.......... es uno de esos ejemplos simples pero que enmarcan el objetivo del patrón.......




Que es?

Antes que nada debemos saber que existe un patrón llamado Factory el cual permite delegar en una clase la responsabilidad de crear objetos de otras clases, basados en esto Podemos decir que el Abstract Factory es una nueva fase de Factory, Teniendo así una Fabrica de Objetos donde la creación es transparente para la clase que los solicita.

Debemos saber entonces que el patrón Abstract Factory nos brinda una interfaz para crear familias de Objetos relacionados sin tener que especificar sus clases concretas desde la clase cliente (Clase que los solicita)

El problema

Se solicita la creación de diferentes vehículos de transporte (Buses, Busetas y Taxis) sin que se especifique en detalle la forma de su creación.

La solución.

Utilizamos el patrón Abstract Factory para independizar la forma como crearemos los objetos, de esta manera creamos familias de objetos de tipo Vehículo delegando el proceso y sin tener que entrar en detalles desde la clase solicitante.

 

La Aplicación.

Una vez mas trabajamos con un ejemplo simple, veremos una aplicación pequeña que permite al usuario crear  familias de vehículos de 3 tipos diferentes, Buses, Busetas y Taxis, tan solo presentamos unas opciones de selección donde escogeremos que Objeto crear, he internamente  por medio del Patrón de Diseño ejecutamos el proceso de creación....

Con este patrón revivimos Conceptos Básicos de Programación Orientada a Objetos tales como Las Interfaces, métodos Abstractos, Herencia, polimorfismo entre otros (si no los conocen los invito a darles una mirada aquí)... 


En General la Aplicación se divide en Clases Fabricas que permiten hacer el llamado a la creación de Objetos, Interfaces que permiten aplicar conceptos como la Herencia y el Polimorfismo, también contamos con clases Concretas que representan los Objetos que crearán las Fabricas y por ultimo la clase principal que permitirá delegar las solicitudes para iniciar el proceso de creación.... Veamos!!!

Las Interfaces.

Interface Vehiculo.

Esta Interface es común para todos los vehículos de nuestra fabrica, en ella se declaran 2 métodos abstractos que serán comunes para los objetos a crear, sin importar si son Buses, Busetas o Taxis (Sabemos que por regla todos los métodos de una interfaz son abstractos, por ello no es necesario declararlos como tal) 
package interfaces;

/**
* interfaz donde se establece el codigo del servicio
* @author chenao
*/
public interface Vehiculo
{
public void codigoDeVehiculo();
public int generarCodigo();
}

Interface VehiculoDeTransporte.

Esta Interface será implementada por las diferentes fabricas de de vehículos de la aplicación, cuenta con el método abstracto crearVehiculo() que será común para cada fabrica y como su nombre lo dice, le permitirá a cada una implementar la lógica para crear sus objetos concretos.
package interfaces;

/**
* interfaz que establece la creacion de un servicio
* @author chenao
*/
public interface VehiculoDeTransporte {
public Vehiculo crearVehiculo();
}

Las Fabricas.

Se componen por la Fabrica de Vehículos Principal que hace el llamado a las fabricas de Objetos Concretos..... estas implementan la interface VehiculoDeTransporte permitiendo crear los vehículos del tipo correspondiente y asignar el respectivo código de creación.....

Clase FabricaDeVehiculos.

Esta clase sera la Fabrica Principal cuenta con un método estático que permitirá la creación de los diferentes tipos de vehículos, aplicamos el concepto de polimorfismo para ejecutar el llamado a la Fabrica correspondiente y crear el objeto concreto solicitado  por el cliente.
package fabricas;

import interfaces.Vehiculo;
import interfaces.VehiculoDeTransporte;

/**
* Clase que permite la creacion de un servicio
* @author chenao
*
*/
public class FabricaDeVehiculos {
public static void crearFabricaDeVehiculo(VehiculoDeTransporte factory){
/**Aplicamos Polimorfismo*/
Vehiculo objetoVehiculo= factory.crearVehiculo();
objetoVehiculo.codigoDeVehiculo();
}
}

Clase FabricaBuses.
package fabricas;
import interfaces.Vehiculo;
import interfaces.VehiculoDeTransporte;

import javax.swing.JOptionPane;

import clases.Bus;

/**
* Clase que permite la creacion de un objeto Bus
* @author chenao
*
*/
public class FabricaBuses implements VehiculoDeTransporte{
public Vehiculo crearVehiculo() {
Bus miBus=new Bus();
miBus.setCodigo(miBus.generarCodigo());
JOptionPane.showMessageDialog(null, "Se ha creado un nuevo Objeto Bus ");
return miBus;
}
}

Clase FabricaBusetas.
package fabricas;
import interfaces.Vehiculo;
import interfaces.VehiculoDeTransporte;

import javax.swing.JOptionPane;

import clases.Buseta;

/**
* Clase que permite la creacion de un objeto Buseta
* @author chenao
*
*/
public class FabricaBusetas implements VehiculoDeTransporte{
@Override
public Vehiculo crearVehiculo() {
Buseta miBuseta=new Buseta();
miBuseta.setCodigo(miBuseta.generarCodigo());
JOptionPane.showMessageDialog(null, "Se ha creado un nuevo Objeto Buseta");
return miBuseta;
}
}

Clase FabricaTaxis.
package fabricas;
import interfaces.Vehiculo;
import interfaces.VehiculoDeTransporte;

import javax.swing.JOptionPane;

import clases.Taxi;

/**
* Clase que permite la creacion de un objeto Taxi
* @author chenao
*
*/
public class FabricaTaxis implements VehiculoDeTransporte{
@Override
public Vehiculo crearVehiculo() {
Taxi miTaxi=new Taxi();
miTaxi.setCodigo(miTaxi.generarCodigo());
JOptionPane.showMessageDialog(null, "Se ha creado un nuevo Objeto Taxi");
return miTaxi;
}
}

Las Clases Concretas.

Representan las clases de las que se instanciarán los objetos de tipo Vehículo (Buses, Busetas y Taxis) así como la clase principal que permite delegar las funcionalidades.....Las clases Bus, Buseta y Taxi Implementan la Interface Vehículo, y cada una permite generar un código aleatorio para identificar el vehículo creado....

Clase Bus.
package clases;
import interfaces.Vehiculo;

import javax.swing.JOptionPane;

/**
* clase que establece el codigo del servicio de buses
* @author chenao
*
*/
public class Bus implements Vehiculo{
private int codigo;

public int generarCodigo()
{
int codigoBus=(int) (Math.random()*9999);
return codigoBus;
}
public int getCodigo() {
return codigo;
}
public void setCodigo(int codigo) {
this.codigo = codigo;
}
public void codigoDeVehiculo() {
JOptionPane.showMessageDialog(null,"El Codigo del Bus es : "+getCodigo());
}
}

Clase Buseta.
package clases;
import interfaces.Vehiculo;

import javax.swing.JOptionPane;

/**
* clase que establece el codigo del servicio de busetas
* @author chenao
*/
public class Buseta implements Vehiculo{

private int codigo;
public int generarCodigo()
{
int codigoBuseta=(int) (Math.random()*9999);
return codigoBuseta;
}
public int getCodigo() {
return codigo;
}
public void setCodigo(int codigo) {
this.codigo = codigo;
}
@Override
public void codigoDeVehiculo() {
JOptionPane.showMessageDialog(null,"El Codigo de la Buseta es:"+getCodigo());
}
}

Clase Taxi. 
package clases;
import interfaces.Vehiculo;

import javax.swing.JOptionPane;

/**
* clase que establece el codigo del servicio de taxis
* @author chenao
*/
public class Taxi implements Vehiculo{
private int codigo;
public int generarCodigo()
{
/**Generamos un codigo aleatorio para el taxi*/
int codigoTaxi=(int) (Math.random()*9999);
return codigoTaxi;
}
public int getCodigo() {
return codigo;
}
public void setCodigo(int codigo) {
this.codigo = codigo;
}
@Override
public void codigoDeVehiculo() {
JOptionPane.showMessageDialog(null,"El Codigo del Taxi es : "+getCodigo());
}
}

Clase Principal. 

Esta clase permite iniciar el sistema, en ella creamos las instancias de Fabricas y mediante un menú de opciones se define y delega que Fabrica inicia el proceso de creación...
package principal;
import javax.swing.JOptionPane;

import fabricas.FabricaBuses;
import fabricas.FabricaBusetas;
import fabricas.FabricaDeVehiculos;
import fabricas.FabricaTaxis;

/**
* clase principal del aplicativo donde se establecen las instancias
* de las fabricas
* @author chenao
*
*/
public class Principal {

public static void main(String[] args)
{
FabricaBusetas busetas=new FabricaBusetas();
FabricaTaxis taxi=new FabricaTaxis();
FabricaBuses buses=new FabricaBuses();
String cad="",salida;
cad+="Ingrese la opción correspondiente para obtener el codigo del servicio\n";
cad+="1. Codigo servicio de Taxis\n";
cad+="2. Codigo servicio de Buses\n";
cad+="3. Codigo servicio de Busetas\n\n";
try {
do {
try
{
int opcion=Integer.parseInt(JOptionPane.showInputDialog(cad));
switch (opcion)
{
case 1:FabricaDeVehiculos.crearFabricaDeVehiculo(taxi);
break;
case 2:FabricaDeVehiculos.crearFabricaDeVehiculo(buses);
break;
case 3:FabricaDeVehiculos.crearFabricaDeVehiculo(busetas);
break;
default:JOptionPane.showMessageDialog(null,"No es un valor de consultavalido");
break;
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null,"No es un parametro de consulta valido");
}
salida=JOptionPane.showInputDialog("Desea consultar otro codigo? S/N");

} while (salida.toUpperCase().equals("S"));
} catch (Exception e) {
JOptionPane.showMessageDialog(null,"Bye!!!");
}
}
}


Conclusiones.

Y Listo!!! Como vemos  es un Patrón que al principio puede sonar un poco intimidante pero a medida que vamos trabajando con el nos damos cuenta de como podemos sacarle provecho a su aplicación...

Podemos evidenciar también el uso de varios conceptos de programación orientada a objetos siendo los patrones de diseño un gran ejemplo de su aplicación....

Descarga.

Como se mencionó el ejemplo es muy básico y simple, sin embargo les dejo el linck de descarga para que lo prueben ;) 

También te podría Interesar. 


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo.... 

Ejemplo Patrón Singleton

$
0
0
Vamos a ver uno de los Patrones mas comunes en desarrollo de software, como he indicado en otras entradas  tal vez muchas veces lo utilizamos sin saber ya que es un patrón muy sencillo de implementar.........de igual forma veremos un ejemplo simple donde podremos ver su aplicación.

Que es?

El Patrón Singleton también se conoce como Instancia única, su objetivo es restringir la creación de objetos  pertenencientes a una clase, de modo que solo se tenga una única instancia de la clase para toda la aplicación, garantizando así un punto de acceso global al objeto creado. 

Para implementarlo, la clase Singleton debe tener un constructor privado que solo sera accedido desde la misma clase, se crea también una instancia privada de la clase, así como un método estático que permita el acceso a dicha instancia de la forma ClaseSingleton.getInstanciaSingleton();

Este patrón es  muy útil cuando necesitamos crear un clase común y global para todo el sistema, donde no nos interese crear varias instancias de la misma, por ejemplo podríamos pensar en una clase conexión que utiliza toda la aplicación, si creamos varias instancias de esta podríamos llenar el heap del sistema con muchos objetos innecesarios que se crean cada vez que instanciamos la clase, por eso restringiendo la creación a un único objeto evitamos problemas de rendimiento y trabajo para el garbage collector...

Otro ejemplo podría ser la creación de un objeto que carga los parámetros de un archivo de propiedades, de esta manera evitariamos que el sistema lea el archivo cada vez que lo necesite, en vez de eso tan solo llamaríamos al objeto que contiene los parámetros necesarios...

El Problema.

Se solicita generar un historial de los eventos ejecutados por 3 usuarios del sistema, estos eventos se generan cada vez que alguno de los usuarios presiona un botón determinado de un panel de opciones, este historial debe contener la fecha y hora de ejecución del evento, además del usuario y opción presionada.

La Solución.

Como nos piden que se genere un historial  de los eventos ejecutados por los usuarios utilizaremos el patrón Singleton, ya que este historial es general para todos los usuarios del sistema, así crearemos un punto global para la aplicación que permita ir almacenando cada evento generado independientemente de quien lo ejecute.....

La Aplicación.

El sistema es muy simple, se contara con 3 usuarios del sistema definidos por defecto, una ventana principal que permitirá seleccionar alguno de los usuarios y posteriormente cargar una ventana donde el usuario seleccionado podrá ejecutar los eventos disponibles, por ultimo se tendrá una ventana donde podremos ver el histórico de eventos ejecutados en la aplicación.

El sistema se divide en un paquete principal que contiene la clase que ejecuta la aplicación, un paquete de ventanas donde almacenaremos las interfaces graficas de usuario, un paquete vo donde tenemos la clase persona necesaria para el envió de usuarios y por ultimo el paquete singleton que contiene la clase representativa del Patrón.

ClaseLogSingleton.

Este es el eje central de nuestro ejemplo, aquí implementamos el patrón Singleton, en ella creamos una instancia privada de la clase, la cual podrá ser accedida mediante el método getMiLogSingleton(), al ser un método estático, todas las clases que necesiten el objeto Singleton podrán obtenerlo realizando el llamado correspondiente, como declaramos el constructor privado, evitamos que se generen instancias de ella....usamos el atributo "contenido" para almacenar el histórico de los eventos generados.
public class ClaseLogSingleton {

private String contenido;

/**objeto Singleton*/
private static ClaseLogSingleton miLogSingleton= new ClaseLogSingleton();

private ClaseLogSingleton(){
setContenido("Eventos de Usuario\n\n") ;
}
/**
* @return the miLogSingleton
*/
public static ClaseLogSingleton getMiLogSingleton() {
return miLogSingleton;
}
/**
* @return the contenido
*/
public String getContenido() {
return contenido;
}
/**
* @param contenido the contenido to set
*/
public void setContenido(String contenido) {
this.contenido = contenido;
}
}


Clase Principal.

Esta clase obtiene un arreglo de objetos Persona que posteriormente son enviados a la VentanaPrincipal para luego poder definir que usuario ejecutó que evento.......
public class Principal {

public static void main(String[] args) {
Principal miPrincipal = new Principal();
PersonaVo[] personas=miPrincipal.crearPersonas();
VentanaPrincipal miVentanaPrincipal=new VentanaPrincipal(personas);
miVentanaPrincipal.setVisible(true);
}

private PersonaVo[] crearPersonas() {
PersonaVo persona1= new PersonaVo();
persona1.setNombre("Pedro");
persona1.setDocumento(1);

PersonaVo persona2= new PersonaVo();
persona2.setNombre("Pablo");
persona2.setDocumento(2);

PersonaVo persona3= new PersonaVo();
persona3.setNombre("Paco");
persona3.setDocumento(3);

PersonaVo personas[] = {persona1,persona2,persona3};
return personas;
}
}

Clase PersonaVo


Con esta clase usamos el Patrón Vo para poder generar instancias de tipo Persona, no realizaremos ningún tipo de proceso complejo con estos objetos, tan solo dichas instancias van a ser usadas como los usuarios del sistema con los que se ejecutan los eventos.

VentanaPrincipal


Esta Clase permite la construcción de la VentanaPrincipal desde la cual podremos acceder a las opciones del sistema, la ventana presenta un combo de selección donde podemos dependiendo de la opción seleccionada, iniciar con los eventos de cada usuario o consultar el histórico de eventos realizados.

VentanaEventos.

Esta clase nos brinda una ventana que representa el Panel solicitado en el problema inicial, básicamente tenemos 6 botones que hacen el papel de las opciones a ejecutar por el usuario, cuando este presiona algún botón se realiza el llamado al objeto Singleton para almacenar el evento realizado y así ir actualizando el histórico de eventos del sistema.

VentanaLog.


Finalmente tenemos la ventana que nos permite visualizar el histórico de eventos realizados en la ventana de los botones, cada vez que llamamos esta ventana desde la VentanaPrincipal se carga el objeto Singleton creado una única vez, evitando instancias con la misma información. 

Conclusiones.

Como vemos el enfoque del patrón es muy simple, básicamente tenemos que conocer algunos conceptos como el manejo de métodos y variables estáticas, así como los niveles de encapsulamiento y ya podremos aplicar el patrón Singleton en nuestras aplicaciones.

También debemos tener en cuenta que todos los patrones tienen mucho mas para dar y muchas variables giran en torno a ellos, en este caso existen otras variantes del Singleton que lo hacen mucho mas óptimo en cuanto a acceso recurrente y manejo de peticiones, sin embargo en esta entrada no trabajamos dichas variantes ya que solo se quiso enmarcar el concepto inicial.....

Los invito a descargar el ejemplo para un mayor entendimiento ;)


Descarga.

El ejemplo es muy básico y simple, para entenderlo mejor les dejo el linck de descarga para que lo prueben ;) 


También te podría Interesar. 


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....


Ejemplo Pátron de Diseño Decorator

$
0
0
Llegamos a la penúltima entrada sobre el tema de patrones de Diseño, en esta ocasión trabajaremos un nuevo ejemplo pero enfocado en el Patrón Decorator.......

Así como en la mayoría de los trabajados, vamos a apoyarnos en el libro Head First Design Patterns para crear nuestro ejemplo, un ejemplo sencillo con una problematica por resolver, al final compartiré un enlace donde se podrá descargar el proyecto Java que trabajaremos...


¿Que es?

El Patrón Decorator Permite agregar funcionalidades y responsabilidades a objetos de forma dinámica y transparente para el usuario, esto se realiza por medio de relaciones con otras clases extendiendo su funcionalidad al incorporar las de las clases asociadas, de esta forma el patrón no es dependiente de la Herencia ya que aunque esta puede jugar un papel importante, prevalece el uso de conceptos como la composición al momento de definir comportamientos....



Como vemos en el diagrama de clases, tenemos una SuperClase de la cual heredan clases concretas y las clases Decoradoras que a su vez también pueden ser clases padre de clases decoradoras Concretas...... ¿Que?.....

¿Pero si dijimos que el patrón no es dependiente de la herencia porque hablamos de SuperClases?

La pregunta anterior es muy común, ya que puede llegar a ser muy confusa la definición, sin embargo la respuesta es muy simple, con el Decorator la herencia es requerida ya que los decoradores deben tener el mismo tipo de los objetos a decorar pero no se utiliza la Herencia para lograr el comportamiento....... el comportamiento se da al realizar la composición de decoradores con los componentes concretos.....(Cuando Hablamos de comportamiento, nos referimos a las nuevas funcionalidades que usamos...)

Si se basara en la herencia el comportamiento solo se definiría estáticamente en tiempo de compilación dependiendo de lo que las clases padres hereden, a demás todas las subClases deben heredar comportamientos que puede que no vayan a utilizar.....

El Problema.

Un restaurante de comidas rápidas ofrece 3 tipos de combos (Combo Básico, Combo Familiar, Combo Especial) cada combo tiene características diferentes en cuanto a cantidad, porciones, salsas entre otros, el restaurante también ofrece la posiblidad de aumentar el pedido mendiante diferentes porciones adicionales (Tomate, Papas, Carne, Queso), se desea crear un sistema de pedidos que permita al usuario seleccionar el combo deseado, así como armar su propio pedido con las porciones adicionales, el sistema deberá informar sobre el pedido del usuario y el valor total del mismo.

La Solución.

En el problema nos están solicitando algo puntual, facilmente deducimos que tenemos una familia de Combos en la que podemos usar la herencia, pero si atacáramos nuestro problema solo con este concepto, entonces tendríamos que crear clases concretas por cada posible combinación de porciones adicionales, tal vez esto no seria problema y el sistema funcione, pero si queremos realizar varias combinaciones para crear nuevos pedidos tendríamos que entrar a modificar el código fuente y luego ejecutar nuevamente la aplicación para que los cambios puedan ser visualizados.... por esta razón anteriormente dijimos que usando la herencia el comportamiento solo se definiría estáticamente basados en lo heredado por las clases Padre....

La solución que nos da el patrón Decorator es solo utilizar la herencia para que las clases Decorator tengan el mismo tipo de los objetos a decorar y utilizaremos la composición para determinar el comportamiento de forma dinámica y en tiempo de ejecución basados en concepto de "Usa" relacionando los decoradores con los componentes concretos, así no modificariamos la lógica de las clases existentes cada vez...... Veamos....

La Aplicación.


Crearemos nuestro sistema ajustándonos al diagrama de clases del patrón, tenemos una SuperClase Combo que representa los combos de comidas rapidas disponibles de la cual heredan los tipos ComboBasico, ComboFamiliar y ComboEspecial, tambien hereda de el las clases Decorator, en este caso tenemos la clase de Adicionales como el decorador y a su vez las hijas que corresponden a cada porción, siendo estas las clases decoradoras concretas....

Vamos a explicar la Aplicación agrupándola en sus 3 paquetes: Componentes, Decoradores y Principal...

Componentes.

Este paquete contiene la Jerarquía de componentes del patrón, aquí tenemos la SuperClase Combo y sus hijas concretas, el Combo es una clase Abstracta que define una descripción que cada subClase definirá (de que se compone el combo), así como también el método abstracto valor que sera definido por cada subClase que lo implemente.
public abstract class Combo {

String descripcion = "";

public String getDescripcion()
{
return descripcion;
}

public abstract int valor();

}

Las estructura de las clases concretas también es simple, definirán el precio del combo correspondiente y asignaran una descripción. (Cada Clase es igual...)
public class ComboBasico extends Combo{

public ComboBasico() {
descripcion="Porcion de Papas Fritas, " +
"salsa, queso, amburgueza sencilla, gaseosa";
}

@Override
public int valor() {
return 6200;
}
}

Decoradores.

Los Decoradores en este caso serán las porciones adicionales, tenemos una clase AdicionalesDecorator que es el decorador principal del cual implementaran los decoradores concretos, esta clase es hija de la clase Combo y proporciona un método abstracto descripcion() para anexar a la descripción del combo, la porción seleccionada por el usuario...
public abstract class AdicionalesDecorator extends Combo{

public abstract String getDescripcion();
}

Cada Decorador concreto implementa el método getDescripcion(), agregando a la descripción la porción seleccionada por el usuario, también implementa el método valor() de la clase Combo, en el cual se agrega al valor del combo, el precio de la porción....... como vemos en estos decoradores concretos se aplica la composición en el momento que creamos el objeto combo (la clase Combo es abstracta por lo tanto no puede ser instanciada directamente, por lo tanto el objeto que llega como parámetro al constructor se creó previamente por medio de polimorfismo)....
public class Carne extends AdicionalesDecorator{

Combo combo;

public Carne(Combo combo)
{
this.combo=combo;
}

@Override
public String getDescripcion() {
return combo.getDescripcion()+" , Porcion de Carne";
}

@Override
public int valor() {
return 2500+combo.valor();
}
}

Principal.



Finalmente en el paquete principal tenemos la clase donde se ejecuta el programa y la ventana que representa el Menú de Selección desde el cual el usuario puede seleccionar el Combo y las porciones a pedir, al enviar el pedido el sistema de forma dinámica por medio del patrón Decorator valida las combinaciones solicitadas y calcula el precio Total del pedido.



Y listo, al aplicar el patrón pudimos crear un menú de comidas que puede ser construido por el usuario, sin necesidad de modificar cada vez el código fuente ya que el armado del menú se realiza en tiempo de ejecución gracias al Decorator!!!


Conclusiones.

Como vemos el patrón nos facilita enormemente el trabajo en este tipo de problematicas, imaginen tener que usar solo la herencia para crear un Menú que cumpla con las necesidades de cada cliente, cuantas combinaciones se tendrían que realizar por cada posible combinación, en cambio con el patrón tan solo necesitamos las clases Bases y los decoradores, gracias a la lógica aplicada, las combinaciones se realizan solas....

La lógica del patrón actúa como envoltorios dependiendo de los posibles tipos de combos y adicionales seleccionadas, si queremos un combo familiar con papas extra entonces se crea esta agrupación, si además escogemos una porción de queso entonces dicha porción es agregada a la anterior...

Cuando usamos este patrón reducimos las posibilidades de generar errores o defectos secundarios no deseados, ya que si queremos añadir nuevas funcionalidades, agregamos nuevo código sin modificar el existente...

Con el Patrón los diseños son resistentes al cambio y lo suficientemente flexibles como para satisfacer necesidades cambiantes.

El patrón a demás de utilizar la herencia y la composición también aplica conceptos de polimorfismo que pueden ser evidenciados en el código fuente..

Como en todo la practica es fundamental, por eso los invito a repasar el Patrón y descargarlo para un mayor entendimiento.




Descarga.

El ejemplo es muy básico y simple, para entenderlo mejor les dejo el linck de descarga para que lo prueben ;) 


También te podría Interesar. 


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

Instalación Jenkins en Windows.

$
0
0
Iniciamos con la Instalación de Jenkins en Windows, asumiremos que conoce lo que es un servidor de aplicaciones y que tiene su máquina con el ambiente necesario para realizar la instalación, en este caso básicamente necesitaría tener un servidor y un JDK instalado, en este ejemplo trabajaremos con el  jdk1.6.0_22 y con el servidor de aplicaciones jboss-4.2.3.GA (Si no tiene el ambiente necesario puede seguir los tutoriales para instalar el JDK y el Servidor JBoss presionado aquí y aquí.)

La instalación de Jenkins se puede hacer de dos formas, la primera es descargando y ejecutando el asistente de instalación desde la página principal http://jenkins-ci.org/y seleccionando el sistema operativo desde el que vamos a trabajar, o simplemente descargando él .war desde la misma página como lo haremos a continuación.

Requisitos de Instalación. 

- JDK1.6.0_22 
- JBoss-4.2.3.GA 
- Jenkins.war

Instalación.

Descargue el Jenkins.war  desde la página principal de Jenkins presionando la opción  “Latest and greatest” (Al descargarlo como un fichero war se puede ejecutar en cualquier sistema operativo). 




Ingrese al servidor Jboss  y copie el Jenkins.war en la carpeta deploy.


Establezca la variable de entorno JENKINS_HOME con la ruta donde quedaran almacenados los archivos de generación del Jenkins, además del código fuente que se descargará al ejecutarse las tareas automáticas (se recomienda un directorio que contenga suficiente espacio de memoria, tenga en cuenta que Jenkins no requiere de una base de datos, los archivos necesarios para su funcionamiento son almacenados en el disco).



Despliegue de Jenkins.

Para el despliegue, ejecutar el run.bat desde la carpeta bin del servidor jboss


Después de que despliegue completamente el servidor, ingresar a la página http://localhost:8080/jenkins/......................ahora nuestro Jenkins está listo para trabajar.


Y Listo, Hasta aquí finaliza el proceso de instalación de Jenkins, podemos verificar la ruta ingresada en la variable de entorno JENKINS_HOME y veremos los archivos generados por el aplicativo.

NOTA:
 
Tener presente que si no sube el aplicativo se debe revisar la consola del servidor para darnos cuenta de la causa, en ocasiones puede tratarse de un error por espacio de memoria,  PermGen Space.



Para esto hay que entrar al run.bat del jboss y modificar la línea donde se establecen las propiedades de memoria de la JVM (recomiendo que habrán el archivo mediante algún editor que lo soporte, para ese caso pueden utilizar Notepad++), agregando al final -Xms512m -Xmx1000m -XX:MaxPermSize=128m así.


Ya tenemos nuestro Jenkins instalado,  configurado y listo para trabajar, mas adelante veremos como realizar las configuraciones básicas sobre el aplicativo, tales como creación de usuarios y tareas entre otros....


También te podría Interesar. 



¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

Opciones de Seguridad en Jenkins

$
0
0
En la entrada anterior realizamos la instalación de Jenkins en Windows, el día de hoy veremos una de las partes mas importantes en cuestiones de seguridad sobre el aplicativo, realizando configuraciones básicas y dando paso al proceso de creación de usuarios.



Configurar Seguridad.

Cuando trabajamos con Jenkins podemos hacerlo de la manera por defecto o por medio de usuarios, si escogemos la primera opción nos veremos posiblemente enfrentados a problemas en cuestiones de seguridad, pues cualquiera que ingrese al aplicativo tendría libre acceso a los proyectos, ejecuciones  o configuración en general, por eso es recomendable hacer uso de las herramientas que dispone Jenkins en torno a esto.

La primera vez que iniciamos Jenkins nos aparece una pantalla como esta:

 

Para realizar las configuraciones de seguridad, desde la página de inicio de Jenkins en el menú principal  ingresamos a la opción “Administrar Jenkins”

Acto seguido se cargara una pantalla con las opciones de administración entre las cuales podemos encontrar configuración del sistema, administración de plugins, administración de nodos entre otros, en este caso seleccionamos la opción “Configure Global Security”.


Después de esto nos carga otra pantalla con 2 opciones, seleccionamos la primera“Activar Seguridad” inmediatamente se despliega un panel con diferentes opciones de seguridad por defecto.


Desde aquí configuraremos la seguridad que queremos manejar en Jenkins, seleccionamos la opción “Usar base de datos de Jenkins” y de forma opcional podemos definir si permitimos que los usuarios se registren o no, si no definimos esta opción, entonces solo el administrador podrá registrar usuarios para el aplicativo.

Para este caso dejamos la opción “Permitir que los usuarios se registren.”

En la sección Autorización existen otras opciones, por defecto nos indica que cualquiera puede hacer cualquier acción, para este caso seleccionamos la opción “Estrategia de seguridad en el proyecto” la cual nos sirve para definir los permisos necesarios en las tareas que vamos a crear, estableciendo que usuarios pueden realizar qué acciones sobre una tarea en específico (los usuarios son asociados a las tareas al momento de su creación).

(Nota: Se encuentra también la opción “Configuración de seguridad”, es muy parecida a la anterior, a diferencia que se realiza una configuración global en todo el aplicativo, por esta razón si se escoge esta opción, al momento de crear tareas no se podrían asociar a un usuario en específico.)



Al final se tendrá configuradas las opciones de seguridad, como podemos ver en la sección de autorización podemos añadir un usuario (sin embargo aún no tenemos ninguno creado), para finalizar presionamos el botón “Guardar”.

Posteriormente el aplicativo nos redirecciona a una pagina de login donde tendremos la opción de ingresar o registrar un nuevo usuario, en la próxima entrada veremos como realizar este proceso y las diferentes formas de hacerlo desde Jenkins.


También te podría Interesar. 



¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

Creación de Usuarios en Jenkins

$
0
0
En la entrada anterior definimos algunas configuraciones básicas en torno a seguridad, ahora veremos de que forma podemos crear usuarios en Jenkins.




Crear usuario Administrador.

Después de realizar los pasos anteriores, Jenkins nos redirecciona a una página de Login, donde se nos pide iniciar sesión o crear una cuenta, como vemos en la imagen, en la barra de tareas también aparecen 2 nuevas opciones: entrar y Registrarse que anteriormente no existían, esto se debe a que en el paso anterior dejamos seleccionada la opción por defecto de permitir que otros usuarios se registren.

Para registrar un nuevo usuario presionamos en “Crear una Cuenta” o “Registrarse”



Se cargará un formulario donde podremos crear la cuenta deseada.


Luego se nos informará que no estamos autenticados en el sistema, sin embargo solo basta con ingresar a alguna de las opciones y nos daremos cuenta que ya entramos con el Rol de administrador.

Crear otros usuarios.

Recordemos que al configurar la seguridad, dejamos la opción por defecto para permitir que otros usuarios se registren, de forma tal que cualquier persona se puede registrar como ya se ha explicado, en caso de que se decidiera que solo el administrador puede registrar usuarios, se realiza de la siguiente forma.

Desde la página de inicio, ingresamos a “Administrar Jenkins”, como podemos ver se generó una nueva opción de “Gestión de usuarios”.





Al ingresar se carga una página donde podremos administrar los usuarios existentes, para este caso solo tenemos creado el usuario administrador.



Para crear un nuevo usuario presionamos la opción “Crear un usuario” la cual nos carga el formulario de registro donde ingresaremos los datos de nuestro nuevo usuario, posteriormente al crear la cuenta nos envía nuevamente a la pantalla anterior donde evidenciamos el usuario creado, desde aquí podremos modificar o eliminar usuarios sin inconveniente.



Se debe tener en cuenta que anteriormente definimos la seguridad del sistema y creamos el primer usuario, el cual sería administrador, de ahí en adelante a todos los usuarios creados se les debe otorgar los permisos para navegar en la aplicación, de no ser así cuando intentemos iniciar sesión con alguno de los usuarios diferentes al admin................. el sistema nos informará mediante un mensaje de error que el usuario no tiene permisos.



Permisos a Usuarios.

Para definir los permisos de usuarios, ingresamos a “Administrar Jenkins” y seleccionamos la opción “Configure Global Security”, allí en la sección “Autorización” podemos evidenciar que existe nuestro usuario administrador con el check seleccionado (no es necesario seleccionar el resto ya que el administrador tiene permisos globales sobre la aplicación), posteriormente podemos añadir el nuevo usuario creado en el paso anterior y establecer los permisos deseados.




Y eso es todo!!!!.....................Hasta aquí ya tenemos definida la seguridad del proyecto en torno a la creación y asignación de privilegios, podemos asignar permisos dependiendo de las labores del usuario creado si solo puede consultar información, hacer seguimientos a tareas, permisos sobre la ejecución de estas entre otras.


Mas Adelante veremos como asociar proyectos a Jenkins y poder realizar análisis a nuestras tareas........



¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

Ejemplo Patrón Adapter

$
0
0
Después de una semana muy pesada, regreso con la ultima de esta serie de entradas sobre patrones de Diseño (Mas adelante posiblemente se generen nuevos artículos sobre este tema) Hoy vamos a finalizar trabajando un ejemplo sobre el patrón Adapter...

Este articulo no posee mayor grado de complejidad ya que el enfoque del patrón es muy simple así como el ejemplo que vamos a realizar.

¿Que es?

Tal como se menciona en la entrada sobre patrones de Diseño, este patrón permite la cooperación entre clases para extender sus funcionalidades a clases de diferentes tipos, que no pueden usarlas por mecanismos comunes como la herencia....

 
Muchas veces tenemos que integrar clases o librerías necesarias para nuestra aplicación, pero en ocasiones no podemos utilizar directamente sus funcionalidades usando la Herencia (por ejemplo) ya que por X o Y motivo no hay compatibilidad entre nuestras clases y las que provee la librería...... gracias a problematicas como esta nace el patrón Adapter que en pocas palabras permite establecer un puente entre la clase incompatible con el resto de las clases que quieren usar su funcionalidad, adaptando dichas funcionalidades con el sistema...... veamos.

El Problema.

Supongamos que tenemos un sistema que trabaja con diferentes tipos de motores (Común, Económico) que comparten características comunes así como su funcionamiento, se desea vincular al sistema una clase de tipo motor Eléctrico con un funcionamiento diferente al de los demás, se debe adaptar la nueva clase sin que esto afecte la lógica inicial de la aplicación...

La Solución.

Ya que nos plantean vincular un nuevo motor totalmente diferente al resto de motores definido en el sistema, entonces deducimos que si bien es un motor no puede tener un tratamiento igual al de los demás, ya que el modo de encenderlo, ponerlo en funcionamiento y hasta apagarlo podría ser muy distinto y podría afectar la lógica establecida, como no podemos modificar bruscamente nuestro código entonces utilizaremos el patrón Adapter para dar solución a nuestra problematica....

La Aplicación.


Como vemos nuestro sistema gira en torno a los motores, utilizamos la herencia para compartir funcionalidades comunes para los diferentes tipos de motores con los que trabajaremos, sin embargo evidenciamos que no todos ellos se comportan de la misma manera como es el caso del Motor Eléctrico, por tal razón no podemos ponerlo a heredar directamente de la clase Motor, ya que los métodos que esta nos provee no serian útiles para esta clase....

En este punto es donde hacemos uso de una clase Adapter que serviría de puente entre la clase Padre y La Clase que debe ser adaptada, así este adaptador seria el encargado de establecer comunicación con el motor Eléctrico y ejecutar las solicitudes que el cliente realice...

Clase Motor.

Esta clase es desde la cual heredaran los diferentes tipos de motores, provee los métodos comunes (encender, acelerar, apagar) para el funcionamiento de los mismos.
public abstract class Motor {
abstract public void encender();
abstract public void acelerar();
abstract public void apagar();
}

Motores Común y Económico.

Esta clase representa la estructura de los motores normales con los que el sistema funciona, básicamente heredan de la clase Motor y realizan el funcionamiento básico que esta provee.
public class MotorComun extends Motor {

public MotorComun(){
super();
System.out.println("Creando el motor comun");
}

@Override
public void encender() {
System.out.println("encendiendo motor comun");
}

@Override
public void acelerar() {
System.out.println("acelerando el motor comun");
}

@Override
public void apagar() {
System.out.println("Apagando motor comun");
}
}

Clase MotorElectricoAdapter.

Aquí se establece el puente por medio del cual la clase incompatible puede ser utilizada, hereda de la clase Motor y por medio de la implementación dada , realiza la comunicación con la clase a adaptar usando para esto una instancia de la misma...
public class MotorElectricoAdapter extends Motor{
private MotorElectrico motorElectrico;

public MotorElectricoAdapter(){
super();
this.motorElectrico = new MotorElectrico();
System.out.println("Creando motor Electrico adapter");
}
@Override
public void encender() {
System.out.println("Encendiendo motorElectricoAdapter");
this.motorElectrico.conectar();
this.motorElectrico.activar();
}

@Override
public void acelerar() {
System.out.println("Acelerando motor electrico...");
this.motorElectrico.moverMasRapido();
}

@Override
public void apagar() {
System.out.println("Apagando motor electrico");
this.motorElectrico.detener();
this.motorElectrico.desconectar();
}
}


Clase MotorElectrico.

Esta es la clase adaptable, como vemos a pesar de ser un motor posee caracteristicas muy diferentes a los demas tipos de motores del sistema, por lo tanto no puede heredar directamente de la clase Motor, en vez de esto, es accedida por la clase Adapter...
public class MotorElectrico {

private boolean conectado = false;

public MotorElectrico() {
System.out.println("Creando motor electrico");
this.conectado = false;
}

public void conectar() {
System.out.println("Conectando motor electrico");
this.conectado = true;
}

public void activar() {
if (!this.conectado) {
System.out.println("No se puede activar porque no " +
"esta conectado el motor electrico");
} else {
System.out.println("Esta conectado, activando motor" +
" electrico....");
}
}

public void moverMasRapido() {
if (!this.conectado) {
System.out.println("No se puede mover rapido el motor " +
"electrico porque no esta conectado...");
} else {
System.out.println("Moviendo mas rapido...aumentando voltaje");
}
}

public void detener() {
if (!this.conectado) {
System.out.println("No se puede detener motor electrico" +
" porque no esta conectado");
} else {
System.out.println("Deteniendo motor electrico");
}
}

public void desconectar() {
System.out.println("Desconectando motor electrico...");
this.conectado = false;
}
}


Clase Aplicación.

Finalmente esta clase representa el Cliente del sistema que usa los diferentes tipos de motores,  como vemos desde aquí se hacen los llamados sin importar cual es la lógica detrás de estos, por medio del patrón Adapter llamamos a los mismos metodos encender(), acelerar() o apagar(), siendo transparente el proceso interno que se realiza...... podemos evidenciar tambien como se utiliza el polimorfismo para hacer este tipo de llamados.....
private void usarMotorComun() {
Motor motor = new MotorEconomico();
motor = new MotorComun();
motor.encender();
motor.acelerar();
motor.apagar();
}

private void usarMotorElectrico() {
Motor motor = new MotorElectricoAdapter() ;
motor.encender();
motor.acelerar();
motor.apagar();
}

private void usarMotorEconomico() {
Motor motor = new MotorEconomico();
motor.encender();
motor.acelerar();
motor.apagar();
}


Y Listo!!! hasta aquí realizamos el ejemplo, mas abajo veremos el linck de descarga....

Conclusiones.

Como vimos, se pudo utilizar una nueva clase sin afectar la lógica del sistema, utilizamos una clase que sirvió como puente o adaptador para la clase nueva, sin que eso afectara el código de nuestras clases existentes.

El ejemplo fue muy básico y tal vez común, sin embargo muchas veces tendremos que utilizar librerías o clases que no pueden ser modificadas y se debe hacer de la forma menos traumática para nuestra aplicación, por lo tanto este patrón puede ser de mucha ayuda discriminando el uso de esas nuevas clases por medio de un adaptador....

Con este patrón terminamos la secuencia de entradas sobre este tema, mas adelante trabajaremos otra serie de artículos que pueden ser de interés...


Descarga.

El ejemplo es muy sencillo, no hay interfaces graficas ni nada, tan solo datos en consola :-/ sin embargo para entenderlo mejor les dejo el linck de descarga y asi  lo prueben ;)
 


Que es Java Swing ?

$
0
0
Iniciamos nuevamente con una serie de entradas sobre un tema especifico...... en esta ocasión vamos a trabajar una secuencia de artículos sobre Interfaces Graficas de Usuario usando para eso java Swing.

Esta entrada será una breve introducción sobre esta librería y los elementos que la componen, no profundizaremos demasiado en ella ya que mas adelante daremos paso a ejemplos prácticos sobre cada uno.....


Pero Que es?

No vamos a entrar en detalles sobre Java Swing, básicamente lo que debemos saber es que es un paquete que hace parte de la Java Foundation Classes o mas conocida como JFC, la cual provee herramientas o facilidades para la construcción de GUI's o interfaces Graficas de Usuario (graphical user interface).

Podemos decir que Swing es la evolución del AWT (Abstract Window Toolkit), la cual al igual que Swing es un conjunto de librerias enfocadas a la construcción de interfaces, solo que con esta se presentaron algunos problemas en cuanto a portabilidad principalmente cuando se desarrollaban aplicaciones para diferentes sistemas operativos, pues el comportamiento de los componentes graficos en ocasiones podían variar...... bueno esa es otra historia, el punto es que a partir de AWT nace Swing y con el mejoras no solo en aspectos visuales sino también en portabilidad y comportamiento.....



Como vemos todos los componentes de Swing heredan del paquete javax.swing (obvio no?) a diferencia de los componentes AWT los Swing se reconocen porque anteponen la letra J antes del nombre, por ejemplo un botón en AWT se llama Button, mientras que en Java Swing es JButton......

Cuando vamos a construir aplicaciones utilizando Java Swing debemos tener al menos un contenedor que será la base para nuestra aplicación, es decir, sera el lienzo donde pintaremos los demás componentes.

Normalmente podemos utilizar un JFrame o JDialog, estos serán la base para nuestra ventana y en ellos pintar los botones, cajas de texto, áreas entre otros......

Con Swing le daremos vida a nuestro sistema, ya que se crearan las vistas de la aplicación, por medio de las cuales el Usuario interactuará con el sistema, veremos que se tiene una gran cantidad de posibilidades para estructurar nuestros desarrollos,  se pueden manejar los eventos de cada componente dependiendo de nuestras necesidades, así como utilizar look & feel  para modificar el aspecto visual de nuestras interfaces.

Y Listo!!! Básicamente esta es una pequeña introducción a lo que necesitamos saber sobre estas librerías básicas en nuestro campo, en próximas entradas veremos ejemplos prácticos de cada uno de los componentes y su aplicación dando pie para futuros desarrollos y ejemplos donde obligatoriamente tenemos que hacer uso de las GUI!!!!

JFrame y JDialog

$
0
0
Para dar inicio a el primer articulo sobre componentes Java Swing, vamos a trabajar con la base de toda interfaz gráfica........ Las Ventanas. 
En esta entrada veremos simplemente como construir ventanas usando los componentes JFrame y JDialog, conoceremos en términos generales en que se diferencian y cual es la forma de crearlos....

Tal como se mencionó en la entrada anterior, cuando vamos a construir aplicaciones con Java Swing debemos tener al menos un contenedor, este sera el tapiz donde pintaremos el conjunto de componentes que arman las interfaces, para eso podemos usar un JFrame o un JDialog (Aunque también se pueden usar Applets).

JFrame o JDialog?

Estos componentes hacen parte del paquete javax.swing, básicamente nos permiten crear Ventanas para nuestras aplicaciones y en ellas alojar otros componentes para darle cuerpo a la interfaz de usuario, en si tienen comportamientos similares y a simple vista pueden parecer iguales, pero son componentes distintos.

Un JFrame permite crear una ventana de Windows con ciertas características, por ejemplo podemos visualizarla en nuestra barra de tareas, caso contrario de los JDialog, ya que estos últimos son Ventanas de Dialogo con un comportamiento diferente, no se puede ver la ventana en la barra de tareas ni posee los botones comunes de maximizar o minimizar....

Los JDialog pueden ser hijos de JFrames o de otros JDialog mientras que los JFrame no (Como así Hijos?), es decir, si tenemos claros conceptos de programación Orientada a Objetos podemos relacionar esto de Hijos con el concepto de Herencia (Aunque no directamente, es mas a nivel conceptual), con estos componentes podemos hacer que una Ventana sea Padre de otra Ventana de tipo JDialog, asignándole algún tipo de comportamiento o dejando la ventana padre como Principal.

Es recomendable cuando trabajemos con GUI's crear un único JFrame para toda la aplicación y el resto de ventanas podemos trabajarlas como JDialog ya que de esa manera evitamos que se creen varias ventanas independientes y en vez de eso otras dependientes de la principal.

Podemos encontrar muchas consideraciones sobre estos componentes pero lo anterior es básicamente lo que necesitamos saber en términos generales.............veamos su implementación.


JFrame.

Como se mencionó anteriormente debemos tener un contenedor, para esto utilizaremos la clase Container, esta sera la encargada de "alojar" los componentes que queremos mostrar en la ventana (botones, labels, cajas de texto etc...)

Creamos la clase VentanaPrincipal, esta Hereda de JFrame, posteriormente declaramos el Objeto Contenedor y luego lo instanciamos mediante el método getContentPane();

public class ClaseFrame extends JFrame 
{
private Container contenedor;

public VentanaPrincipal()//constructor
{
contenedor=getContentPane();
contenedor.setLayout(null);
//Asigna un titulo a la barra de titulo
setTitle("CoDejaVu : Titulo De La ventana");
//tamaño de la ventana
setSize(400,200);
//pone la ventana en el Centro de la pantalla
setLocationRelativeTo(null);
}
}

La clase anterior crea una Ventana Vacía, es importante tener muy claro que JFrame también es una clase de la cual se debe heredar para crear nuestras ventanas......

JDialog.

Un JDialog se construye de la misma manera que un JFrame la única diferencia es que hereda de la Clase JDialog...... como se mencionó anteriormente básicamente son ventanas pero tienen ciertas diferencias, la mas notoria es que no posee los botones básicos de las ventanas ni pueden ser visualizados en la barra de tareas...
public class VentanaConfirmacion extends JDialog
{
private Container contenedor;

public VentanaConfirmacion(){
contenedor=getContentPane();
contenedor.setLayout(null);
//Asigna un titulo a la barra de titulo
setTitle("CoDejaVu : Titulo Del JDialog");
//tamaño de la ventana
setSize(300,200);
//pone la ventana en el Centro de la pantalla
setLocationRelativeTo(null);
}
}

Igual que El anterior, este código crea una ventana de dialogo Vacía, se llaman de dialogo por las características mencionadas que la diferencian de una ventana normal.

Si ejecutamos las 2 clases veremos estas diferencias.

Como vemos lo principal en estos momentos es que la ventana que hereda de JFrame tiene los botones básicos de toda ventana, a demás permite su visualización en la barra de tareas, mientras que la ventana que hereda de JDialog no posee estas características.

Y Listo!!!, la intención de esta entrada es Mostrar lo que necesitamos saber sobre estos componentes, en un próximo articulo veremos un ejemplo simple del como usarlos, donde las diferencias mencionadas serán mas notorias ;)




Ejemplo Ventanas en Java

$
0
0
En la entrada anterior conocimos a nivel general algunas características de los componentes JFrame y JDialog, vimos a groso modo lo principal para poder trabajar con ellos..

En esta entrada aplicando los conceptos vistos, vamos a hacer un pequeño ejemplo usando estos componentes para crear 2 ventanas y relacionarlas entre ellas.

El Ejemplo.

Este ejemplo será muy básico, simplemente vamos a crear 2 ventanas  y mediante un botón estableceremos comunicación entre ellas, tendremos la VentanaPrincipal que será un JFrame y la VentanaConfirmacion que será un JDialog...  

Vamos a ver de forma simple como relacionar estas ventanas, pero para eso necesitamos como mínimo un botón que permita establecer el evento de llamado.

Sabemos que una ventana agrupa una serie de componentes (botones, etiquetas de texto, cajas de texto, combos, Paneles y por su puesto un Frame ) no vamos a profundizar en cada uno, por el momento debemos saber que estos y en general cualquier componente es una Clase Java y al usarlas lo que hacemos es crear objetos de esa clase para aprovechar su funcionalidad...

para este ejemplo además del JFrame vamos a utilizar un JButton y un JLabel, veamos.

JButton.

Esta es la clase que permite crear botones simples como todos los conocemos, sabemos que un botón es un componente en el cual al hacer click ejecutamos cierta acción (mas adelante veremos una entrada sobre estos y sus principales eventos)...

Para crear un botón debemos tener en cuenta una serie de pasos, inicialmente instanciamos la clase JButton creando un objeto botón al que posteriormente le asignaremos las características de tamaño, texto, ubicación y acciones a realizar.

JLabel.

Un JLabel básicamente es la clase que nos permite agregar etiquetas de texto en nuestra ventana, sin embargo podemos manipular el objeto que creemos para que muestre imagenes o iconos que le den mejor apariencia a nuestra aplicación...... igual que un JButton, simplemente debemos crear un objeto de JLabel y asignarle las propiedades requeridas....

La Aplicación.

Como lo mencionamos, el ejemplo se divide en 3 clases, la Clase VentanaPrincipal que corresponde a un JFrame, la Clase VentanaConfirmacion que es un formulario y la clase Principal que contiene el método main para iniciar el sistema.


VentanaPrincipal 

Esta ventana será el lugar donde llamamos la ventana de confirmación, aquí crearemos un contenedor donde se agregará una etiqueta de texto y un botón para generar el evento.
public class VentanaPrincipal extends JFrame implements ActionListener {

private Container contenedor;/**declaramos el contenedor*/
JButton botonCambiar;/**declaramos el objeto Boton*/
JLabel labelTitulo;/**declaramos el objeto Label*/
private VentanaPrincipal miVentanaPrincipal;

public VentanaPrincipal(){
/**permite iniciar las propiedades de los componentes*/
iniciarComponentes();
/**Asigna un titulo a la barra de titulo*/
setTitle("CoDejaVu : JFrame VentanaPrincipal");
/**tamaño de la ventana*/
setSize(300,180);
/**pone la ventana en el Centro de la pantalla*/
setLocationRelativeTo(null);
}

/**
* @param miVentana
* Enviamos una instancia de la ventana principal
*/
public void setVentanaPrincipal(VentanaPrincipal miVentana) {
miVentanaPrincipal=miVentana;
}

private void iniciarComponentes() {
contenedor=getContentPane();/**instanciamos el contenedor*/
/**con esto definmos nosotros mismos los tamaños y posicion
* de los componentes*/
contenedor.setLayout(null);

/**Propiedades del boton, lo instanciamos, posicionamos y
* activamos los eventos*/
botonCambiar= new JButton();
botonCambiar.setText("Iniciar");
botonCambiar.setBounds(100, 80, 80, 23);
botonCambiar.addActionListener(this);

/**Propiedades del Label, lo instanciamos, posicionamos y
* activamos los eventos*/
labelTitulo= new JLabel();
labelTitulo.setText("VENTANA PRINCIPAL");
labelTitulo.setBounds(80, 20, 180, 23);

/**Agregamos los componentes al Contenedor*/
contenedor.add(labelTitulo);
contenedor.add(botonCambiar);
}
/**Agregamos el evento al momento de llamar la otra ventana*/
@Override
public void actionPerformed(ActionEvent evento) {
if (evento.getSource()==botonCambiar)
{
/*enviamos la instancia de la ventana principal para que
* esta sea Padre de la ventana de dialogo*/
VentanaConfirmacion miVentanaConfirmacion=new VentanaConfirmacion(miVentanaPrincipal,true);
miVentanaConfirmacion.setVisible(true);
}
}
}

Como vemos se establecen las propiedades para cada componente agregado, además se implementó la interface ActionListener, esto con el fin de utilizar el método actionPerformed() el cual permite establecer la lógica para los eventos del botón en este caso..... hay que tener en cuenta que para que los eventos funcionen se debe asignar la propiedad addActionListener.... 

también cabe resaltar que se envío una instancia de la VentanaPrincipal a la VentanaConfirmacion esto con el fin de que el JDialog sea hijo del JFrame (concepto del que hablamos en la entrada anterior), mas adelante evidenciaremos el porqué....

VentanaConfirmacion.

la VentanaConfirmacion tan solo la crearemos para diferenciar nuestra ventana de Dialogo de nuestra ventana principal, extiende de JDialog y solo va a tener un JLabel con el titulo de la ventana.....como se menciona en el punto anterior, vamos a hacer que sea hija del JFrame, de esta manera evitamos que se creen muchos objetos miVentanaConfirmacion, sino, solo uno dependiente de la principal...
public class VentanaConfirmacion extends JDialog{
private Container contenedor;
JLabel labelTitulo;

public VentanaConfirmacion(VentanaPrincipal miVentanaPrincipal, boolean modal){
/**Al llamar al constructor super(), le enviamos el
* JFrame Padre y la propiedad booleana que determina
* que es hija*/
super(miVentanaPrincipal, modal);
contenedor=getContentPane();
contenedor.setLayout(null);
//Asigna un titulo a la barra de titulo
setTitle("CoDejaVu : JDialog VentanaConfirmacion");

labelTitulo= new JLabel();
labelTitulo.setText("VENTANA DE CONFIRMACION");
labelTitulo.setBounds(20, 20, 180, 23);

contenedor.add(labelTitulo);
//tamaño de la ventana
setSize(350,150);
//pone la ventana en el Centro de la pantalla
setLocationRelativeTo(null);
}
}

Como vemos el constructor trae 2 parámetros, el Frame padre y la propiedad que determina si es hija o no, con esto vamos a evitar que el usuario ingrese a la ventanaPrincipal y trabaje en ella, bloqueándola solo hasta que se cierre la ventana de dialogo...

Principal.

Como en casi todos los ejemplos, tenemos una clase Principal donde inicia todo el proceso, esta clase contiene el método main que contiene la lógica para la creación y cargue de la ventana principal...... como vemos creamos una instancia de la VentanaPrincipal y la enviamos como parámetro, esto para trabajar siempre con la ventanaPrincipal y no crear muchas instancias de la misma, sino trabajar siempre con la original.... esto también podríamos realizarlo aplicando el patrón Singleton trabajado en entradas anteriores...
public class Principal {

public static void main(String[] args) {
/**Declaramos el objeto*/
VentanaPrincipal miVentanaPrincipal;
/**Instanciamos el objeto*/
miVentanaPrincipal= new VentanaPrincipal();
/**Enviamos el objeto como parametro para que sea unico
* en toda la aplicación*/
miVentanaPrincipal.setVentanaPrincipal(miVentanaPrincipal);
/**Hacemos que se cargue la ventana*/
miVentanaPrincipal.setVisible(true);
}
}

Al final solo bastará con ejecutar esta clase y nuestra aplicación iniciará, para esto usamos el método setVisible permitiendo cargar la ventanaPrincipal.

El Resultado.

Al ejecutar la aplicación vemos que se carga la ventanaPrincipal con los componentes mencionados, si presionamos el botón se carga la ventanaConfirmacion dependiente de la ventanaPrincipal, podemos notar las diferencias entre estas 2 ventanas, así como la propiedad que impide acceder a la principal mientras se encuentra activa la ventana de Dialogo, esto sera muy Útil cuando queremos hacer ventanas que deberían ser únicas por usuario, por ejemplo ventanas de registro o información, de modo que siempre tengamos una sola por cada evento....


Y Listo!!!
Tenemos nuestra aplicación en funcionamiento, es algo simple pero la base para construir aplicaciones completas...... mas adelante seguiremos con esta secuencia de entras básicas sobre java Swing, serán cosas sencillas pero muy útiles para quienes desean iniciar ;)

El ejemplo es muy simple, sin mayores complicaciones, aquí dejo el enlace de descarga por si lo quieren revisar ;)





Componentes Java Swing

$
0
0
Como se mencionó en la introducción a Java Swing, este paquete nos brinda ciertas facilidades para la construcción de interfaces graficas de usuario........ en esta entrada vamos a conocer a nivel general algunos de los principales componentes que podemos usar en nuestras GUI's...

Hasta el momento hemos visto lo que es Swing, las diferencias entre JFrame y JDialog así como un pequeño ejemplo sobre la creación de Ventanas incluyendo también 2 componentes tales como los botones y las etiquetas de texto.

En esta entrada enunciaremos algunos de los principales componentes, tal vez no podamos trabajarlos todos pero es bueno saber que existen, conociendo nuevas opciones para vincular en nuestros desarrollos...

Que son Los Componentes Graficos?

Como se ha mencionado, los componentes graficos son estos elementos que permiten brindar una interacción con el usuario del sistema..... Cada componente corresponde a una clase en Java, por esta razón cuando desarrollamos y queremos vincular uno de estos elementos simplemente instanciamos la clase que necesitamos, es decir, si queremos un Área de texto debemos crear un objeto de la clase JTextArea....

Categorias...

En la introducción sobre Swing vimos un pequeño árbol de herencia, sin embargo este no enmarca todos los componentes Graficos de la librería sino solo algunos de los principales, a continuación vamos a ampliar el numero de esos componentes agrupándolos en categorías dependiendo de su funcionalidad....

No vamos a profundizar en cada categoría, tan solo es una introducción general, en próximas entradas se trataran mas a fondo....


Contenedores

Como vimos en entradas anteriores, un contenedor es el tapiz donde pintaremos nuestros componentes graficos, existen contenedores principales, entre estos se encuentran JFrame y JDialog pero también existen otros contendedores incluidos dentro de los mencionados...
  • JFrame – Es la Ventana de aplicación, el contenedor principal
  • JDialog – Una ventana de tipo Ventana de diálogo, tambien puede ser un contenedor principal.
  • JPanel – Permite la creación de paneles independientes donde se almacenan otros componentes.
  • JScrollPane – permite la vinculación de barras de desplazamiento en un contenedor.
  • JSplitPane – permite la creación de un contenedor dividido en 2 secciones.
  • JTabbedPane – Permite la creación de pestañas, cada pestaña representa un contenedor independiente.
  • JDesktopPane – Permite crear ventanas dentro de una ventana principal 
  • JToolBar – Permite introducir una Barra de herramientas 

Componentes Atómicos

Los componentes atómicos son los elementos que no pueden almacenar otros objetos o componentes graficos, por ejemplo, un JPanel no es Atómico, ya que en el podemos almacenar JButtons, JTextField entre otros...
  • JLabel – Permite Vincular Etiquetas, tanto de texto como de imagenes
  • JButton – Permite vincular Botones simples. 
  • JCheckBox – Son Casilla de verificación, ideal para selección múltiples.
  • JRadioButton – Permite presentar opciones de selección similares a las checkbox, solo que el enfoque de estas es de única selección.
  • JToggleButton – Botón que al oprimirlo se quedará presionado hasta que se ejecute otro evento.
  • JComboBox – Permite mostrar una lista de elementos como un combo de selección.
  • JScrollBar – Permite mostrar una barra de desplazamiento, regularmente usada en Areas de texto o paneles donde el contenido es mayor que el tamaño del componente. 
  • JSeparator – Permite separar opciones, es una barra simple. 
  • JSlider - Permite vincular un Deslizador en nuestra ventana. 
  • JSpinner – permite vincular una caja de texto con botones integrados para seleccionar algún valor. 
  • JProgressBar – Establece una barra de progreso.

Componentes de Texto.

Son todos aquellos que nos permiten procesar cadenas de texto, sea como entrada o salida de información de tipo cadena.
  • JTextField – Permite introducir un campo de texto simple.
  • JFormattedTextField – Permite introducir un campo de texto con formato, (si definimos que solo recibe números no permitirá letras...)
  • JPasswordField – Campo de texto que oculta los caracteres ingresados.
  • JTextArea – Permite vincular un área de texto donde el usuario ingresara información o simplemente para presentar cadenas de texto.
  • JEditorPane Permite vincular un área de texto con propiedades de formato.
  • JTextPane – Similar al anterior, permitiendo otras opciones de formato, colores, iconos entre otros.

Componentes de Menus.

Estos componentes permiten vincular opciones de menú en nuestras ventanas, tipo menú principal, como por ejemplo el conocido Inicio, Archivo, Edición etc..
  • JMenuBar – Permite vincular una barra de menús.
  • JMenu– Permite vincular botones o enlaces que al ser pulsados despliegan un menú principal.
  • JMenuItem – Botón u opción que se encuentra en un menú.
  • JCheckBoxMenuItem– Elemento del menú como opciones de checkbox.
  • JRadioButtonMenuItem– Elemento del menú como botón de selección.
  • JPopupMenu– Opciones de menú emergentes.

Componentes Complejos

Estos son componentes un poco mas avanzados, cumplen con funciones mas enfocadas a procesos especificos y complejos, como por ejemplo obtener gran cantidad de información de una base de datos, trabajo con nodos, colores entre otros.
  • JTable – Permite vincular una tabla de datos con sus respectivas filas y columnas.
  • JTree - Carga un árbol donde se establece cierta jerarquía visual, tipo directorio.
  • JList – Permite cargar una lista de elementos, dependiendo de las propiedades puede tenerse una lista de selección múltiple.
  • JFileChooser – Es un componente que permite la búsqueda y selección de ficheros entre otras.
  • JColorChooser – Componente que permite cargar un panel selector de color
  • JOptionPane – No es algo complejo sino mas un componente independiente que permite mostrar un cuadro de diálogo personalizable.

Conclusiones.

Como vimos existen gran cantidad de componentes pensados para diferentes problemas o necesidades, los presentados son los mas comunes aunque también pueden existir otros que tal vez no se mencionan aquí pero pueden ser mencionados mas adelante.

La intención con esta entrada es servir como base para nuevos artículos donde se crearan ejemplos un poco generales y otros al detalle de cada componente, mientras tanto puede dar una idea de los tipos de componentes que tal vez necesitan utilizar, así tan solo es cuestión de buscar el nombre y encontrar ejemplos de aplicación.

Mas adelante presentaré articulos con ejemplos de aplicación...

¿Conocen otros componentes que no se tienen en cuenta aquí?........ ¿Cuales Son?


También te podría Interesar.


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo.....y si te gustó, te invito a compartir ;)

Componentes Atomicos Java Swing

$
0
0
Hola, en esta entrada vamos a continuar profundizando de a poco en los diferentes componentes Java Swing....... 
En el articulo agrupamos unos cuantos de los principales elementos por categorías, ahora veremos la forma de construirlos y al final los agruparemos en una misma aplicación...

En el articulo anterior primero hablamos de los Contenedores, sin embargo esta vez iniciaremos por los Componentes Atómicos ya que estos serán los elementos que los contenedores alojarán...

Que Son?

Como se ha mencionado, Los componentes atómicos son los elementos que no pueden almacenar otros objetos o componentes gráficos,  podríamos relacionarlos  como componentes simples, pues su función esta bien definida en lo que ellos deben hacer...

Cuales Son?

Veamos una pequeña descripción y la forma de crear los elementos de esta categoría, la idea es mostrar la forma básica de instanciarlos, dejaré también un enlace al Api de Java de cada componente donde se pueden evidenciar todos los metodos y documentación asociada, realmente es muy recomendable entenderla...

JLabel.
Son etiquetas de texto, sin embargo podemos usar sus propiedades para vincular imágenes  por lo regular las utilizamos para títulos, nombres o información puntual que queremos mostrar (Api de Java).
JLabel miLabel;
miLabel= new JLabel();
miLabel.setText("Esto es un Label");

JButton.
Esta clase permite la creación de botones simples, es uno de los elementos mas comunes y usados en las GUI's, trabajan gracias a eventos que se deben implementar a las clases que los usen, igual que los JLabels, pueden vincular imágenes o iconos (Api de Java).
JButton miBoton;
miBoton= new JButton();
miBoton.setText("Boton");

JCheckBox
Son Casilla de verificación permite al usuario seleccionar una o mas de las opciones propuestas, ideales en aplicaciones con preguntas de selección múltiple con multiple respuestas (Api de Java).
JCheckBox miCheckbox;
miCheckbox = new JCheckBox();
miCheckbox.setText("Check1");

JRadioButton
Permite presentar opciones de selección similares a las checkbox, solo que el enfoque de estas es de única selección, para trabajar con los RadioButtons se debe hacer uso de un ButtonGroup para determinar la selección única, ideales en aplicaciones con preguntas de selección múltiple con única respuesta (Api de Java).
JRadioButton miRadioButton;
miRadioButton = new JRadioButton();
miRadioButton.setText("Radio1");


JToggleButton
Esta clase provee un botón que al oprimirlo se quedará presionado hasta que se oprima nuevamente, ideal para aplicaciones donde se quiera simular un botón de activación, tipo interruptor (Api de Java).
JToggleButton miToggleButton;
miToggleButton = new JToggleButton();
miToggleButton.setText("Activar");

JComboBox
Clase que permite mostrar una lista de elementos como un combo de selección, ideal para gran cantidad de opciones de selección única (Api de Java).
JComboBox miCombo;
miCombo = new JComboBox();
miCombo.addItem("Opciones");
miCombo.addItem("Opcion1");
miCombo.addItem("Opcion2");
miCombo.addItem("Opcion3");
miCombo.addItem("Opcion4");


JSeparator
Esta clase permite dibujar una barra simple en la ventana (o simplemente un raya), se puede crear de forma horizontal o vertical, por lo regular es usada como separador de items en una barra de menú (Archivo|Edición|Ver|Insertar...) (Api de Java).
JSeparator separadorHorizontal;
separadorHorizontal = new JSeparator();
separadorHorizontal.setBounds(430, 92, 100, 5);

JSlider
Permite vincular un Deslizador en nuestra ventana, un JSlider es una barra deslizadora que permite al usuario definir un valor entre un mínimo o máximo definido con solo arrastrarlo (Api de Java) . 
JSlider miDeslizado;
miDeslizador = new JSlider(JSlider.HORIZONTAL, 0, 100, 30);
miDeslizador.setBounds(430, 140, 100, 30);
miDeslizador.setValue(0);


JSpinner
Esta clase permite vincular una caja de texto con botones integrados para seleccionar algún valor especifico, recorriendo los valores del rango definido (Api de Java).
JSpinner miSpinner;
miSpinner = new JSpinner();


JProgressBar

Esta clase permite crear una barra de progreso en nuestra aplicación, dicha barra define de forma gráfica el porcentaje de  avance de un proceso cualquiera, por lo regular es usada en el trabajo con hilos o temporizadores (Api de Java).
JProgressBar miBarra;
miBarra = new JProgressBar();
miBarra.setBounds(450, 180, 110, 20);

El Ejemplo.

Como se mencionó les comparto un ejemplo muy simple, no tenemos ningún enunciado ni nada por el estilo, solamente es una aplicación pequeña donde se agrupan de forma sencilla los componentes mencionados.



El ejemplo fue creado todo desde cero (a pedal), todos los componentes son creados directamente desde Eclipse y no se utiliza un layout por defecto (mas adelante trabajaremos los layouts, básicamente estos definen como se muestran los componentes en la ventana), por esta razón los objetos se crean con coordenadas definidas gracias al método setBounds(int x, int y,int a, int b);

Se pueden evidenciar los eventos para los componentes que ejecutan alguna acción, para esto se implementan las interfaces necesarias (Ojo, son interfaces no GUI's) usando implements...
public class VentanaPrincipal extends JFrame implements ActionListener,ChangeListener {

y Listo!!! podemos jugar con la aplicación evidenciando su funcionamiento.


Descarga.

En el enlace de descarga se encuentra el archivo .rar con la aplicación, solo es cuestión de descomprimir y abrir con Eclipse...




Conclusiones.

Ya vimos la forma básica de crear nuestros componentes, simplemente instanciando las clases que Java Swing nos brinda, detrás de cada clase hay mucha información que no terminaríamos de trabajar en esta entrada, por eso recomiendo revisar la api de Java brindada para cada componente así como practicar con cada uno de estos.

En la próxima entrada trabajaremos los componentes de Texto y mas adelante se publicarán nuevos artículos profundizando y haciendo ejemplos con algún componente en especifico.............muy pronto ;)




Componentes De Texto Java Swing

$
0
0
En el articulo anterior trabajamos los componentes Atómicos en esta oportunidad le daremos paso a los componentes de Texto....
Nuevamente vamos a dejar el tema de contenedores para una próxima entrada, ya que primero evacuaremos los componentes que los contendedores alojarán...

Seguimos con la mecánica anterior, vamos a ver en términos generales cada componente y al final se dejará un enlace de descarga donde veremos los componentes en acción....

Que Son?

Los componentes de Texto son los que nos permiten procesar datos de tipo cadena, sea como entrada o salida de información, todos los sistemas necesitan procesar datos, tener un mecanismo de entrada y salida disponible para el usuario, este tipo de componentes son obligados en casi todos los desarrollos...

Cuales Son?

Existen diferentes componentes y formas de procesar texto, podemos hacerlo por consola o por medio de ventanas de Dialogo... veamos los que nos provee java swing...

JTextField.
Es uno de los componentes mas comunes, permite introducir un campo de texto simple en nuestra ventana, ideal para ingresar o mostrar datos puntuales en un formulario (Api de Java).

JFormattedTextField.
Permite introducir un campo de texto con formato, (si definimos que solo recibe números no permitirá letras, para esto se requiere definir la mascara a utilizar...) es muy útil al momento de hacer validaciones en nuestros formularios, tambien muy comun al trabajar con fechas (Api de Java).

JPasswordField
Al verlo es un campo simple, sin embargo es un campo de texto especial que oculta los caracteres ingresados, su uso se centra en ventanas de login o ingreso de contraseñas (Api de Java).

JTextArea
Permite vincular un área de texto donde el usuario ingresará información o simplemente para presentar cadenas de texto, obviamente permite procesar mucha mas cantidad de información que los componentes anteriores (Api de Java).

JEditorPane
Es un componente similar al anterior, sin embargo permite vincular un área de texto con propiedades de formato, es decir, por ejemplo, podemos darle formato HTML a nuestro texto usando etiquetas, modificando el tamaño, color y hasta vinculando imagenes... (Api de Java).

JTextPane 
Es practicamente igual al anterior, básicamente posee las misma funciones, por lo cual podemos decir que es una mejora del JEditorPane permitiendo otras opciones de formato, colores, iconos, trabajo con estilos, componentes entre otros  (Api de Java).


El Ejemplo.

Nuevamente les comparto el código fuente de una pequeña aplicación de ejemplo muy útil para ver los componentes anteriores en funcionamiento....... también vinculamos un botón para el evento en el que procesamos la información ingresada....... 



Cabe resaltar que esta entrada brinda una idea general sobre estos componentes mas no es un ejemplo profundo de cada uno de ellos, mas adelante se trabajarán por separado para un mayor entendimiento....

Descarga.

Como es costumbre en el enlace de descarga se encuentra el archivo .rar con la aplicación, solo es cuestion de descomprimir y abrir con Eclipse...



Conclusiones.

Vimos de forma rápida cuales son los componentes de texto que nos provee Java Swing, con esto nos hacemos a una idea de cuales podemos utilizar y para que momentos...

Hay componentes muy parecidos o con muy pocas diferencias, su uso depende de lo que necesitemos hacer y el conocimiento que tengamos de cada uno de ellos.

Mas adelante vendrán nuevas entradas con ejemplos puntuales....



También te podría Interesar.


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo.....y si te gustó...... te invito a compartir ;)

Menús Con Java Swing

$
0
0
Ya vimos los componentes atómicos y los componentes de Texto, ahora es el turno para conocer los componentes de Menús que nos provee Java Swing...

Seguiremos con la estructura de los últimos artículos, veremos unas definiciones generales y al final se presentará una aplicación de ejemplo usando estos componentes.

 
Que Son?

Todos debemos conocer lo que es un Menú, los que estamos en este campo a diario debemos interactuar con algún tipo de menú que nos brinda opciones que queremos realizar, un editor de texto, una ventana, un navegador etc, todos deben tener un Menú desde el cual administrar nuestro sistema....

Cuales Son?

Java Swing nos provee ciertos componentes para crear una barra de Menú, en ella podemos combinar diferentes elementos con un mismo fin, proveer las opciones necesarias para trabajar con el sistema....Veamos

JMenuBar.
Es el elemento principal cuando vamos a crear menús, ya que provee la barra donde se alojaran cada uno de los items u opciones deseadas.

JMenu.
Si bien el elemento anterior permite crear una Barra donde alojar el resto de componentes, el JMenu es quien contiene dichos componentes, a este se le agregan el resto de opciones, podemos asociarlo con un contenedor el cual aloja otros elementos como botones, etiquetas, campos entre otros...... el JMenu permite agregar los elementos o items correspondientes, así como otros JMenus.....

JMenuItem.
Representan Items u opciones del menú, cuando creamos un JMenu decimos que tipo de opciones puede contener y al crear un JMenuItem decimos cuales son las opciones para ese menú en especifico, por ejemplo el Menú "Archivo", contendrá los items "Abrir", "Guardar", "Nuevo", "Principal", etc....


JCheckBoxMenuItem.
Este compontes es otro item que almacena el JMenu, permite vincular casillas de  verificación o Checkbox, muy útil cuando vamos a parametrizar mas de una opción o característica de nuestro sistema...

JRadioButtonMenuItem.
Este componente es similar al anterior, la diferencia es que permite vincular  componentes RadioButton los cuales brindan opciones de selección única, por ejemplo si en un editor de texto queremos un único tipo de letra, podemos usar este componente....

JPopupMenu.
Por ultimo tenemos el JPopupMenu, a diferencia de los anteriores, este componente no es contenido en la Barra de Menú, sino que se asocia al contenedor principal que para nuestro ejemplo es un JPanel (del cual hablaremos en el siguiente articulo), permite brindar opciones emergentes o popup con tan solo dar click derecho sobre algún área del panel....... el JPopup funciona también como un contenedor similar al JMenu....

El Ejemplo.

En este ejemplo agrupamos los componentes anteriores, la única función es dar a conocer lo básico de estos elementos.


Nuevamente resalto el hecho de que se brinda una idea general de cada componente, mas no un ejemplo a profundidad, eso lo dejamos para próximas entradas.....

Descarga.

Como es costumbre en el enlace de descarga se encuentra el archivo .rar con la aplicación, solo es cuestión de descomprimir y abrir con Eclipse....... recuerden que es gratis, nada cuesta opinar, compartir o agradecer :)



También te podría Interesar.


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo.....y si te gustó...... te invito a compartir ;)

Contenedores Java Swing

$
0
0
Después de haber visto los componentes atómicos, componentes de texto y los Menús en Java Swing, ya tenemos lo suficiente para darle una repasada a los diferentes Contenedores que esta librería nos provee......



Que Son?

Tal como se ha mencionado en las primeras entradas sobre java Swing, los contenedores son componentes que permiten almacenar, alojar o contener otros elementos gráficos.....nuevamente mencionamos que es el Tapiz donde vamos a pintar....... 

Cuales Son?

Java Swing provee algunos contenedores útiles para diferentes casos, así cuando desarrollamos una Ventana podemos decidir de que manera presentar nuestros elementos, como serán alojados y de que forma serán presentados al usuario......veamos.... 

JFrame
Este contenedor es uno de los principales y mas usados (ya lo hemos visto anteriormente), representa la ventana Principal de nuestra aplicación, en el podemos alojar otros contenedores.

JDialog
Este contenedor representa una ventana de tipo Ventana de diálogo, también puede ser un contenedor principal aunque es mas recomendable dadas sus propiedades, que sea usada como ventana secundaria, es decir, un JFrame como ventana Principal y el resto de ventanas como un JDialog (Ya veremos el porqué).
 
JPanel
Este contenedor es uno de los mas simples, permite la creación de paneles independientes donde se almacenan otros componentes, de esta manera decidimos que elementos se alojan en que paneles y dado el caso podemos usar sus propiedades para ocultar, mover o delimitar secciones... cuando alojamos elementos en un panel, los cambios mencionados se aplican a todo su conjunto...es decir, si nuestro panel tiene 5 botones y ocultamos solo el panel, los botones también se ocultan....
 
JScrollPane
Este contenedor permite vincular barras de scroll o desplazamiento en nuestra aplicación, puede ser utilizado tanto en paneles como en otros componentes como un JTextArea, hay que tener en cuenta que no es simplemente poner un scroll, es alojar el componente (en este caso panel o área de texto) en el JScrollPane....

JSplitPane
Este componente permite la creación de un contenedor dividido en 2 secciones, muchas veces usado en aplicaciones donde una sección presenta una lista de propiedades y otra sección presenta el elemento al que le aplicamos dicha lista....cada sección puede ser manipulada por aparte y redimensionar sus componentes (Mas utilizado cuando se trabaja con layouts...después lo veremos).

JTabbedPane
Este tal vez sea otro de los componentes mas usados, permite la creación de una pestañas en nuestra ventana, cada pestaña representa un contenedor independiente donde podemos alojar paneles u otros elementos.

JDesktopPane
Este contenedor aloja componentes de tipo JInternalFrame, estos representan ventanas internas, permitiendo así crear ventanas dentro de una ventana principal, al momento de su creación podemos manipular sus propiedades para definir si queremos redimensionarlas, cerrarlas, ocultarlas entre otras....

También podemos definir una posición inicial de cada ventana interna, sin embargo después de presentadas podemos moverlas por toda la ventana Principal donde se encuentran alojadas.

JToolBar
Este contenedor representa una Barra de herramientas dentro de nuestra aplicación, en el podemos alojar diferentes componentes que consideremos útiles, botones, check, radios, campos entre otros.......esta barra de herramientas puede ser manipulada permitiendo cambiar su ubicación con tan solo arrastrarla al extremo que queramos, o sacarla de la ventana para que nuestras opciones se encuentren como una ventana independiente.

El Ejemplo.

Nuevamente presento un ejemplo sencillo, no tiene mayor grado de complejidad que el que le pueda dar cada componente, la aplicación presenta una Ventana Principal con un botón por cada elemento a exponer, como se mencionó anteriormente la Ventana Principal será un JFrame y el resto de ventanas del sistema lo trabajaremos como JDialog (En esta entrada se explica el porqué).


La idea es mostrar rápidamente el funcionamiento básico de estos elementos, si se necesitan alguno se recomienda profundizar mediante ejemplos o mas investigación...... es importante que si no se entiende algún procedimiento soliciten ayuda, por ejemplo es muy común omitir en ocasiones el método pack(); debemos saber que este permite trabajar con las dimensiones de los contenedores (si es necesario).....

Descarga.

Como es costumbre en el enlace de descarga se encuentra el archivo .rar con la aplicación, solo es cuestión de descomprimir y abrir con Eclipse, cada contenedor tiene su paquete por aparte... y listo....... recuerden que es gratis, nada cuesta opinar, compartir o agradecer :)




También te podría Interesar.


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo.....y si te gustó...... te invito a compartir
 y Suscribirte ingresando al botón "Participar en este sitio" para darte cuenta de mas entradas como esta ;)
Viewing all 129 articles
Browse latest View live