tag:blogger.com,1999:blog-71891358377006218532024-03-13T01:06:15.273-07:00Acerca de JavaKelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.comBlogger39125tag:blogger.com,1999:blog-7189135837700621853.post-92173230870673085632011-07-08T06:05:00.001-07:002011-07-08T06:11:46.588-07:00Java SE 7 ya está disponibleSaludos amigos. <br /><br /> Como dice el título ya tenemos disponible la nueva versión de java Java SE 7.<br /><br /> La página de internet para mayor información es:<br /><br /> <a href="http://jdk7.java.net/">http://jdk7.java.net/</a><br /><br /> Para ver una documentación de las novedades puedes hacer click aquí también:<br /><br /> <a href="http://jdk7.java.net/preview/">http://jdk7.java.net/preview/</a><br /><br /> Ya tenemos información para investigar. Claro la primera información siempre viene en inglés y a lo mejor para lo que no están familiarizados con el idioma les cueste, pero ¡Adelante! hay camino por recorrer, sigamos investigando para ver las innovaciones que trae este lenguaje, uno de los más utilizados en el mundo.<br /><br /> Nos vemos.Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com0tag:blogger.com,1999:blog-7189135837700621853.post-88726409345417855752010-10-31T11:07:00.001-07:002010-10-31T11:51:48.192-07:00Patrón de diseño: AdaptadorSaludos a todos.<br /><br /> Ahora hablaremos sobre otro patrón de diseño que puede ser utilizado en Java, que de hecho, hasta en su propia API se ha incluido para el manejo de eventos de interfaces gráficas. Estoy hablando acerca del patrón de diseño: Adaptador.<br /><br />Si, como su nombre lo indica, trata de adaptar una clase para que no implemente todos los métodos declarados en una interfaz, esto lo hace, usando una clase que ya la interfaz en cuestión y la clase que utiliza la adaptadora debe sólo implementar en método que necesite o requiera, vamos a ver si con ejemplos me entienden mejor:<br /><br />En java.awt.event se encuentra la interfaz MouseListener, esta interfaz contiene los métodos que sirven para manejar eventos del ratón:<br />void mouseClicked(MouseEvent e) <br />void mouseEntered(MouseEvent e) <br />void mouseExited(MouseEvent e) <br />void mousePressed(MouseEvent e)<br />void mouseReleased(MouseEvent e)<br /><br />Supongamos que nosotros queremos que nuestra clase sólo implemente el evento mouseClicked, si implementamos esta interfaz en nuestra aplicación debemos también implementar los métodos declarados y por lo tanto colocar los demás métodos (mouseEntered, mouseExited, mousePressed y mouseReleased) y dejarlos vacíos (por regla de java en cuanto a que implemento la interfaz).<br /><br />Con la clase adaptadora eso sería más fácil, yo puedo hacer extender (heredar) mi clase a MouseAdapter. Este clase MouseAdapter, implementa a la interfaz MouseListener y contiene implementado todos los métodos del Listener (aunque vacío, no importa), por lo tanto al heredar sólo sobreescribo el método que necesito. La limitante es que como Java no soporta herencia múltiple, si mi clase ya extiende de otra clase no puedo utilizar la clase adaptadora y me veré obligado a utilizar el Listener requerido.<br /><br />Veamos código:<br />Implementando la interfaz me obliga a implementar todos métodos, aunque no los utilice:<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />package patronesdisenio.adaptador;<br /><br />import java.awt.event.MouseEvent;<br />import java.awt.event.MouseListener;<br /><br />public class MiClaseImplementada <br /> implements MouseListener {<br /> //La interfaz me obliga a implementar<br /> //todos los métodos<br /> @Override<br /> public void mouseClicked(MouseEvent arg0) {}<br /> @Override<br /> public void mouseEntered(MouseEvent arg0) {}<br /> @Override<br /> public void mouseExited(MouseEvent arg0) {}<br /> @Override<br /> public void mousePressed(MouseEvent arg0) {}<br /> @Override<br /> public void mouseReleased(MouseEvent arg0) {}<br />}<br /></pre></span></td></tr></tbody></table><br /><br />La clase adaptadora me permite implementar sólo el método que deseo, aunque si mi clase ya extiende de otra clase, no podría utilizarla:<br /><br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />package patronesdisenio.adaptador;<br /><br />import java.awt.event.MouseAdapter;<br />import java.awt.event.MouseEvent;<br /><br />import javax.swing.JOptionPane;<br /><br />public class MiClaseAdapter extends MouseAdapter {<br /> <br /> @Override<br /> public void mouseClicked(MouseEvent e){<br /> JOptionPane.showMessageDialog(<br /> null, "Hizo click en un elemento");<br /> }<br />}<br /></pre></span></td></tr></tbody></table><br /><br />Esto es un ejemplo dentro del API de java, pero igualmente podría adaptarse a nuestro sistema, en caso de que no necesitemos implementar todos los métodos de una interfaz.Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com7tag:blogger.com,1999:blog-7189135837700621853.post-1315715326341333242010-10-31T03:32:00.001-07:002010-10-31T05:26:03.843-07:00Patrón de diseño: SingletonSaludos a todos. Hoy comenzaremos con el primer artículo acerca de los patrones de diseño. Para hoy hablaremos acerca del patrón de diseño Singleton.<br /><br />Recuerdo en mi primer curso de Java, cuando nos asignan realizar un proyecto en este lenguaje, utilizando las ventajas de javax.swing, es decir interfaces gráficas, nuestro grupo creó un menú que llamaba a ventanas o diálogos. Se nos presentó el siguiente problema: Cuando se llamaba a una opción de menú se desplegaba una ventana auxiliar nueva, si de nuevo haciamos click sobre la misma opción, se mostraba otra ventana nueva igual a la anterior, es decir, se creaban duplicados o triplicados, lo cual para el proyecto no era lo adecuado. Empezamos a indagar que pasaba con tal caso, cómo podríamos hacer para que no sucediera esto y nuestro profesor muy sabiamente dijo, eso se resuelve con el patrón Singleton.<br /><br />Empezamos a buscar información sobre este patrón y nos encontramos que la finalidad de este patrón es poder crear una sola instancia de una Clase, por lo tanto si se intentaba crear una nueva instancia se llamaba a la misma creada anteriormente, garantizando así la no duplicación. Ahora bien ahora lo que nos faltaría por ver es como puede llevarse a cabo este patrón: <br /><br />Existen varias maneras de implementar Singleton, aquí va la más utilizada:<br /><br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />public class ClaseSingleton {<br /><br /> private static ClaseSingleton instancia = null;<br /><br /> private ClaseSingleton() { } //constructor privado<br /><br /> public static ClaseSingleton getInstanciaUnica() {<br /><br /> if (instancia == null) {<br /> instancia = new ClaseSingleton();<br /> }<br /> return instancia;<br /> }<br />}<br /></pre></span></td></tr></tbody></table><br /><br />Como puede verse existe en la clase un constructor privado, esto se hace con la finalidad de que sólo la clase singleton pueda crear instancias. Existe también un método getInstanciaUnica que crea la instancia si aun no ha sido creada, pero si ya fue creada una, devuelve la misma creada anteriormente.<br /><br />Veamos un ejemplo con las Ventanas de javax.swing:<br />Clase Principal: Con Main:<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />package patronesdisenio;<br /><br />import java.awt.*;<br />import java.awt.event.*;<br />import javax.swing.*;<br /><br />public class VentanaPrincipal extends JFrame <br /> implements ActionListener {<br /><br /> public VentanaPrincipal() {<br /> super("Ventana Principal");<br /> JButton boton = new JButton("Nueva Ventana");<br /> Container contenedor = getContentPane();<br /> contenedor.add(boton, BorderLayout.SOUTH);<br /> boton.addActionListener(this);<br /> setSize(600, 600);<br /> setVisible(true);<br /> }<br /><br /> public static void main(String[] args) {<br /> VentanaPrincipal app = new VentanaPrincipal();<br /> app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br /> }<br /><br /> public void actionPerformed(ActionEvent e) {<br /> VentanaAuxiliar.getVentanaAuxiliarUnica();<br /> }<br />}<br /></pre></span></td></tr></tbody></table><br /><br />Aquí la Ventana Auxiliar a llamar (Singleton)<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />package patronesdisenio;<br /><br />import javax.swing.JDialog;<br /><br />public class VentanaAuxiliar extends JDialog{<br /><br /> public static VentanaAuxiliar vtnUnica = null;<br /> <br /> private VentanaAuxiliar(){ }<br /> <br /> public static VentanaAuxiliar <br /> getVentanaAuxiliarUnica(){<br /> if(vtnUnica == null){<br /> vtnUnica = new VentanaAuxiliar();<br /> vtnUnica.setTitle("Ventana Auxiliar");<br /> vtnUnica.setSize(490, 400);<br /> vtnUnica.setVisible(true);<br /> return vtnUnica;<br /> }<br /> return vtnUnica;<br /> }<br />}<br /></pre></span></td></tr></tbody></table><br /><br />De esta manera cuando se llame a la ventana auxiliar desde la ventana principal con el botón inferior, no se generará ventana duplicada ya que Ventana auxiliar es singleton.Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com4tag:blogger.com,1999:blog-7189135837700621853.post-18256856010152301472010-09-26T19:07:00.000-07:002010-10-07T10:39:37.871-07:00Respuesta Clase Scanner Java 5.Esta es la respuesta a un comentario realizado en el post sobre la clase Scanner de Java 5. <br />El comentario dice así:<br /><br />Tengo un problema que no se como solucionar.... tengo un fichero de esta manera:<br /><br />AU Gutierrez, M<br />Marin, C<br />Bonachea, J<br />AF Gutierrez, Mateo<br />Lucha, Pedro<br />Gutierrez, Francisco<br />TI Are talus flatiron sequences in Spain climate-controlled landforms?<br />SO ZEITSCHRIFT FUR GEOMORPHOLOGIE<br />LA English<br />DT Article<br /><br />Cada empiece con 2 letras mayusculas es un campo, y quiero leerlo y que interprete que es un campo diferente, es decir AU un campo con sus autores: Gutierrez, marin y Bonachea, estos autores que los meta todos juntos en un string, y AU en otro.<br />Estoy intentando leyendolo linea por linea, luego separarlo por tokens, y concatenar, pero no me sale nada!!!<br /><br />haber si me podeis ayudar,<br /><br />un saludo,<br />Toño.<br /><br />Ahora bien, para dar respuesta a esta duda, yo lo resolví de la siguiente manera:<br /><br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />import java.io.*;<br />import java.util.*;<br />import java.util.regex.*;<br /><br />public class Autores {<br /> public static void main(String[] args) <br /> throws FileNotFoundException {<br /> Scanner scaner = new Scanner(<br /> new File("archivos/datos.txt"));<br /> Pattern patron = Pattern.compile("[A-Z]{2}");<br /> ArrayList<String> resultado = <br /> new ArrayList<String>(); <br /> StringBuffer sb = new StringBuffer();<br /> /* sb: Guarda los autores relacionados en una sola <br /> cadena separados por punto y coma (;)*/<br /> /* resultado: guarda los autores relacionado de <br /> stringbuffer en registros distintos */<br /> int nroLinea = 1;<br /> do{<br /> String linea = scaner.nextLine();<br /> Matcher matcher = patron.matcher(linea);<br /> boolean coincide = matcher.find();<br /> if(coincide && nroLinea == 1){<br /> sb = new StringBuffer();<br /> sb.append(linea.substring(3));<br /> }else if(coincide && nroLinea != 1){<br /> resultado.add(sb.toString());<br /> sb = new StringBuffer();<br /> sb.append(linea.substring(3));<br /><br /> }else{<br /> sb.append(";"+linea);<br /> }<br /> nroLinea++; <br /> }while(scaner.hasNext());<br /> resultado.add(sb.toString());<br /> for(String cadena: resultado){<br /> System.out.println(cadena);<br /> }<br /> }<br />}<br /></pre></span></td></tr></tbody></table><br /><br /><span style="font-weight:bold;">Explico: </span><br />La clase Scanner recibe un Archivo que es el que voy a leer (hay que asegurarse que la ruta es le correcta ya sea relativa o absoluta), de no ser así se lanza una FileNotFoundException.<br /><br />Lo primero que hago es recorrer las líneas de este archivo con el ciclo do-while externo. Utilizo ls expresiones regulares para ver si mi comienzo de línea contiene dos caracteres en mayúsculas ([A-Z]{2}), si coincide puede pasar dos cosas: que sea la primera línea o no; si es la primera línea sólo agrego la cadena a un stringbuffer que almacena todos los autores relacionados, si no, si coincide pero no es la primera línea, agrego todos los autores relacionados (stringbuffer)a una Coleccion ArrayList de string y luego creo uno nuevo para la nueva cadena, si no es ninguno de estos dos casos, entonces quiere decir que la lectura de la línea es un autor más por lo que procedo a agregarlo al stringbuffer.<br /><br />Además la línea después del while externo resultado.add(sb.toString) se asegura de agregar el último registro después de hacer el recorrido del archivo. <br /><br /><span style="font-weight:bold;">Nota:</span> La el metodo substring(3) devuelve una nueva cadena a partir del caracter número 3, haciendo el conteo a partir de cero(0).<br /><br />Toño si tienes otra duda, no vaciles en preguntar. Hasta Luego.Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com3tag:blogger.com,1999:blog-7189135837700621853.post-16872595060959896012010-09-15T03:45:00.001-07:002010-10-09T07:54:34.110-07:00Java Persistence API con Hibernate.Saludos compañeros y gracias por acompañarme nuevamente, acá en Acerca de Java para discutir temas acerca de la tecnología java. Ahora hablemos un poco acerca de Java Persistence Api (JPA), en su implementación Hibernate.<br /><br />Generalmente cuando creamos aplicaciones, debemos interactuar con una base de datos relacional, en este caso es necesario realizar sentencias SQL desde nuestro código de programa para poder enviar solicitudes de base de datos y traer, actualizar o borrar datos.<br /><br />Con la implementación Hibernate, ya esto no es necesario. Hibernate me permite realizar persistencias de objetos java en una base de datos relacional sin necesidad de sentencias sql, es decir puedo almacenar mi objeto java, en una base de datos, relacionando mis datos de objeto con los campos de la base de datos.<br /><br />Para poder realizar este tipo de persistencia se necesitan cinco requisitos:<br /><br />* Objeto Java Persistente: Objeto a ser serializado. <br />* Archivo de Mapeo Hibernate:<br />* Archivo de Configuración Hibernate.<br />* API Hibernate.<br />* Manejador de Base de Datos, en este caso yo utilizaré PostgreSQL 9.0.<br /><br /><span style="font-style: italic;"><span style="font-weight: bold;">Objeto Java Persistence:</span></span> Una innovación con Hibernate es que no necesita extender a ninguna clase y tampoco es necesario que implemente una interfaz. Pero si es necesario declarar un constructor público que no reciba parámetros, además como buena práctica de programación deben sobreescribir los métodos equals y hashCode, no es un requisitor indispensable pero se considera buena práctica de programación.<br /><br />Ejemplo de un tipo de objeto persistente:<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />package mypersistence;<br /><br />import java.util.Date;<br /><br />public class Empleado {<br /><br /> private int id;<br /> private String nombre;<br /> private Date nacimiento;<br /> <br /> public Empleado(){ }<br /><br /> public int getId() {<br /> return id;<br /> }<br /><br /> public void setId(int id) {<br /> this.id = id;<br /> }<br /><br /> public String getNombre() {<br /> return nombre;<br /> }<br /><br /> public void setNombre(String nombre) {<br /> this.nombre = nombre;<br /> }<br /> <br /> public Date getNacimiento(){<br /> return nacimiento;<br /> }<br /><br /> public boolean equals(Object objeto){<br /> if(objeto == this)<br /> return true;<br /> Empleado empleado = (Empleado) objeto;<br /> if(this.nombre.equals(empleado.nombre))<br /> return true;<br /> return false;<br /> }<br /> <br /> public int hashCode(){<br /> return this.nombre.hashCode();<br /> }<br /><br /> public void setNacimiento(Date fecha) {<br /> nacimiento = fecha;<br /> }<br />}</pre></span></td></tr></tbody></table><br /><br /><span style="font-style: italic;"><span style="font-weight: bold;">Archivo de mapeo Hibernate:</span></span> Es un archivo XML que que dice al API Hibernate como va a ser serializado mi Objeto Java Persistence. Hay 4 maneras:<br />* Mapeo de clase a tabla.<br />* Un elemento id para identificar la clave principal de la tabla.<br />* Mapeo de propiedad a columna o lo que es lo mismo de Atributo a campo.<br />* Relaciones con otros objetos persistentes.<br /><br />Ejemplo de XML: <br /><span style="font-weight:bold;">Nombre del archivo:</span> Empleado.hbm.xml<br /><br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><code><br /><br /><?xml version="1.0" encoding="UTF-8"?><br /><!DOCTYPE hibernate-mapping PUBLIC<br />"-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd "><br /><br /><hibernate-mapping><br /><class name = "mypersistence.Empleado" table="Empleados"><br /><br /><id name = "id" column = "id"><br /><generator class="sequence"/> <br /></id><br /><br /><property name = "nombre" column = "nombre" <br /> type = "string"></property><br /><property name = "nacimiento" column = "fecha_nacimiento" <br /> type = "timestamp" update = "false"></property><br /><br /></class><br /></hibernate-mapping><br /></code></pre></span></td></tr></tbody></table><br /><br /><span style="font-style: italic;"><span style="font-weight: bold;">Archivo de configuracion Hibernate:</span></span> Como es de esperarse este archivo define las opciones de configuración globales para la serialización y por ello normalmente sólo existe un archivo XML de configuración por aplicación. Aquí se definen: Información sobre la conexión a la base de datos, dialecto a utilizar (varía de acuerda al RDBMS utilizado), una opción que es bueno resaltar es la propiedad<span style="font-family:courier new;"> show_sql</span> que muestra el SQL que ha sido ejecutado además hibernate.hbm2dll.auto crea las tablas basado en el archivo de mapeo. Aquí ahora el ejemplo de archivo de configuración hibernate:<br /><br /><span style="font-weight:bold;">Nombre del archivo:</span> hibernate.cfg.xml<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><code><br /><!DOCTYPE hibernate-configuration PUBLIC<br />"-//Hibernate/Hibernate Configuration DTD 3.0//EN"<br />"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd "><br /><br /><hibernate-configuration><br /> <session-factory><br /> <property name = "show_sql">true</property><br /> <property name = "hibernate.dialect"><br /> org.hibernate.dialect.PostgreSQLDialect</property><br /> <property name = "hibernate.hbm2dll.auto"><br /> create-drop</property><br /> <property name = hibernate.connection.driver_class"><br /> org.postgresql.Driver</property><br /> <property name = "hibernate.connection.username"><br /> postgres</property><br /> <property name = "hibernate.connection.password"><br /> miclave</property><br /> <property name = "hibernate.connection.url"><br /> jdbc:postgresql://localhost:5432/postgres</property><br /><mapping resource = "Empleado.hbm.xml" /><br /></session-factory><br /></hibernate-configuration><br /></code></pre></span></td></tr></tbody></table><br /><br /><span style="font-style: italic;"><span style="font-weight: bold;">API Hibernate: </span></span> Es el conjunto de herramientas que me permite realizar la serialización, es decir, esta es la maquinaria necesaria para utilizar todos los otros tres recursos antes vistos e implementar de una vez la serialización. En nuestro caso vamos a utilizar el paquete org.hibernate.*.<br /><br /> Veamos ahora que debemos hacer para utilizar este API Hibernate y realizar la serialización:<br /><br /> <span style="font-weight:bold;">Creación de HibernateUtil</span>: interactúa con el archivo de configuración. Inicia sesión.<br /><br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />package mypersistence;<br /><br />import java.io.File;<br /><br />import org.hibernate.Session;<br />import org.hibernate.cfg.Configuration;<br />import org.hibernate.SessionFactory;<br /><br />public class HibernateUtil {<br /> private final static SessionFactory sf;<br /> static {<br /> Configuration cfg = new Configuration();<br /> File f = new File(<br />"C:\\AcercaDeJava\\Hibernate\\files\\hibernate.cfg.xml"); <br /> cfg.configure(f);<br /> sf = cfg.buildSessionFactory();<br /> }<br /> <br /> public static Session currentSession(){<br /> return sf.openSession();<br /> }<br /> <br /> public static void close(Session session){<br /> session.close();<br /> }<br />}<br /></pre></span></td></tr></tbody></table><br /><br /> HibernateManager: Utiliza a HibernateUtil para iniciar sesión e inicia el proceso de grabación:<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />package mypersistence;<br /><br /><br />import java.util.Date;<br />import org.hibernate.HibernateException;<br />import org.hibernate.Session;<br />import org.hibernate.Transaction;<br /><br />import mypersistence.Empleado;<br />import mypersistence.HibernateUtil;<br /><br />public class EmpleadoManager {<br /><br /> Session s = HibernateUtil.currentSession();<br /> <br /> public void save(Empleado empleado){<br /> try{<br /> Transaction tx = s.beginTransaction();<br /> s.saveOrUpdate(empleado);<br /> tx.commit();<br /> }catch(HibernateException e){<br /> e.printStackTrace();<br /> }<br /> }<br /> <br /> public static void main(String[] args) {<br /> Empleado empleado = new Empleado();<br /> empleado.setNombre("Rafael Atencio");<br /> empleado.setNacimiento(new Date());<br /> <br /> EmpleadoManager manager = new EmpleadoManager();<br /> manager.save(empleado);<br /> }<br />}<br /></pre></span></td></tr></tbody></table><br /><br />Ahora si: Aquí tengo una lista de las librerías que tuve que usar, casi todas pueden encontrarse en la página web <a href = "http://www.findjar.com/index.x">http://www.findjar.com/index.x</a>:<br /><br />cglib-full-2.0.jar<br />commons-collections-3.1.jar<br />commons-logging-api.jar<br />dom4j-1.1.jar<br />ehcache-1.6.2.jar<br />hibernate-3.0.5.jar<br />hibernate-jpa-2.0-api-1.0.0.Final.jar<br />hibernate-validator-4.1.0.Final.jar<br />j2ee-1.4.jar<br />log4j-1.2.14.jar<br />postgresql-9.0-801.jdbc4.jar<br />slf4j-api-1.5.6.jar<br />slf4j-log4j12-1.5.6.jar<br />validation-api-1.0.0.GA.jar<br /><br />Además hay que asegurarse que la ruta de los archivos hibernate.cfg.xml y Empleado.hbm.xml están en el Build Path o CLASSPATH. <br /><br />Para ello, en eclipse, se hace clic secundario Proyecto, se elige el Build Path, luego Configure Build Path..., se va a la prestaña Source y se agrega la carpeta donde están los archivos de mapeo y configuración.<br /><br />Adicionalmente como PostgreSQL no trabaja directamente con campos AUTOINCREMENT hay que realizar un objeto de secuencia hibernate ejecutando la siguiente sentencia SQL en nuestra BD Postgres: <br /><br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />CREATE SEQUENCE hibernate_sequence<br />INCREMENT 1<br />MINVALUE 1<br />MAXVALUE 9223372036854775807<br />START 1<br />CACHE 1; <br /></pre></span></td></tr></tbody></table><br /><br />Bueno no queda más que ejecutar la clase HibernateManager para generar un registro en Base de Datos PostgreSQL y obtener por consola el SQL que ha sido ejecutados.<br /><br />Por ahora no tengo más que decir más que desearle suerte en la ejecución de su proyecto con Hibernate, cualquier duda pueden escribir comentarios en el post.<br /><br />Nos vemos, ¡Hasta Luego!Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com5tag:blogger.com,1999:blog-7189135837700621853.post-72855481661716126622010-08-04T15:10:00.000-07:002010-10-07T10:39:16.780-07:00Libros de Java SE 6Hasta hace poco, era difícil encontrar un libro que haga referencia a Java SE 6, pero me he dado cuenta que últimamente ya están disponibles en las librerías.<br /><br />A mediados del año pasado encontré uno (muy famoso por cierto en cuanto a tecnología Java) llamado Profesional Java JDK 6, por W. Clay Richardson y otros autores y digo famoso debido a que tiene el sello WROX o no se si decir es de WROX.<br /><br />Todavía estoy contento de mi adquisición, este libro me ha servido de ayuda para la mayoría de mis artículos tanto de Java SE 5 y Java SE 6. Comienza con un recuento de las novedades de Java 5 y luego (mucho más adelante) comienza a revelarte los secretos de Java 6.<br /><br />He encontrado algunos pequeños errores, pero me parecen en algunos casos insignificantes, no hay que conformarse con lo que te dicen allí, hay que probar, analizar, ejecutar, etc... para darse cuenta que algunas veces cometen errores pequeños. <br /><br />Bueno, no quiero dejar este comentario a medias, un error que encontré fue en la página 63 (hablo la versión en español) en un programa que habla sobre las anotaciones, donde hay dos clases y una interfaz, la interfaz es la que aparece "anotada", se llama TestParameters.<br /><br />En una clase llamada StringUtility tiene un método concat con el siguiente cuerpo:<br /><br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />public String concat (String s1, String s2){<br /> return (s1 + s2);<br />}<br /><br />//y un método testConcat() de la siguiente manera<br /><br />public boolean testConcat(){<br /> String s1 = "test";<br /> String s2 = " 123";<br /> return(concat(s1,s2).equals("test 123");<br />}<br /></pre></span></td></tr></tbody></table><br /><br />Por supuesto, esto no arroja ningún error de compilación, luego en la clase TestFramework está el método invoke que utiliza la reflección (java.lang.reflect) de la siguiente manera:<br /><br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />static String invoke(Method m, Object o){<br /> String result = "PASSED";<br /> try{<br /> m.invoke(o);<br /> } catch (Exception ex){<br /> System.out.println("Exception: " + ex + <br /> "\n" + ex.getCause);<br /> result "FAILED";<br /> }<br /> return (result);<br />}<br /></pre></span></td></tr></tbody></table><br /><br />Que tampoco tiene error de compilación, pero hay un error lógico, supongamos que el método testConcat() devuelva false debido a que se escribió return(concat(s1,s2).equals("test 12");, para el método invoke no hay error (No hay Exception) y por lo tanto imprime igualmente PASSED. <br /><br />Debido a este error debe cambiarse el método testConcat a algo como esto:<br /><br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />public boolean testConcat() throws Exception<br />{<br /> String s1 = "test";<br /> String s2 = " 123";<br /> boolean resultado = (concat(s1,s2).equals("test 123"));<br /> if(resultado){<br /> return resultado;<br /> }<br /> throw new Exception();<br />}<br /></pre></span></td></tr></tbody></table><br /><br />De esta forma, se arroja una Exception si el método falla y se captura cuando se hace la llamada m.invoke(o), es decir result sería "FAILED".<br /><br />Espero haberme explicado; este error fue el mas grave que encontré, la verdad tiene muchos errores de transcripción pero creo que este tipo de error es insignificante para el buen lector que le interesa el contenido.<br /><br />Bueno, siguiendo con el tema de los libros, decía que yo adquirí este libro aproximadamente hace un año y me sentí bastante satisfecho de su contenido, pero la verdad este post lo escribo para que tengamos en cuenta que ya existen muchos libros de Java SE 6.0 en las librerías y aquí le tengo otros dos que ví en ellas:<br /><br />Java. Como Programar. Septima Edición. DEITEL. (Basado en Java SE 6)<br /><br />Yo adquirí este libro en su versión Java SE 1.4 y me pareció excelente, es extenso en sus explicaciones y ejemplos y además te da un CD con todo el código fuente del libro. Fue muy buena fuente de consulta y me dio herramientas para realizar algunas de las preguntas de nuestros post acerca de la preparación para la prueba Sun Java Programmer que se escribieron en este blog desde Agosto hasta Diciembre 2009.<br /><br />Mi sorpresa mayor fue que al lado de este libro, otro que se llama Java. Manual de referencia. Séptima edición por Herbert Schildt. McGrawHill (también basado en Java SE 6)de este no tengo referencias, pero he visto que el mismo autor en otros libros conocidos.<br /><br />Lo que me alegra es que ya en las librerías nos presenten bibliografías de la última versión de Java.<br /><br />Bueno por ahora no tengo más que agregar, si a la disposición de seguir aportando acerca de la tecnología Java y a la espero de una nueva versión que podamos probar y que nos siga generando ganancias en el sentido del conocimiento, ahorro de tiempo de programación y administración de recursos de sistema.<br /><br />Hasta la próxima.Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com2tag:blogger.com,1999:blog-7189135837700621853.post-66867632175733568322010-07-31T21:40:00.000-07:002010-10-07T10:38:00.491-07:00La nueva clase SystemTray de Java SE 6La nueva clase SystemTray permite (si es soportado por el sistema operativo) crear un pequeño ícono en la bandeja de escritorio, de tal manera que pueda accederse a ella sin necesidad de crear una ventana común. Sólo un pequeño ícono que para windows por ejemplo se encuentra cerca del reloj, donde generalmente corren las aplicaciones como Antivirus, reloj, etc...<br /><br />De hecho creo que este es el artículo mas corto que escrito, debido a lo fácil que se me hizo realizarlo veamos el ejemplo:<br /><br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />package traydemo;<br /><br />import java.awt.*;<br />import java.awt.event.*;<br />import javax.swing.*;<br />public class DemoTray {<br /> public static void main(String[] args) {<br /> final TrayIcon icono;<br /> Image imagen = null;<br /> final JFrame ventana = new JFrame("Principal");<br /> if(SystemTray.isSupported()){<br /> SystemTray tray = SystemTray.getSystemTray();<br /> imagen = Toolkit.getDefaultToolkit().<br /> getImage("Tray.jpg");<br /> PopupMenu popup = new PopupMenu();<br /> MenuItem optComenzar = new MenuItem("Comenzar...");<br /> MenuItem optSalir = new MenuItem("Salir");<br /> optSalir.addActionListener( new ActionListener() {<br /> public void actionPerformed(ActionEvent arg0) {<br /> System.exit(0);<br /> }<br /> });<br /> optComenzar.addActionListener(new ActionListener() {<br /> public void actionPerformed(ActionEvent e) {<br /> ventana.setSize(300,300);<br /> ventana.setVisible(true);<br /> }<br /> });<br /> popup.add(optComenzar);<br /> popup.add(optSalir);<br /> icono = new TrayIcon(imagen, "Tray", popup);<br /> icono.setImageAutoSize(true);<br /> icono.addMouseListener(new MouseAdapter() {<br /> public void mouseClicked(MouseEvent e){<br /> if(e.getButton() == 1){<br /> ventana.setSize(300,300);<br /> ventana.setVisible(true);<br /> }<br /> }<br /> });<br /> try {<br /> tray.add(icono);<br /> } catch (AWTException e1) {<br /> System.out.println(e1.getStackTrace());<br /> }<br /> }<br /> }<br />}<br /></pre></span></td></tr></tbody></table><br /><br />Creo que es fácil entender y usar. <br /><br />Primero que todo hay que preguntar si nuestro sistema operativo soporta SystemTray (es decir, SystemTray.isSupported()) de ser así creo la instancia de SystemTray, elijo la imagen que va a ser colocada en la bandeja de escritorio a través de la clase Image, recuerde que esta imagen debe estar en la misma ruta del proyecto Java.<br /><br />Creo un menú auxiliar (PopupMenu) que se desplegará si el usuario hace clic secundario en este ícono, tendrá dos opciones comenzar la aplicación (llama a ventana Swing.JFrame principal de la aplicación por supuesto) o salir (System.exit(0)), creo un TrayIcon llamado icono que que será el ícono de la aplicación pasándole la imagen seleccionada, ajusto con setImageAutoSize(true) para que la imagen se ajuste al tamaño del ícono de la bandeja de Escritorio, si el usuario hace clic en el ícono con el botón principal también se desplega la ventana principal. Por último y muy importante es agregar el icono (TrayIcon) al tray, una vez hecho esto, el ícono queda visible en el system tray, es decir, la bandeja de escritorio, cerca del reloj, antivirus, etc...<br /><br />Bueno esto es todo por ahora, espero haberme explicado y les sea de utilidad este post. Nos vemos en una próxima edición.Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com1tag:blogger.com,1999:blog-7189135837700621853.post-18435892924149487902010-07-24T09:29:00.000-07:002010-10-07T10:36:09.958-07:00Dialogos Modales y No Modales en Java SE 6. Novedades Swing.Saludos compañeros nos vemos otra vez aquí, para compartir ideas y experiencias de Java. Esta vez le toca el turno a los diálogos modales, mostraremos que conforma el nuevo API de Java SE 6 para crear diálogos modales y evitar diálogos modales, empecemos:<br /><br />En versiones anteriores de Java ya existía una forma de crear diálogos modales a través del parámetro boolean (modal o no) del constructor de la clase java.awt.Dialog, este parámetro al ser verdadero (true) bloqueaba toda la aplicación y hasta que ella se cerrara no se podía seguir con la aplicación. Veamos un pequeño en ejemplo con este constructor:<br /><br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />package mipaquete;<br />import javax.swing.*;<br /><br />public class Marco {<br /> public static void main(String[] args) {<br /> JFrame f = new JFrame("");<br /> f.setAlwaysOnTop(true);<br /> f.setSize(300,300);<br /> f.setVisible(true);<br /> JDialog d = new JDialog(f, "Dialog", true);<br /> d.setSize(300,300);<br /> d.setLocationRelativeTo(null);<br /> d.setVisible(true);<br /> }<br />}<br /></pre></span></td></tr></tbody></table><br /><br />Si se ejecuta este párrafo anterior se muestra un Frame y un Diálogo, hasta que no sea cerrado el diálogo no puede tomar el foco el Frame, es decir no tengo acceso a él.<br /><br />Si tengo una aplicación en la cual deseo que no toda la aplicación sea bloqueada sino sólo parte de ella, puedo hacer uso del nuevo API de Java 6 donde se incluyen dos clases estáticas dentro de la clase Dialog, estas son:<br /><br /><br />static class <span style="font-weight:bold;">ModalityType</span> y static class <span style="font-weight:bold;">ModalExclusionType</span>, ambas tienen dentro de sí una enumeracion que indican el nivel de bloqueo que pueden generar.<br /><br />static class ModalityType, esta clase sirve para definir el tipo de bloqueo, o también llamado alcance del bloqueo en una aplicación, su enumeración contiene:<br /><br /><span style="font-weight:bold;"><span style="font-style:italic;">APPLICATION_MODAL:</span></span> Bloquea todas las ventanas de la aplicación, excepto las ventanas que se deriven de ella, es decir, las ventanas que estén abiertas para el momento en que se muestra este diálogo quedan bloqueadas, pero si a partir de ese momento se crean nuevas ventanas (ventanas hijas) estas no serán bloqueadas.<br /><br /><span style="font-weight:bold;"><span style="font-style:italic;">DOCUMENT_MODAL:</span></span> Bloquea la ventana padre de la ventana y su jerarquía superior, es decir bloque las ventanas de donde fue derivada, pero esto no incluyen las ventanas que no pertenecen a esta jerarquía por lo tanto algunas ventanas quedarán sin bloquear.<br /><br /><span style="font-weight:bold;"><span style="font-style:italic;">MODELESS:</span></span> no bloquea ninguna ventana.<br /><br /><span style="font-weight:bold;"><span style="font-style:italic;">TOOLKIT_MODAL:</span></span> Bloquea las ventanas de nivel superior que corren en el mismo TOOLKIT.<br /><br />Podemos excluir del bloqueo a una ventana o diálogo utilizando la clase ModalExclusionType, esta puede excluir del bloqueo según alguna de estas opciones de su enumeración:<br /><br /><span style="font-weight:bold;"><span style="font-style:italic;">APPLICATION_EXCLUDE:</span></span> La ventana que utiliza este valor de enumeracion no será bloqueada por ningún diálogo de la aplicación. <br /><br /><span style="font-weight:bold;"><span style="font-style:italic;">NO_EXCLUDE: </span></span> Indica que la ventana no estará excluida del bloqueo si este ocurriera.<br /><br /><span style="font-weight:bold;"><span style="font-style:italic;">TOOLKIT_EXCLUDE:</span></span> Indica que no se bloqueará esta ventana si se llamase a APPLICATION_MODAL o TOOLKIT_MODAL.<br /><br />Lo que nos faltaría por ver son los métodos agregados en Java SE 6.0 que nos permiten utilizar estas enumeraciones:<br /><br />En la clase java.awt.Dialog se incluyeron los métodos setModalityType() que recibe un Dialog.ModalityType para definir el alcance del bloqueo, también se agregó el método getModalityType(), entre otros.<br /><br />En la clase Windows se incluyó el método setModalExclusionType() que recibe un elemento de la enumeracion ModalExclusionType para definir que tipo de exclusión será aplicada, también se cuenta con el método getModalExclusionType(), el uso es obvio.<br /><br />También se agregaron los constructores public Dialog(Window owner, String title,Dialog.ModalityType modalityType) y public Dialog(Window owner, String title, Dialog.ModalityType modalityType, GraphicsConfiguration gc), GraphicsConfiguration queda fuera del alcance de este artículo.<br /><br />Ahora si estamos listos para crear nuestra aplicación con Ventanas y Diálogos modales con las nuevas modalidades Java SE 6.0. Veamos:<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />package modality;<br />import java.awt.*;<br />import java.awt.Dialog.*;<br />import java.awt.event.*;<br />import javax.swing.*;<br /><br />public class ClaseModal {<br /><br /> static JFrame padre;<br /> <br /> public static void main(String[] args) {<br /> padre = new JFrame("Marco1");<br /> padre.setLayout(new BorderLayout());<br /> JButton btnNuevaVentana = <br /> new JButton("Boton Mostrar Hija");<br /> JLabel etiqueta = new JLabel("Etiqueta");<br /> etiqueta.setBackground(Color.BLUE);<br /> padre.add(etiqueta, BorderLayout.CENTER);<br /> padre.add(btnNuevaVentana, BorderLayout.SOUTH);<br /> btnNuevaVentana.addActionListener(<br /> new ActionListener(){<br /> @Override<br /> public void actionPerformed(ActionEvent e) {<br /> JDialog dialogoAuxiliar = <br /> new JDialog(padre, "hija",<br /> Dialog.ModalityType.DOCUMENT_MODAL);<br /> JButton btnSaveAs = <br /> new JButton("Save as...");<br /> btnSaveAs.addActionListener(<br /> new ActionListener(){<br /> @Override<br /> public void actionPerformed(ActionEvent e) {<br />//Disminucion de sanguia por cuestiones de espacio<br /> FileDialog fileDialog = <br /> new FileDialog(padre,<br /> "Guardar", FileDialog.SAVE);<br /> fileDialog.setSize(400,400);<br /> fileDialog.setVisible(true);<br /> }<br /> });<br /> dialogoAuxiliar.add(btnSaveAs);<br /> dialogoAuxiliar.setSize(300,300);<br /> dialogoAuxiliar.setLocation(150,150);<br /> dialogoAuxiliar.setVisible(true);<br /> }<br /> });<br /> padre.setSize(300,300);<br /> padre.setVisible(true);<br /> JFrame ventanaIndependiente = <br /> new JFrame("Ventana Independiente");<br /> ventanaIndependiente.setModalExclusionType(<br /> Dialog.ModalExclusionType.APPLICATION_EXCLUDE);<br /> ventanaIndependiente.setSize(500,500);<br /> ventanaIndependiente.setLocation(75, 75);<br /> ventanaIndependiente.setVisible(true);<br /> }<br />}</pre></span></td></tr></tbody></table><br /><br />Al ejecutar esta aplicación se obtienen 2 ventanas, una ventana Padre y una Independiente. Al hacer click en el botón Mostrar Hija, se desplega una ventana hija que bloquea la padre (DOCUMENT_MODAL), la ventana hija tiene un único botón que llama un FileDialog (Cuadro de dialogo Guardar), este Cuadro de diálogo tampoco bloquea la ventana independiente ya que utiliza a Dialog.ModalExclusionType.APPLICATION_EXCLUDE, si se utilizara Dialog.ModalExclusionType.NO_EXCLUDE o simplemente no se asigna ningún ModalExclusionType, entonces la ventana independiente se bloquearía con el cuadro de diálogo SAVE.<br /><br />Bueno, espero haberme explicado y este código les ayude a resolver dudas o inquietudes que se les hayan podido encontrar, cualquier pregunta tenemos los comentarios abiertos, para ampliar el tema, o resolver dudas, por mi parte me despido hasta una próxima edición.Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com12tag:blogger.com,1999:blog-7189135837700621853.post-66359483452081078052010-05-31T16:17:00.000-07:002010-10-07T10:35:48.218-07:00El cálculo de PI con 500 decimalesSaludos de nuevo compañeros. Hoy tenemos un nuevo reto el cálculo de PI hasta de 500 decimales, esto como respuesta a un comentario que fue realizado en el post sobre Interfaces Genéricas, si ya sabemos, no tiene nada que ver, pero en ese post fue realizada la duda y en este post UNA posible solución.<br /><br />Muchos métodos han sido utilizados para calcular el Valor de PI, hoy en día existen algoritmos que generan con gran precision este valor, En la clase Math existe una constante PI de tipo double que contiene el valor literal<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />public static final PI = 3.141592653589793d;<br /></pre></span></td></tr></tbody></table><br /><br />Pero por supuesto, es insuficiente para cálculos avanzados. No nos da mayor precisión, allí termina.<br /><br />De hecho cuando he trabajado con los valores primitivos double he tenido dificultades para obtener mayor precisión, soy "todo oído" para soluciones.<br /><br />Pero gracias a Dios contamos con la clase BigDecimal que permite obtener mayor precisión en el cálculos numérico con decimales, a pesar de que los cálculos son mas limitados.<br /><br />Si quiere consultar la clase BigDecimal haga clic <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html">aqui</a>.<br /><br />En esta clase contamos con un constructor que recibe un <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/math/MathContext.html">MathContext</a> que en su constructor recibe un parámetro que dice cual es la precisión con la que queremos trabajar en este caso yo paso 500 así:<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />MathContext mc = new MathContext(500);<br /></pre></span></td></tr></tbody></table><br /><br />Aunque en realidad me da mayor precisión que esa.<br /><br />Ahora bien es hora de hablar de métodos de cálculo de PI.<br /><br />Primero que todo debemos hablar de la <a href="http://es.wikipedia.org/wiki/Serie_de_Taylor">Serie de Taylor. </a><br /><br />Esta propone una serie para el cálculo de el arcotangente:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBZOF2vgZfMtWRyN4Kj9A0UtNA_SbX0VLsGojOKZ_zA2qZCBpt6e1CO53oL4_lMXz7cHLx_jm07TBhmVqbTVhGsOgsNyd8l_cBsTkKTp1W_rWCDCP5W6TRd1ZEbKIkC5XeKFiBBCuYXcs/s1600/taylor.png"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 43px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBZOF2vgZfMtWRyN4Kj9A0UtNA_SbX0VLsGojOKZ_zA2qZCBpt6e1CO53oL4_lMXz7cHLx_jm07TBhmVqbTVhGsOgsNyd8l_cBsTkKTp1W_rWCDCP5W6TRd1ZEbKIkC5XeKFiBBCuYXcs/s320/taylor.png" alt="" id="BLOGGER_PHOTO_ID_5477617600969856818" border="0" /></a><br /><br />Siendo así podemos programar un método que calcule el arcotangente de un valor con la Serie de Taylor:<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />private static BigDecimal serieArcotangente<br /> (double x, int iteraciones) {<br /> MathContext mc = new MathContext(500);<br /> BigDecimal result = new BigDecimal(0.00, mc);<br /> BigDecimal uno = new BigDecimal(1.00);<br /> for(int i = 0; i < iteraciones; i++){<br /> double div = (2.00*i+1.00) *<br /> (Math.pow(1.00/x, 2.00 * i + 1.00));<br /> BigDecimal divisor = new BigDecimal(div);<br /> if(i % 2 == 0){<br /> result = result.add(uno.divide(divisor, mc));<br /> }else{<br /> result = result.subtract(uno.divide(divisor, mc));<br /> }<br /> }<br /> return result;<br />}<br /></pre></span></td></tr></tbody></table><br /><br />Explicando un poco este método, tenemos que retorna un BigDecimal para mayor precision de PI, tenemos MathContext de 500 decimales de precision. Inicializamos un BigDecimal en cero pasandole este MathContext y un BigDecimal inicializado en 1.0 que servirá para el cálculo.<br /><br />Después comenzamos las iteraciones (sentencia for), calculamos un double divisor (divisor de la Serie de Taylor) y lo inicializamos como otro BigDecimal, luego tenemos:<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br /> if(i % 2 == 0){<br /> pi = pi.add(uno.divide(divisor, mc));<br /> }else{<br /> pi = pi.subtract(uno.divide(divisor, mc));<br /> }<br /></pre></span></td></tr></tbody></table><br />Que significa que si i es par sumo, sino resto, ya que -1 en la serie está elevada a la n (si n es par se convierte en positivo - se suma - sino es negativo y por lo tanto se resta). Además se divide uno entre el divisor con el MathContext de 500 decimales de precisión.<br /><br />Una vez hecho esto podemos ver las de arcotangentes desarrolladas por algunos matemáticos para calcular el valor de PI:<br /><br />Haciendo historia, en 1844, Dase, un calculista ultrarrápido, utilizó otra fórmula del tipo arcotangente para conseguir una aproximación con 200 decimales correctos. La fórmula descubierta por Strassnitzky es:<br /><br />PI/4 = arctan(1/2) + arctan(1/5) + arctan(1/8)<br /><br />En programación sería:<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />public static BigDecimal calculoPiDase(){<br /> BigDecimal pi = serieArcotangente(1.00/2.00, 100)<br /> .add(serieArcotangente(1.00/5.00, 100))<br /> .add(serieArcotangente(1.00/8.00,100))<br /> .multiply(new BigDecimal(4.00));<br /> return pi;<br />}<br /></pre></span></td></tr></tbody></table><br /><br />El gran matemático alemán, Karl Friedrich Gauss (1777-1855), también descubrió algunas fórmulas similares a las anteriores. Una de las más utilizadas ha sido:<br /><br />PI/4 = 12*arctan(1/18) + 8*arctan(1/57) - 5*arctan(1/239)<br /><br />este sería así:<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />public static BigDecimal calculoPiGauss(){<br /> BigDecimal pi = serieArcotangente(1.00/18.00, 60)<br /> .multiply(new BigDecimal(12.00))<br /> .add(serieArcotangente(1.00/57.00, 60)<br /> .multiply(new BigDecimal(8.00))<br /> .subtract(serieArcotangente(1.00/239.00, 60)<br /> .multiply(new BigDecimal(5.00)))<br /> );<br /> return pi.multiply(new BigDecimal(4.00));<br />}<br /></pre></span></td></tr></tbody></table><br /><br />Y otra fórmula similar descubierta por Störmer (1896):<br /><br />PI/4 = 6*arctan(1/8) + 2*arctan(1/57) + arctan(1/239)<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />public static BigDecimal calculoPiStormer(){<br /> BigDecimal pi = serieArcotangente(1.00/8.00, 60)<br /> .multiply(new BigDecimal(6.00))<br /> .add(serieArcotangente(1.00/57.00, 60)<br /> .multiply(new BigDecimal(2.00))<br /> .add(serieArcotangente(1.00/239.00, 60)));<br /> return pi.multiply(new BigDecimal(4.00));<br />}<br /></pre></span></td></tr></tbody></table><br /><br />Bueno por si acaso, ahora voy a estructurar bien el codigo:<br /><br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />public class PIPreciso {<br /> public static void main(String[] args) {<br /> System.out.println("DASE: "+calculoPiDase());<br /> System.out.println("GAUSS: "+calculoPiGauss());<br /> System.out.println("STORMER: "+calculoPiStormer());<br /> }<br /> <br /> public static BigDecimal calculoPiDase(){<br /> //Este codigo ya fue visto<br /> }<br /> <br /> public static BigDecimal calculoPiGauss(){ <br /> //Este codigo ya fue visto<br /> }<br /> <br /> public static BigDecimal calculoPiStormer(){<br /> //Este codigo ya fue visto<br /> }<br /> <br /> private static BigDecimal serieArcotangente<br /> (double x, int iteraciones) {<br /> //Codigo ya visto<br /> }<br />}<br /></pre></span></td></tr></tbody></table><br /><br />Ya tenemos tres métodos para calcular PI con 500 decimales o mas, espero esto haya podido ayudarte. Cualquier pregunta no dudes en escribir aquí o en cualquier post. Hasta LuegoKelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com16tag:blogger.com,1999:blog-7189135837700621853.post-23682881870547897692010-05-19T05:39:00.001-07:002010-10-07T10:35:12.316-07:00Hablemos de intefaces genéricas de java 5.0 Así como vimos en <a href = 'http://acercadejava.blogspot.com/2009/01/tipos-genericos-o-parametrizados-en.html'>un artículo anterior (Enero 2009 - tipos genéricos)</a> podemos crear clases genéricas. Ahora, y como respuesta a un comentario que expuso la duda, hablaremos de interfaces genéricas.<br /> Las interfaces genéricas se declaran de la "misma manera" que una clase genérica, veamos la sintaxis general:<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />interface <span style="font-style: italic;">nombre-interfaz</span><T1, T2, T3...>{<br /> metodo1();<br /> metodo2();…<br />}</pre></span></td></tr></tbody></table><br /><br />Donde T1, T2, T3... son los tipos parametrizados.<br />Aunque no siempre se así, una clase que implementa esta interfaz debe ser en forma general:<br /><br /><table width="100%" bgcolor="#e0e0e0" ><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />class nombre-clase<T1, T2, T3...> <br /> implements nombre-interfaz<T1, T2, T3...>{<br /> metodo1Implementado(){}<br /> metodo2Implementado(){}…<br />}</pre></span></td></tr></tbody></table><br /><br />Pero como les dije esto no es siempre veamos con un ejemplo cuales son las excepciones:<br />Supongamos que queremos crear una interfaz para verificar si un valor está contenido en un arreglo, la interfaz sería:<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />interface Contenedora<T>{<br /> boolean contiene(T valor);<br />}<br /></pre></span></td></tr></tbody></table><br />El método contiene debe devolver verdadero o falso en caso de que el arreglo contenga o no el valor.<br />La clase que implementa puede ser:<br /><br /><table width="100%" bgcolor="#e0e0e0"><tbody><r><td><br /><span style="font-family:courier new;"><pre><br />class Verificadora<T> implements Contenedora<T> {<br /> T[] datos;<br /><br /> public Verificadora(T[] x){<br /> datos = x;<br /> }<br /><br /> public boolean contiene(T dato) {<br /> for(T valor: datos)<br /> if(valor.equals(dato)) return true;<br /> return false;<br /> }<br />}<br /></pre></span></td></tr></table><br /><br />Hagamos un ejemplo con una clase Main:<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />public class Main {<br /> public static void main(String[] args) {<br /> Integer[] x = {0,1,2,3,4};<br /> Verificadora<Integer>; ver = <br /> new Verificadora<Integer>(x);<br /> if(ver.contiene(2)){<br /> System.out.println("Si tiene 2");<br /> }else{<br /> System.out.println("NO tiene 2");<br /> }<br /> if(ver.contiene(6)){<br /> System.out.println("Si tiene 6");<br /> }else{<br /> System.out.println("NO tiene 6");<br /> }<br /> /*if(ver.contiene(9.333)){ //error porque no es Integer<br /> System.out.println("Si tiene 9.333");<br /> }else{<br /> System.out.println("NO tiene 9.333");<br /> }*/<br /> }<br />}<br /></pre></span></td></tr></table><br /><br />La interfaz Contenedora no limita el tipo de dato con que trabajará, puede ser Integer, Double, Float o inclusive String, cualquier Object en general, por lo tanto podemos utilizar el método equals de esta clase (Object), tal como lo hace la clase verificadora en el método contiene().<br /><br />Ahora veamos varios detalles más con respecto a las interfaces genéricas:<br /><br />Si una clase implementa una interfaz genérica, la clase debe ser genérica a menos que la interfaz defina el tipo de dato parametrizado con el que va a trabajar. Vamos por parte, si la interfaz no define el tipo de dato parametrizado, entonces la clase debe ser genérica:<br /><br /><pre>class Verificadora<T> implements Contenedora<T>{//Bien</pre><br /><br />Es correcto ya que la clase utiliza el mismo parámetro de que la interfaz.<br /><br />Sería un error:<br /><br /><pre>class Verificadora implements Contenedora<T>{<br />//Error de compilación</pre><br /><br />Debido a que como la interfaz es genérica la clase debe ser genérica.<br /><br />Pero si la interfaz trabaja con String, es decir que define el parámetro:<br /><br /><pre>class Verificadora implements Contenedora<String>{//Bien</pre><br /><br />Entonces la clase no debe ser genérica necesariamente, ya que el tipo de dato lo define la interfaz.<br /><br />También, así como la clase, tal como lo vimos en el <a href = 'http://acercadejava.blogspot.com/2009/01/tipos-genericos-o-parametrizados-en.html'>artículo de tipos parametrizados</a>, puedo limitar el tipo de dato con que trabajará la interfaz. En caso que queramos trabajar con números podemos hacer:<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />interface Contenedora<T extends Number>{<br /> boolean contiene(T valor);<br />}<br /></pre></span></td></tr></tbody></table><br /><br />Si lo hacemos de esta manera la clase debe implementarse así:<br /><br /><pre>class Verificadora<T extends Number> <br /> implements Contenedora<T>{//Bien </pre><br /><br />ya no se requerirá repetir el tipo de dato de la interfaz, de hecho, si se hace se caería en un error de compilación:<br /><br /><pre>class Verificadora<T extends Number> <br />implements Contenedora<T extends Number>{//Error</pre>Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com7tag:blogger.com,1999:blog-7189135837700621853.post-18588790546255595582010-04-30T21:57:00.000-07:002010-10-07T10:33:49.113-07:00(Parentesis. II Parte) Compartiendo el código AppletAhora si llegó la hora de seguir en la onda java, ahora para presentar (como lo prometí en un post anterior), el código del Applet que me permite imprimir un reporte HTML, que me da la ventaja de capturar si el usuario del sistema hizo click en "Imprimir" o "Cancelar" para que se puedan hacer los cambios en la base de datos después que se procedió a imprimir.<br /><br />Este código también muestra como cambiar la configuración de impresión o también llamado atributos de impresión, por ejemplo los márgenes, todo esto desde código Java, también se utiliza el paquete java.net (la clase URL) que me permite buscar en una dirección remota un recurso, en este caso un archivo, que fue generado y grabado en el servidor.<br /><br />Como lo expliqué en el post anterior: este código me quedó de una experiencia en mi trabajo para la impresión de cheque, pero que no fue implementado por cambio en los requerimientos del sistema, pero pienso que les puede servir como ejemplo o ayuda a todo aquel que busque información en lo que se refiere a todos los elementos que actúan en el código que ya he mencionado en los párrafos anteriores.<br /><br />Bueno empecemos con el archivo HTML que contiene el contenido del cheque, este archivo debe ser creado por el programa en el servidor y por lo tanto estar en un directorio del mismo.<br />el Código es:<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />package cheque;<br /><br />import javax.print.attribute.HashPrintRequestAttributeSet;<br />import javax.print.attribute.PrintRequestAttributeSet;<br />import javax.print.attribute.standard.MediaPrintableArea;<br />import javax.swing.*;<br />import java.awt.*;<br />import java.awt.event.*;<br />import java.awt.print.*;<br />import java.io.*;<br />import java.net.MalformedURLException;<br />import java.net.URL;<br />import java.security.AccessControlException;<br /><br />public class ReporteApplet extends JApplet<br /> implements ActionListener, Printable{<br /> private JEditorPane htmlPane;<br /> private URL initialURL;<br /> private String ipServer;<br /> private String rutaArchivoHtml;<br /> private JButton printButton;<br /> private int margenSuperior, margenIzquierdo,<br /> private int anchoPagina, altoPagina;<br /> private PrintRequestAttributeSet atributosDeImpresion;<br /> private int unidadMedidaImpresion;<br /> public void init() {<br /> super.init();<br /> margenSuperior = (getParameter("margen-superior") != null)?<br /> Integer.parseInt(getParameter("margen-superior")):20;<br /> margenIzquierdo = (getParameter("margen-izquierdo") != null)?<br /> Integer.parseInt(getParameter("margen-izquierdo")):20;<br /> anchoPagina = (getParameter("ancho-pagina") != null)?<br /> Integer.parseInt(getParameter("ancho-pagina")):210;<br /> altoPagina = (getParameter("alto-pagina") != null)?<br /> Integer.parseInt(getParameter("alto-pagina")):297;<br /> ipServer = getParameter("ip-server");<br /> rutaArchivoHtml = getParameter("ruta-archivo");<br /> atributosDeImpresion = <br /> new HashPrintRequestAttributeSet();<br /> unidadMedidaImpresion = MediaPrintableArea.MM;<br /> }<br /> public void start(){<br /> try {<br /> //if ipServer == 127.0.0.1 invocar a localhost<br /> //else invocar 192.168.0.91<br /> if(ipServer != "192.168.0.91" && <br /> ipServer != null && <br /> ipServer.trim() != ""){<br /> this.initialURL = new URL<br /> ("http://localhost/rutaProyecto/"+<br /> rutaArchivoHtml);<br /> }else{<br /> this.initialURL = new URL<br /> ("http://192.168.0.91/rutaProyecto/"+<br /> rutaArchivoHtml);<br /> }<br /> htmlPane = new JEditorPane(initialURL);<br /> } catch (MalformedURLException e) {<br /> warnUser("Ruta de archivo incorrecto");<br /> } catch (AccessControlException e) {<br /> warnUser("no se tiene permiso de abrir archivo");<br /> }catch (IOException e) {<br /> warnUser("Verifique el IP de la maquina.\n<br /> Debe pasar por parámetro el IP correcto del servidor");<br /> }<br /> JPanel buttonPanel = new JPanel();<br /> buttonPanel.setBackground(Color.lightGray);<br /> printButton = new JButton("Imprimir");<br /> printButton.addActionListener(this);<br /> buttonPanel.add(printButton);<br /> getContentPane().add(buttonPanel, BorderLayout.SOUTH);<br /> htmlPane.setEditable(false);<br /> JScrollPane scrollPane = new JScrollPane(htmlPane);<br /> getContentPane().add(scrollPane, <br /> BorderLayout.CENTER);<br /> Dimension screenSize = <br /> Toolkit.getDefaultToolkit().getScreenSize();<br /> int width = screenSize.width * 8 / 10;<br /> int height = screenSize.height * 8 / 10;<br /> setBounds(width/8, height/8, width, height);<br /> setSize(500, 250);<br /> setVisible(true);<br /> }<br /> public void actionPerformed(ActionEvent event){<br /> String command = event.getActionCommand(); <br /> if (command.equals("Imprimir")){<br /> this.printComponent();<br /> }<br /> }<br /> private void warnUser(String message){<br /> JOptionPane.showMessageDialog(null, message, "Error",<br /> JOptionPane.ERROR_MESSAGE);<br /> }<br /> <br /> public void printComponent(){<br /> print();<br /> }<br /> <br /> public void print(){<br /> PrinterJob job = PrinterJob.getPrinterJob();<br /> job.setPrintable(this);<br /> atributosDeImpresion.add(new MediaPrintableArea<br /> (margenIzquierdo, margenSuperior,<br /> anchoPagina, altoPagina, unidadMedidaImpresion));<br /> if (job.printDialog(atributosDeImpresion)){<br /> try{<br /> job.print();<br /> }catch (Exception ex){<br /> System.out.println(ex);<br /> }<br /> }else{<br /> warnUser("Impresión cancelada");<br /> }<br /> }<br /><br /> public int print(Graphics g, PageFormat pf,<br /> int pageIndex) throws PrinterException{<br /> Graphics2D g2 = (Graphics2D)g;<br /> Dimension d = htmlPane.getSize(); <br /> double panelWidth = d.width; <br /> double panelHeight = d.height; <br /> double pageHeight = pf.getImageableHeight(); <br /> double pageWidth = pf.getImageableWidth(); <br /> double scale = pageWidth/panelWidth;<br /> int totalNumPages = (int)Math.ceil(scale * <br /> panelHeight / pageHeight);<br /> //Para asegurar que no imprime página vacía<br /> if(pageIndex >= totalNumPages){<br /> return Printable.NO_SUCH_PAGE;<br /> }<br /> g2.translate(pf.getImageableX()-19, <br /> pf.getImageableY()-19);<br /> g2.translate(0f, -pageIndex*pageHeight);<br /> g2.scale(scale, scale);<br /> htmlPane.paint(g2);<br /> return Printable.PAGE_EXISTS;<br /> }<br />}<br /></pre></span></td></tr></tbody></table><br /><br />Veamos que quiere decir todo este código. Entre los atributos de inteŕes de la clase ReporteApplet tenemos una referencia JEditorPane que es el que me sirve para mostrar el código HTML del cheque que se va a imprimir. Para definir los atributos de impresión se utilizan una interfaz (PrintRequestAttributeSet) que define los métodos para agregar o definir los atributos de impresión, una clase HashPrintRequestAttributeSet que implementa esta interfaz y una clase final MediaPrintableArea para definir el patrón de medida de los atributos así como usar finalmente estos atributos, aunque en el código esta disperso por cuestiones de orden del applet, la secuencia es:<br /><br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />private PrintRequestAttributeSet atributosDeImpresion;<br />atributosDeImpresion = new HashPrintRequestAttributeSet();<br />unidadMedidaImpresion = MediaPrintableArea.MM;<br />atributosDeImpresion.add(new MediaPrintableArea(<br /> margenIzquierdo, margenSuperior, anchoPagina, <br /> altoPagina, unidadMedidaImpresion));<br /></pre></span></td></tr></tbody></table><br /><br />Con el método add de la interfaz PrintRequestAttributeSet podemos agregar atributos de impresión utilizando la clase HashPrintRequestAttributeSet y MediaPrintableArea y con ello definir los márgenes, ancho y alto de la página así como la unidad de medida de la impresión (MM: milímetros o INCH para pulgadas). <br /><br />Si se sigue observando el código del Applet se puede ver que éste recibe varios parámetros, estos son:<br /><br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br /> margenSuperior = (getParameter("margen-superior") != null)?<br /> Integer.parseInt(getParameter("margen-superior")):20;<br /> margenIzquierdo = (getParameter("margen-izquierdo") != null)?<br /> Integer.parseInt(getParameter("margen-izquierdo")):20;<br /> anchoPagina = (getParameter("ancho-pagina") != null)?<br /> Integer.parseInt(getParameter("ancho-pagina")):210;<br /> altoPagina = (getParameter("alto-pagina") != null)?<br /> Integer.parseInt(getParameter("alto-pagina")):297;<br /> ipServer = getParameter("ip-server");<br /> rutaArchivoHtml = getParameter("ruta-archivo");<br /></pre></span></td></tr></tbody></table><br /><br />Todo estos parámetros los debo pasar a través del código del html que tiene el applet de la siguiente manera:<br /><br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br /><applet code="cheque.ReporteApplet.class" width="500" height="150"><br /><br /><param name="margen-superior" value="10"><br /><param name="margen-izquierdo" value="10"><br /><param name="ancho-pagina" value="180"><br /><param name="alto-pagina" value="275"><br /><param name="ip-server" value="127.0.0.1"><br /><param name="ruta-archivo" value="applets/cheque.html"><br /><br /></applet><br /></pre></span></td></tr></tbody></table><br /><br />Por último y no menos importante del código de ReportEApplet es que cuando se hace click en el botón "Imprimir" se llama al método PrintComponent() este a su vez llama al método print que contiene:<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />public void print(){<br /> PrinterJob job = PrinterJob.getPrinterJob();<br /> job.setPrintable(this);<br /> atributosDeImpresion.add(new MediaPrintableArea<br /> (margenIzquierdo, margenSuperior,<br /> anchoPagina, altoPagina, unidadMedidaImpresion));<br /> if (job.printDialog(atributosDeImpresion)){<br /> try{<br /> job.print();<br /> //Aqui codigo para cambiar valores en Base de datos<br /> }catch (Exception ex){<br /> System.out.println(ex);<br /> }<br /> }else{<br /> warnUser("Impresión cancelada");<br /> }<br />}<br /></pre></span></td></tr></tbody></table><br />Donde es creado un PrinterJob y luego llamo a printDialog (Ventana de diálogo de impresión) pasándole como parámetro los atributos de impresión para saber cuales atributos va a utilizar en la Impresión. Si en el diálogo se hace click en "Imprimir" se envía automáticamente a imprimir, de otra forma (si se hace click en cancelar) se muestra un mensaje con el motivo correspondiente.<br /><br />Bueno por ahora sólo falta el código HTML del cheque se los anexo aquí:<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><code><br /><!-- Este archivo se debe llamar cheque.html y colocarse en una ruta del servidor en la cual es llamada por la clase ReporteApplet--><br /><html><br /> <head><br /> <title></title><br /> <meta content=""><br /> <style><br /> body {<br /> padding: 0;<br /> margin: 0;<br /> }<br /> .papel{<br /> position: absolute;<br /> width: 18.60cm;<br /> height: 20.70cm;<br /> background: #dddddd;<br /> margin: 0;<br /> padding: 0;<br /> }<br /> .cheque table{<br /> cellspacing: 0;<br /> cellpadding: 0;<br /> }<br /> .cheque *{<br /> font-family: arial;<br /> font-size: 8pt;<br /> font-weight: bold;<br /> }<br /> .cheque{<br /> position: relative;<br /> float: left;<br /> clear:left;<br /> width: 17.60cm;<br /> height: 100px;<br /> font-family: arial;<br /> font-size: 8pt;<br /> font-weight: bold;<br /> background: #ffffff;<br /> border: 2px solid black;<br /> }<br /></style><br /></head><br /><body><br /><table cellpadding="0" cellspacing="0" ><br /> <tr><br /> <td width="13.60cm"></td><br /> <td align="left" height="0.92cm" valign="bottom" style="font-size: 8pt; font-family: arial; font-weight: bold;">2.550,75</td><br /> </tr><br /></table><br /><table border="0" cellpadding="0" cellspacing="0" class="cheque"><br /> <table ><br /> <tr><br /> <td height="1.30cm"></td><br /> </tr><br /> <tr><br /> <td width="1.50cm" height="0.80cm"><td>BENEFICIARIO DEL CHEQUE DE PRUEBA</td></td><br /> </tr><br /> </table><br /> <table ><br /> <tr><br /> <td width="1.80cm" height="0.75cm"><td>DOS MIL QUINIENTOS CINCUENTA CON 75/100</td></td><br /> </tr><br /> <tr><td height="0.60cm"></td></tr><br /> </table><br /> <table ><br /> <tr><br /> <td width="1.00cm" height="0.90cm"></td><td width="6.00cm">MARACAIBO, 09 DE ABRIL</td><td width="0.50cm">2010</td><br /> </tr><br /> </table><br /><br /></table><br /><br /></body><br /></html><br /></code></span></td></tr></tbody></table><br />Esto es sólo un ejemplo, pero en la práctica debe crearse un HTML dinámico que cambie los valores para monto, beneficiario, y los demás datos que el cheque necesita.<br /><br />El archivo anterior HTML, se debe llamar cheque.html y debe estar en una ruta especificada por la clase ReporteApplet. En este caso estamos pasando como ruta del archivo applets/cheque.html y debe estar en la carpeta del servidor:<br /><br />Aquí esta este detalle de la clase ReporteApplet que indica esto que acabo de mencionar:<br /><table width="100%" bgcolor="#e0e0e0"><tbody><tr><td><br /><span style="font-family:courier new;"><pre><br />//if ipServer == 127.0.0.1 invocar a localhost<br />//else invocar 192.168.0.91<br /> if(ipServer != "192.168.0.91" && <br /> ipServer != null && <br /> ipServer.trim() != ""){<br /> this.initialURL = new URL<br /> ("http://localhost/rutaProyecto/"+<br /> rutaArchivoHtml);<br /> }else{<br /> this.initialURL = new URL<br /> ("http://192.168.0.91/rutaProyecto/"+<br /> rutaArchivoHtml);<br /> }<br /></pre></span></td></tr></tbody></table><br /><br /><br />Bueno, espero que este código les sirva de modelo para impresión de cheques o cualquier reporte donde deban imprimir mediante ciertos atributos de impresión. Hasta la Próxima.Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com1tag:blogger.com,1999:blog-7189135837700621853.post-84210486235791066562010-04-16T10:48:00.000-07:002010-10-07T10:33:30.841-07:00(Paréntesis) Compartiendo ideas y experiencias...Saludos de nuevo.<br /><br />Ahora, voy a compartir una experiencia que tuve en mi trabajo de la cual, como todas las experiencias, fue muy enriquecedora. En mi trabajo no tengo la oportunidad de trabajar mucho en Java, debido a que allí utilizamos <a href="http://php.net/">php</a> como lenguaje para resolver un Sistema Administrativo para que se adapte a las necesidades de nuestro Instituto <a href="http://www.inzit.gob.ve/">INZIT</a>. Por lo tanto en mis ratos libres aprendo un poco más sobre Java, ya que me considero amante a este tecnología.<br /><br />Hace poco teníamos una duda acerca de cómo debíamos imprimir un reporte, de hecho era como imprimir el cheque, por experiencia pasada sabíamos que un PDF no era buena idea ya que la <a href="http://es.wikipedia.org/wiki/Impresora#Tinta_s.C3.B3lida_.28Solid_Ink.29">impresora de matriz de punto</a> que se utiliza para este fin no generaba buenas impresiones PDF en ninguna fuente y también por experiencias pasadas sabíamos que la solución para este tipo de impresora era un archivo <a href="http://es.wikipedia.org/wiki/HTML">HTML</a> en pantalla o texto plano (txt).<br /><br />Pero había una restricción más para nuestro requerimiento de sistema y era que el cheque debe imprimirse una vez, y por lo tanto debe asegurarse que el cheque sea impreso en la forma adecuada.<br /><br />La primera investigación que hicimos fue que <a href="http://es.wikipedia.org/wiki/JavaScript">JavaScript</a> tiene la funcion <span style="font-family:courier new;">window.print()</span> que imprime el contenido en la ventana y también <span style="font-family: courier new;">document.print()</span> que puedo adaptarlo a que me imprima una sección de la página (como un DIV de HTML, por ejemplo). Ahora bien, las restricciones que vimos es que no había manera de determinar si el usuario presionaba click en "Imprimir" o "Cancelar" y por lo tanto no garantizaba que se realizara la impresión y de ser así para el sistema puede que ya se había impreso o cambiado el estado del cheque (y de otras tablas relacionadas más) por más que el usuario haga click en cancelar.<br /><br />Al no gustarnos esta solución fuimos buscando otras alternativas, de allí surgió la idea, ¿Podríamos utilizar un <a href="http://java.sun.com/applets/">applet de Java</a>? Bueno, la idea era buena, que tal si por java podríamos capturar si se manda a imprimir satisfactoriamente o no y de allí cambiar los todas las tablas y los estados de nuestra base de datos para garantizar de que en verdad se mandó a imprimir y por la impresora correcta.<br /><br />Bueno, la duda surgió un viernes y se esperó el fin de semana. Al otro lunes ya teníamos la solución en verdad el Applet lo puede hacer, de hecho, puedo capturar un archivo HTML, cargarlo en un <a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JEditorPane.html">JEditorPane</a> mostrar el cuadro de diálogo imprimir y verificar si el presionó sobre Imprimir o Cancelar.<br /><br />Total empezamos a desarrollarlo y a cuadrarlo con las dimensiones de los distintos formatos de cheques que tiene la nuestra empresa. Y en tres días pudimos hacer que nuestra aplicación PHP generara un archivo HTML en disco duro servidor, conectar en Applet con este archivo a través de un URL, mostrarlo en el JEditorPane y mandarlo a imprimir cuadrando con las dimesiones de todos los cheques. Eureka estaba listo!.<br /><br />Bueno, pero no todo fue color de rosa.<br /><br />Si por una parte podíamos hacer que se visualizara el HTML en el JEditorPane, este editor de Java no soportaba las sentencias más recientes de CSS como posicionado absoluto, muy importante para darle una ubicación exacta y no relativa, por lo tanto, cuadrarlo dio mucho trabajo.<br /><br />Pero después de tenerlo hecho se nos presentó una idea nueva, nuestro jefe por experiencia en desarrollo de Sistemas Administrativos dijo que si era posible imprimir más de una vez el cheque si éste a pesar que se mandó a imprimir en forma satisfactoria, en realidad se mandó a imprimir en otra impresora que no era la de matriz de punto, esto trajo una variable nueva a nuestro sistema, ya no era necesario detectar si se daba click en Imprimir en cancelar, después de todo los datos del cheque ya estaban generado y se podía imprimir de nuevo si así el usuario lo necesitaba, así lo que que hicimos fue que siempre se iba a imprimir el cheque por PHP y JavaScript, pero sólo se imprimía de nuevo el cheque con una autorización del Jefe del Departamento Administrativo.<br /><br />Bueno total, me quedé con el código Java, con la clase Applet que permite capturar un archivo HTML, presentarlo en pantalla a través de un JEditorPane y poder imprimir, inclusive configurando desde códigos las configuración de impresión como márgenes y otros.<br /><br />En el próximo post explicaré con detalle el código que pude desarrollar a ver si a cualquiera de ustedes les sirve. Por ahora, lo más importante que quiero compartir es que cuando se tenga una idea de software de cómo desarrollar cierta aplicación hay que ver y discutir todas las opciones, es decir, después de recaudar los requerimientos de sistema, ver qué se debe desarrollar: ver las ventajas, desventajas de cada opción y sobretodo no programar "linealmente" cómo fue solicitado, ya que de seguro vendrán cambios en la aplicación mas adelante, el reto, para nosotros los desarrolladores es detectar los elementos claves del sistema y desarrollar en base a esto y después que el usuario quiera un cambio, este no debe afectar al desarrollo normal del sistema, lo que significa que si la lógica del negocio no cambia, el cambio debe ser adaptable en poco tiempo, ya que los elementos raíces se mantienen.<br /><br />No intento relatar una idea nueva, esta idea ya ha sido expuesta en varias metodologías de desarrollo de software, sólo intento compartir una experiencia que me sucedió y que todavía estoy procesando, creo que la programación va más allá de resolverle a un usuario, la programación es detectar la lógica del negocio, para que éste mismo sistema pueda funcionar en distintos ambientes, empresas, negocios y usuarios, por ello nuestra labor será trascendente cuando nuestro trabajo lo sea y pueda resolver y adecuarse a las distintas pruebas.<br /><br />Espero que esta idea les sea de utilidad y empecemos a detectar que necesita el hombre de nuestros días y a partir de ellas crear ideas... ¡Hasta la próxima!<br /><br />Para ver la segunda parte de este artículo haga click aquí:<br /><a href = "http://acercadejava.blogspot.com/2010/04/parentesis-ii-parte-compartiendo-el.html">Paréntesis. II Parte. Compartiendo Código Applet</a>Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com0tag:blogger.com,1999:blog-7189135837700621853.post-29121209663323440552010-03-31T21:26:00.000-07:002010-10-07T10:33:00.812-07:00Novedades en el paquete javax.swing de java SE 6Hola a todos de nuevo, es un placer para mí estar aquí de nuevo compartiendo acerca de las novedades que trae java 6. Ahora le toca el turno al paquete javax.swing.<br /><br />Observando las clases directamente de la página de Sun Microsystem, tanto del <a href="http://java.sun.com/j2se/1.5.0/docs/api/">JAVA SE 5</a> como del <a href="http://java.sun.com/javase/6/docs/api/">JAVA SE 6</a>, puede verse que en este último fueron agregadas las siguientes clases:<br /><br />DefaultRowSorter<br />DefaultRowSorter.Model<br />DefaultRowSorter.Wrapper<br /><br />GroupLayout<br /><br />JList.DropLocation<br />JTable.DropLocation<br />JTree.DropLocation<br /><br />LayoutStyle<br /><br />RowFilter<br />RowFilter.Entry<br />RowSorter<br />RowSorter.SortKey<br /><br />SwingWorker<br /><br />Para este artículo se explicará los fundamentos básicos para realizar interfaces gráficas con GroupLayout. Sin mas que esperar, empecemos:<br /><br />Este administrador de disposición trabaja con eje vertical y horizontal separadamente. Cuando se ha definido la colocación de los componentes en uno de los ejes ya está la mitad del problema resuelto, se pasa luego a definir la colocación del mismo componente en el otro eje, si, esto quiere decir que cada componente debe estar presente tanto en el eje vertical como en el horizontal de no ser así el GroupLayout lanza una exception.<br /><br />Este administrador de esquema puede organizar los componentes o secciones en forma secuencial o paralela: Secuencial significa uno al lado para el eje horizontal y uno arriba del otro para el vertical.<br /><br />El paralelo significa colocar en una misma línea (vertical u horizontal) los elementos que necesite. Tanto si utiliza Secuencial como Paralelo se pueden agregar a ellos tanto componentes como nuevos grupos.<br /><br />Veamos un ejemplo para aclarar las dudas que se hayan ir podido planteando hasta ahora:<br /><br />Supongamos que queremos crear la siguiente interfaz gráfica:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHQHYusfMHZXtlsgHNx_AYu5V-ZzSTwoXzfNKEA9DmDigplpv96xypa0uw3_CE0NfA4ssBRCCPRUMvhPC0sJVQWWUQuyoYFC8D7QWX3YiJfNk9tWDv951x4ER9X43w5i6t4Rew9GfbrH4/s1600/interfazGroupLayout.jpg"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 128px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHQHYusfMHZXtlsgHNx_AYu5V-ZzSTwoXzfNKEA9DmDigplpv96xypa0uw3_CE0NfA4ssBRCCPRUMvhPC0sJVQWWUQuyoYFC8D7QWX3YiJfNk9tWDv951x4ER9X43w5i6t4Rew9GfbrH4/s320/interfazGroupLayout.jpg" alt="" id="BLOGGER_PHOTO_ID_5455053229509251922" border="1" /></a><br /><br />Espero explicarme con estas dos imágenes a continuación; primero veamos la distribución horizontal:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCW5xMuja40A2RTm2B7OkY9eZxpDNzjt4VbCmGYutYGlvUYHPG8WAYVznofEazdYmdGV6nFqWnqKsg3_XCoB-vQcuBJtcmKKZPc8O9WhAZKNqeFegQn1NfAaaX0CTUrLZ2zHx43O-COQQ/s1600/hor1.jpg"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 183px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCW5xMuja40A2RTm2B7OkY9eZxpDNzjt4VbCmGYutYGlvUYHPG8WAYVznofEazdYmdGV6nFqWnqKsg3_XCoB-vQcuBJtcmKKZPc8O9WhAZKNqeFegQn1NfAaaX0CTUrLZ2zHx43O-COQQ/s320/hor1.jpg" alt="" id="BLOGGER_PHOTO_ID_5455058138908971698" border="1" /></a><br /><br />Las líneas oscuras (negras) superiores reflejan la distribución mas externa de ese panel, como puede verse existe una disposición secuencial, de izquierda a derecha, por lo tanto si creamos primero en GroupLayout myLayout, lo primero que debemos hacer es definir esta distribución, de la siguiente manera:<br /><br /><table bgcolor="#e0e0e0" width = '100%'><tbody><tr><td><br /><span style="font-family: courier new;">myLayout.setHorizontalGroup( myLayout.createSequentialGroup());</span><br /></td></tr></table><br /><br />Luego, se va definiendo o agregando el código de las secciones mas internas, por ejemplo, la primera sección contiene una distribución paralela de dos componentes, primero codificamos la sección paralela:<br /><br /><table bgcolor="#e0e0e0" width = '100%'><tbody><tr><td><br /><span style="font-family: courier new;">myLayout.setHorizontalGroup( myLayout.createSequentialGroup()<br /> .addGroup( myLayout.createParallelGroup())<br />);</span><br /></td></tr></table><br /><br />Luego los componentes:<br /><br /><table bgcolor="#e0e0e0" width = '100%'><tbody><tr><td><br /><span style="font-family: courier new;">myLayout.setHorizontalGroup( myLayout.createSequentialGroup()<br /> .addGroup( myLayout.createParallelGroup()<br /> .addComponent(lblNombre)<br /> .addComponent(lblEmail)<br />)<br />);</span><br /></td></tr></table><br /><br />Como hemos dicho, cada sección puede contener tanto componentes como nuevos grupos, esto quiere decir que pueden haber grupos anidados, es decir, grupos dentro de otros grupos.<br />Un ejemplo de esto es cuando queremos colocar los JCheckBox. La sección horizontal media contiene un nuevo grupo, tal como lo muestra el código que sigue:<br /><br /><br /><table bgcolor="#e0e0e0" width = '100%'><tbody><tr><td><br /><span style="font-family: courier new;">.addGroup(myLayout.createParallelGroup()<br /> .addComponent(txtNombre)<br /> .addComponent(txtEmail)<br /> .addGroup(myLayout.createSequentialGroup()<br /> .addGroup(myLayout.createParallelGroup()<br /> .addComponent(chkActualizacion)<br />//etc... mas adelante está el código completo esto es sólo para explicación<br />)<br />);</span><br /></td></tr></table><br /><br />Pasemos ahora a definir nuestra distribución vertical:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK4dw12bjFpwx5T89n8lDOHfC3ak2nSc-FVVWaBlRQQ4Wqiyu9g-d99BnyiONLIyWyk3d8lG5Yc-_piMmp5S8cADLqdLQglj8A0mkAgosHZJwwlhww0GGPKom37nF6xOtvmACSRfRR14w/s1600/vert1.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 131px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK4dw12bjFpwx5T89n8lDOHfC3ak2nSc-FVVWaBlRQQ4Wqiyu9g-d99BnyiONLIyWyk3d8lG5Yc-_piMmp5S8cADLqdLQglj8A0mkAgosHZJwwlhww0GGPKom37nF6xOtvmACSRfRR14w/s320/vert1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5455074486069963538" /></a><br /><br />En este caso puede verse también una distribución secuencial (de arriba hasta abajo) y en este caso un poco más sencillo debido a que cada sección contiene directamente los componentes, es decir, no hay subdivisiones o grupos anidados. <br /><br />El código fuente final de el GroupLayoutExample queda de la siguiente manera:<br /><br /><div class="java5" style = 'width: 400px'><div class="head">GeSHi © 2004-2007 Nigel McNie, 2007-2009 Benny Baumann, 2008-2009 Milian Wolff</div><ol style ='width: 1000px;'><li class="li1"><div class="de1"><span class="kw2">package</span> <span class="co2">ejemploblog</span><span class="sy0">;</span></div></li><br /><li class="li1"><div class="de1"> </div></li><br /><li class="li1"><div class="de1"><span class="kw2">import</span> <span class="co2">javax.swing.*</span><span class="sy0">;</span></div></li><br /><li class="li1"><div class="de1"> </div></li><br /><li class="li1"><div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> GroupLayoutExample <span class="kw2">extends</span> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JPanel.html"><span class="kw105">JPanel</span></a><span class="br0">{</span></div></li><li class="li1"><div class="de1"> </div></li><li class="li1"><div class="de1"> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JLabel.html"><span class="kw105">JLabel</span></a> lblNombre = <span class="kw2">new</span> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JLabel.html"><span class="kw105">JLabel</span></a><span class="br0">(</span><span class="st0">"Nombre: "</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JLabel.html"><span class="kw105">JLabel</span></a> lblEmail = <span class="kw2">new</span> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JLabel.html"><span class="kw105">JLabel</span></a><span class="br0">(</span><span class="st0">"email: "</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JTextField.html"><span class="kw105">JTextField</span></a> txtNombre = <span class="kw2">new</span> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JTextField.html"><span class="kw105">JTextField</span></a><span class="br0">(</span><span class="nu0">20</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JTextField.html"><span class="kw105">JTextField</span></a> txtEmail = <span class="kw2">new</span> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JTextField.html"><span class="kw105">JTextField</span></a><span class="br0">(</span><span class="nu0">20</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JCheckBox.html"><span class="kw105">JCheckBox</span></a> chkActualizacion = <span class="kw2">new</span> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JCheckBox.html"><span class="kw105">JCheckBox</span></a><span class="br0">(</span><span class="st0">"Actualizaciones"</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JCheckBox.html"><span class="kw105">JCheckBox</span></a> chkComentarios = <span class="kw2">new</span> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JCheckBox.html"><span class="kw105">JCheckBox</span></a><span class="br0">(</span><span class="st0">"Comentarios"</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JCheckBox.html"><span class="kw105">JCheckBox</span></a> chkCodigo = <span class="kw2">new</span> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JCheckBox.html"><span class="kw105">JCheckBox</span></a><span class="br0">(</span><span class="st0">"Codigo Fuente"</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JCheckBox.html"><span class="kw105">JCheckBox</span></a> chkInfo = <span class="kw2">new</span> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JCheckBox.html"><span class="kw105">JCheckBox</span></a><span class="br0">(</span><span class="st0">"Informacion"</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JButton.html"><span class="kw105">JButton</span></a> btnAceptar = <span class="kw2">new</span> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JButton.html"><span class="kw105">JButton</span></a><span class="br0">(</span><span class="st0">"Aceptar"</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JButton.html"><span class="kw105">JButton</span></a> btnOmitir = <span class="kw2">new</span> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JButton.html"><span class="kw105">JButton</span></a><span class="br0">(</span><span class="st0">"Omitir"</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <span class="kw2">public</span> GroupLayoutExample<span class="br0">(</span><span class="br0">)</span><span class="br0">{</span></div></li><li class="li1"><div class="de1"> GroupLayout myLayout = <span class="kw2">new</span> GroupLayout<span class="br0">(</span><span class="kw2">this</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> setLayout<span class="br0">(</span>myLayout<span class="br0">)</span><span class="sy0">;</span></div></li><br /><li class="li1"><div class="de1"> <span class="co1">//Crear espacio entre componentes</span></div></li><li class="li1"><div class="de1"> myLayout.<span class="me1">setAutoCreateGaps</span><span class="br0">(</span><span class="kw4">true</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <span class="co1">//Crear espacio entre componente contenedor</span></div></li><li class="li1"><div class="de1"> myLayout.<span class="me1">setAutoCreateContainerGaps</span><span class="br0">(</span><span class="kw4">true</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> </div></li><li class="li1"><div class="de1"> myLayout.<span class="me1">setHorizontalGroup</span><span class="br0">(</span> myLayout.<span class="me1">createSequentialGroup</span><span class="br0">(</span><span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addGroup</span><span class="br0">(</span>myLayout.<span class="me1">createParallelGroup</span><span class="br0">(</span><span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addComponent</span><span class="br0">(</span>lblNombre<span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addComponent</span><span class="br0">(</span>lblEmail<span class="br0">)</span></div></li><li class="li1"><div class="de1"> <span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addGroup</span><span class="br0">(</span>myLayout.<span class="me1">createParallelGroup</span><span class="br0">(</span><span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addComponent</span><span class="br0">(</span>txtNombre<span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addComponent</span><span class="br0">(</span>txtEmail<span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addGroup</span><span class="br0">(</span>myLayout.<span class="me1">createSequentialGroup</span><span class="br0">(</span><span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addGroup</span><span class="br0">(</span>myLayout.<span class="me1">createParallelGroup</span><span class="br0">(</span><span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addComponent</span><span class="br0">(</span>chkActualizacion<span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addComponent</span><span class="br0">(</span>chkComentarios<span class="br0">)</span></div></li><li class="li1"><div class="de1"> <span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addGroup</span><span class="br0">(</span>myLayout.<span class="me1">createParallelGroup</span><span class="br0">(</span><span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addComponent</span><span class="br0">(</span>chkCodigo<span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addComponent</span><span class="br0">(</span>chkInfo<span class="br0">)</span></div></li><li class="li1"><div class="de1"> <span class="br0">)</span></div></li><li class="li1"><div class="de1"> <span class="br0">)</span></div></li><li class="li1"><div class="de1"> <span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addGroup</span><span class="br0">(</span>myLayout.<span class="me1">createParallelGroup</span><span class="br0">(</span><span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addComponent</span><span class="br0">(</span>btnAceptar<span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addComponent</span><span class="br0">(</span>btnOmitir<span class="br0">)</span></div></li><li class="li1"><div class="de1"> <span class="br0">)</span></div></li><br /><li class="li1"><div class="de1"> <span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> myLayout.<span class="me1">setVerticalGroup</span><span class="br0">(</span>myLayout.<span class="me1">createSequentialGroup</span><span class="br0">(</span><span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addGroup</span><span class="br0">(</span>myLayout.<span class="me1">createParallelGroup</span><span class="br0">(</span><span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addComponent</span><span class="br0">(</span>lblNombre<span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addComponent</span><span class="br0">(</span>txtNombre<span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addComponent</span><span class="br0">(</span>btnAceptar<span class="br0">)</span></div></li><li class="li1"><div class="de1"> <span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addGroup</span><span class="br0">(</span>myLayout.<span class="me1">createParallelGroup</span><span class="br0">(</span><span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addComponent</span><span class="br0">(</span>lblEmail<span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addComponent</span><span class="br0">(</span>txtEmail<span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addComponent</span><span class="br0">(</span>btnOmitir<span class="br0">)</span></div></li><li class="li1"><div class="de1"> <span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addGroup</span><span class="br0">(</span>myLayout.<span class="me1">createParallelGroup</span><span class="br0">(</span><span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addComponent</span><span class="br0">(</span>chkActualizacion<span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addComponent</span><span class="br0">(</span>chkCodigo<span class="br0">)</span></div></li><li class="li1"><div class="de1"> <span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addGroup</span><span class="br0">(</span>myLayout.<span class="me1">createParallelGroup</span><span class="br0">(</span><span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addComponent</span><span class="br0">(</span>chkComentarios<span class="br0">)</span></div></li><li class="li1"><div class="de1"> .<span class="me1">addComponent</span><span class="br0">(</span>chkInfo<span class="br0">)</span></div></li><li class="li1"><div class="de1"> <span class="br0">)</span></div></li><li class="li1"><div class="de1"> <span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <span class="br0">}</span> </div></li><br /><li class="li1"><div class="de1"><span class="br0">}</span></div></li><br /><li class="li1"><div class="de1"> </div></li><br /></ol><div class="foot">Parsed in 0.176 seconds at 12.76 KB/s</div></div><br /><br />Para crear la clase ejecutable (main), sería:<br /><br /><div class="java5" style = 'width: 400px'><div class="head">GeSHi © 2004-2007 Nigel McNie, 2007-2009 Benny Baumann, 2008-2009 Milian Wolff</div><ol style ='width: 1000px;'><li class="li1"><div class="de1"><span class="kw2">package</span> <span class="co2">ejemploblog</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> </div></li><li class="li1"><div class="de1"><span class="kw2">import</span> <span class="co2">java.awt.BorderLayout</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> </div></li><br /><li class="li1"><div class="de1"><span class="kw2">import</span> <span class="co2">javax.swing.JFrame</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> </div></li><li class="li1"><div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> Aplicacion <span class="br0">{</span></div></li><li class="li1"><div class="de1"> </div></li><li class="li1"><div class="de1"> </div></li><li class="li1"><div class="de1"> <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw3">void</span> main<span class="br0">(</span><a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/String.html"><span class="kw21">String</span></a><span class="br0">[</span><span class="br0">]</span> args<span class="br0">)</span> <span class="br0">{</span></div></li><li class="li1"><div class="de1"> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JFrame.html"><span class="kw105">JFrame</span></a> marco = <span class="kw2">new</span> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JFrame.html"><span class="kw105">JFrame</span></a><span class="br0">(</span><span class="st0">"Suscripcion Acerca de Java"</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> marco.<span class="me1">setDefaultCloseOperation</span><span class="br0">(</span><a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/JFrame.html"><span class="kw105">JFrame</span></a>.<span class="me1">EXIT_ON_CLOSE</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> marco.<span class="me1">getContentPane</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">add</span><span class="br0">(</span><span class="kw2">new</span> GroupLayoutExample<span class="br0">(</span><span class="br0">)</span>, <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/awt/BorderLayout.html"><span class="kw6">BorderLayout</span></a>.<span class="me1">CENTER</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> marco.<span class="me1">pack</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> marco.<span class="me1">setVisible</span><span class="br0">(</span><span class="kw4">true</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> </div></li><li class="li1"><div class="de1"> <span class="br0">}</span></div></li><li class="li1"><div class="de1"><span class="br0">}</span></div></li><br /></ol><div class="foot">Parsed in 0.109 seconds at 3.64 KB/s</div></div><br /><br />Bueno, esto es todo por ahora, espero haberme explicado en este artículo, si quieren un Tutorial completo (en inglés) sobre GroupLayout, busca en esta dirección:<br /><br /><a href = 'http://java.sun.com/docs/books/tutorial/uiswing/layout/group.html'>How to Use GroupLayout</a><br /><br />Donde hay inclusive otro ejemplo.<br /><br />Hasta la próxima!Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com0tag:blogger.com,1999:blog-7189135837700621853.post-74890234931347268282010-03-19T20:44:00.000-07:002010-10-07T10:32:07.911-07:00Java 6. Derby, la base de datos incluida en jdk 6 Saludos compañeros y gracias por estar de nuevo aquí aprendiendo juntos un poco más sobre lo que es la tecnología Java en su última version de Java SE 6.<br /><br /> Ahora le toca el turno a Derby: Base de datos relacional y transaccional que viene incluido por defecto en el JDK 6.0, más específicamente lo puede encontrar en la ruta de java. En windows: C:\Archivos de Programa\Java\jdk1.6.0\db, o en general en la carpera db donde se encuentra la instalación de java SE 6.<br /><br /> Para hablar un poco de dónde viene Derby, esta se inicia como CloudSpace: una base de datos relacional creada por <a href="http://es.wikipedia.org/wiki/Informix">Informix</a>, compañía que fue adquirida en 2001 por IBM. en 2004 IBM decide convertir a CloudSpace en software libre cambiando su nombre a Derby.<br />La página principal de Derby es: <a href="http://db.apache.org/derby/">http://db.apache.org/derby/</a>.<br /><br /> Las ventajas que promete Derby son sus mínimas necesidades de configuración y administración y el pequeño espacio que ocupa en disco. Otra ventaja es que Derby soporta el almacenamiento de una base de datos archivada en un archivo JAR, lo que lo hace fácil de incluirlo y distribuirlo en nuestra aplicación.<br /><br /> Visto esto, empecemos a ver cómo incluir esta base de datos en nuestra aplicación Java.<br /><br /> Objetando un poco: Aunque se dice que Derby viene incluido con el JDK 6.0, en las últimas instalaciones que he realizado no ha sido instalado por defecto, por lo tanto lo descargué directamente de <a href="http://www.ibiblio.org/pub/mirrors/apache/db/derby/db-derby-10.5.3.0/db-derby-10.5.3.0-bin.zip">db-derby-10.5.3.0-bin.zip</a>.<br /><br /> Una vez descargado se descomprime en la carpeta que se desee (supongamos C:\derby). Ahora se agrega al PATH (variable de entorno) la ruta interna bin (es decir C:\derby\bin). En esta carpeta se encuentran dos archivos esenciales: <span style="font-family:courier new;">ij.bat</span> y <span style="font-family:courier new;">startNetworkServer.bat</span>. Abrimos una consola y ejecutamos primero el startNetworkServer.bat (en la ruta C:\derby\bin) con esto se levantará el servidor de base de datos Derby.<br /><br /> Una vez hecho esto hay que dirigirse en una consola nueva a la carpeta de nuestro proyecto (preferiblemente) para crear nuestra base de datos nueva.<br />Una vez ubicado en la ruta de nuestro proyecto java se escribe ij.bat, se iniciará la aplicación ij que es la herramienta para conectarse, crear y manipular base de datos Derby.<br /><span style="font-style: italic;">NOTA IMPORTANTE: </span>La creación de una base de datos Derby agrega una carpeta con el nombre de la base de datos al sistema en la ruta donde fue ejecutada la aplicación <span style="font-family:courier new;">ij</span>, por ello es recomendable dirigirse a la carpeta donde se encuentra nuestro proyecto y ejecutar allí esta herramienta.<br /><br /><table bgcolor="#e0e0e0"><tbody><tr><td><br />C:\RutaProyecto\ij.bat<br />Version ij 10.5<br />ij><br /></td></tr></tbody></table><br /><br /> Ahora a la linea ij> se debe agregar algo como:<br /><table bgcolor="#e0e0e0"><tbody><tr><td><br />ij> connect 'jdbc:derby:NombreBD;create=true';<br /></td></tr></tbody></table><br /><br /><br /><span style="font-style:italic;">NOTA:</span> No olvide colocar el punto y coma al final de cada sentencia derby, ya que esto indica que finaliza la misma, si no lo hace no se ejecuta la sentencia escrita.<br /><br /> Con esto se crea una base de datos Derby de nombre NombreBD en la ruta donde se ejecutó el ij.bat. Podemos ahora crear una tabla, insertar registros y seleccionarlos:<br /><br /><table bgcolor="#e0e0e0"><tbody><tr><td><br />ij> CREATE TABLE persona(id integer, nombre varchar(15), apellido varchar(15), edad integer);<br />0 filas insertadas/actualizadas/suprimidas<br />ij>INSERT INTO persona VALUES(1, 'Rafael', 'Romero', 31),(2, 'Orlando', 'Gracia', 42),(3, 'Yessica', 'Alba', 35);<br />3 filas insertadas/actualizadas/suprimidas<br />ij> SELECT * FROM persona;<br />//Se muestran los datos ingresados<br />3 filas seleccionadas<br /></td></tr></tbody></table><br /><br /> Por defecto la ejecución automática está activada (autocommit ON), se puede controlar escribiendo en ij> autocommit ON; o autocommit OFF;<br /><br /> Para salir de la herramienta ij se escribe exit;<br /><br /> Una vez visto esto veamos como podemos enlazar esta base de datos a nuestra aplicación.<br /><div class="java5" style = 'width: 400px'><ol style ='width: 900px;'><li class="li1"><div class="de1"><span class="kw2">import</span> <span class="co2">java.sql.*</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> </div></li><li class="li1"><div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> Derbiando <span class="br0">{</span></div></li><li class="li1"><div class="de1"> </div></li><li class="li1"><div class="de1"> <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw3">void</span> main<span class="br0">(</span><a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/String.html"><span class="kw21">String</span></a><span class="br0">[</span><span class="br0">]</span> args<span class="br0">)</span> <span class="br0">{</span></div></li><li class="li1"><div class="de1"> Derbiando dbDerby = <span class="kw2">new</span> Derbiando<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> dbDerby.<span class="me1">mostrarDatos</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <span class="br0">}</span></div></li><li class="li1"><div class="de1"> </div></li><li class="li1"><div class="de1"> <span class="kw2">public</span> <span class="kw3">void</span> mostrarDatos<span class="br0">(</span><span class="br0">)</span><span class="br0">{</span></div></li><li class="li1"><div class="de1"> <span class="kw2">try</span><span class="br0">{</span></div></li><li class="li1"><div class="de1"> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/String.html"><span class="kw21">String</span></a> driver = <span class="st0">"org.apache.derby.jdbc.EmbeddedDriver"</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/Class.html"><span class="kw21">Class</span></a>.<span class="me1">forName</span><span class="br0">(</span>driver<span class="br0">)</span>.<span class="me1">newInstance</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/sql/Connection.html"><span class="kw44">Connection</span></a> conn = <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/sql/DriverManager.html"><span class="kw44">DriverManager</span></a>.<span class="me1">getConnection</span><span class="br0">(</span><span class="st0">"jdbc:derby:C:<span class="es0">\\</span>RutaProyecto<span class="es0">\\</span><span class="es0"></span>NombreBD"</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <a href="http://www.google.com/search?sitesearch=java.sun.com&q=allinurl%3Aj2se%2F1+5+0%2Fdocs%2Fapi+Statement"><span class="kw166">Statement</span></a> s = conn.<span class="me1">createStatement</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/sql/ResultSet.html"><span class="kw44">ResultSet</span></a> rs = s.<span class="me1">executeQuery</span><span class="br0">(</span><span class="st0">"SELECT * FROM persona"</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <span class="kw1">while</span><span class="br0">(</span>rs.<span class="me1">next</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="br0">{</span></div></li><li class="li1"><div class="de1"> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/System.html"><span class="kw21">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">(</span><span class="st0">"id: "</span>+rs.<span class="me1">getInt</span><span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/System.html"><span class="kw21">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">(</span><span class="st0">"nombre: "</span>+rs.<span class="me1">getString</span><span class="br0">(</span><span class="nu0">2</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/System.html"><span class="kw21">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">(</span><span class="st0">"apellido: "</span>+rs.<span class="me1">getString</span><span class="br0">(</span><span class="nu0">3</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/System.html"><span class="kw21">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">(</span><span class="st0">"edad: "</span>+rs.<span class="me1">getInt</span><span class="br0">(</span><span class="nu0">4</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/System.html"><span class="kw21">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <span class="br0">}</span></div></li><li class="li1"><div class="de1"> rs.<span class="me1">close</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> s.<span class="me1">close</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> conn.<span class="me1">close</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <span class="br0">}</span><span class="kw2">catch</span> <span class="br0">(</span><a href="http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/Exception.html"><span class="kw21">Exception</span></a> e<span class="br0">)</span> <span class="br0">{</span></div></li><li class="li1"><div class="de1"> e.<span class="me1">printStackTrace</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"> <span class="br0">}</span><span class="kw2"></span><span class="br0"></span></div></li><li class="li1"><div class="de1"> </div></li><li class="li1"><div class="de1"> <span class="br0"></span></div></li><li class="li1"><div class="de1"> <span class="br0">}</span></div></li><li class="li1"><div class="de1"><span class="br0">}</span></div></li></ol></div><br /><br /><table bgcolor="#e0e0e0" width = '400px'><tbody><tr><td><br />Salida Generada:<br />id: 1<br />nombre: Rafael<br />apellido: Romero<br />edad: 31<br /><br />id: 2<br />nombre: Orlando<br />apellido: Gracia<br />edad: 42<br /><br />id: 3<br />nombre: Yessica<br />apellido: Alba<br />edad: 35<br /></td></tr></tbody></table>Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com2tag:blogger.com,1999:blog-7189135837700621853.post-64403599114268673382010-02-28T20:43:00.000-08:002010-10-07T10:31:40.590-07:00Java 6: Publicación de una clase como un Servicio Web Para este propósito encontré un artículo que habla claramente y paso a paso como construir un Servicio Web, es decir, como publicar nuestra clase java para que esté disponible en la web y poder ser utilizada por clientes en forma remota. <br /><br /> <a href = "http://java.sun.com/javase/6/docs/api/">Java 6.0</a> agregó el paquete javax.xml.ws junto a las anotaciones de javax.jws.<br /><br /> El artículo completamente en español y se deriva de la documentación Java, es decir no es lo mismo pero utiliza el mismo ejemplo de esta documentación. <br /><br /> Utilizamos lo que se llama JAX-WS que no es más que las siglas para Java API for XML Web Services. Este blog a que les hago referencia, detalla paso a paso como hacer una clase y marcarla como publicable, crear la clase publicadora, y como por consola realizar los pasos para publicar y utilizar la clase por un cliente.<br /><br /> El enlace es el blog de Willy Mejía (willyxoft) y el articulo es <a href = "http://willyxoft.wordpress.com/articulos/servicios_web_java_se/">Servicios Web con JAX-WS sin contenedores Java EE</a>.<br /><br /> Para un tutorial completo sobre Web Services de java visite <a href="http://java.sun.com/webservices/docs/2.0/tutorial/doc/">The Java Web Services Tutorial</a>. Espero haber ayudado. Además todavía hay mucho que investigar.<br /><br /> Por cierto todavía tengo una duda y es cómo importar una clase de Java en una clase que será publicada como servicio web. Las cosas se complican un poco más, pero lean el artículo, incluso allí en comentario está escrita mi duda. <br /><br />Nos vemosKelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com0tag:blogger.com,1999:blog-7189135837700621853.post-24475666479203671892010-01-30T21:48:00.000-08:002010-10-07T10:31:19.352-07:00Java 6: Conexión con los lenguajes de Script.<h6> Si desea ver una imagen en tamaño completo haga click en ella.</h6><br /> Con la versión más reciente de Java (J2SE 6) se hace posible combinar secciones de código Java con lenguajes de Script como JavaScript, PHP, Ruby y Phyton entre otros. Esto gracias al nuevo paquete javax.script.<br /> En nuestros ejemplos ejecutaremos ejemplos sólo combinando hasta ahora JavaScript y Java.<br /><br /> Para comenzar lo más importante es saber que se debe crear una instancia de ScriptEngineManager que me permitirá retornar un objeto ScriptEngine especificando el lenguaje con el que haré la conexión veamos esto con código:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1fIBUkU7-hJjV-NHarHPKJFNzBnXBsXlHWY5XOIR-MyoUFS9ZQnPjSR3aCSKFT9qLTd3peEZxdKJhDiI6DWKJxLTyVQzCKAYmYVqKp1vd_VXQJbjz_0XiIT8zR-AgWHXg06zCwggYJrw/s1600-h/Scriptando.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 188px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1fIBUkU7-hJjV-NHarHPKJFNzBnXBsXlHWY5XOIR-MyoUFS9ZQnPjSR3aCSKFT9qLTd3peEZxdKJhDiI6DWKJxLTyVQzCKAYmYVqKp1vd_VXQJbjz_0XiIT8zR-AgWHXg06zCwggYJrw/s320/Scriptando.png" border="1" alt=""id="BLOGGER_PHOTO_ID_5432778209586420098" /></a><br /><br />Como se puede ver, además de crear los objetos explicados anteriormente se utilizó el método eval de ScriptEngine para evaluar el código Script (lanza ScriptException), en este caso obtendríamos por consola, la frase: Hola Mundo, que se ha impreso desde código JavaScript combinado con Java.<br /><br /><span style="font-weight:bold;">Nota:</span> También podríamos enlazar con JavaScript con el método getEngineByExtension de ScriptEngineManager de la siguiente manera: factory.getEngineByExtension(“js”);<br /><br />Claro, este es el ejemplo más sencillo, veamos qué otras opciones tenemos.<br />Supongamos que tenemos un procedimiento que queremos invocar en varias ocasiones, no es necesario colocar todo el código de nuevo, podemos hacer una función JavaScript mediante el método eval y luego castear el objeto ScriptEngine en Invocable, para llamar a la función creada en el momento que lo deseemos.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8MGNmXveOofCzf9tB9XsJpYItPMZvGpgNrv9FXL5rSS6O7uWFpj1-ZxVjSEeGWuLBIdJrNRq0Uu0Z5fE5mG_av3SZB0YXCd-dOHv7-CPI-dfdFv-5ebWQ19mx-9JipSgQhCFDeks51z4/s1600-h/funcion2.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 249px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8MGNmXveOofCzf9tB9XsJpYItPMZvGpgNrv9FXL5rSS6O7uWFpj1-ZxVjSEeGWuLBIdJrNRq0Uu0Z5fE5mG_av3SZB0YXCd-dOHv7-CPI-dfdFv-5ebWQ19mx-9JipSgQhCFDeks51z4/s320/funcion2.png" border="1" alt=""id="BLOGGER_PHOTO_ID_5432778211592429074" /></a><br /><br /><span style="font-weight:bold;">Salide del Ejemplo:</span><br />Hola, como estas?<br />Saludando de nuevo...<br />Hola, como estas?<br />Se invocó la función dos veces.<br /><br />También podemos acceder a objetos de java desde nuestro código Script, para ello se utilizan los objetos Binding que son un mapa (Map) de pares clave-valor con clave String y valores Object (Map<String, Object>), con esto puedo crear objetos y asignarlos a un String y mediante el código de Script realizar las operaciones que desee. Veamos el ejemplo:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI0tTXu2A81bGBX2J7oHLc4Ec3xH6pDPsnwad5QGt8d7T97lqTGu_vM7H_AXPzQP5L6tog2CARJrx9cAIk1VqIvMFHa_C3vC2KUzUbcqIigJPbfG32KBD9uits0DV_qwUzeC4JNof-H2s/s1600-h/vinculando.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 302px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI0tTXu2A81bGBX2J7oHLc4Ec3xH6pDPsnwad5QGt8d7T97lqTGu_vM7H_AXPzQP5L6tog2CARJrx9cAIk1VqIvMFHa_C3vC2KUzUbcqIigJPbfG32KBD9uits0DV_qwUzeC4JNof-H2s/s320/vinculando.png" border="1" alt=""id="BLOGGER_PHOTO_ID_5432778213751277586" /></a><br /><span style="font-weight:bold;"><br />Salida del ejemplo anterior:</span><br />Ambiente Script...<br />Java<br />C++<br />Phyton<br />Ambiente Java...<br />Java<br />C++<br />Phyton<br />Ruby<br /><br />Aunque también puedo pasarle parámetros reales en la invocación del método en invokeFunction() de la interface Invocable, veamos:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXEWA9YIUo5OR6yzhfOmEUf2KvRBPImD6y7GSdYW1p4nW5YQIezjM663a3xRoPfAjQrNFcK1xynrONabRT1aA6l4TlrYuL7XkjgR6_X_skn-vKYdSKzc31jVr1Uz0SNS79kbYXLUIakgU/s1600-h/pasandoValores.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXEWA9YIUo5OR6yzhfOmEUf2KvRBPImD6y7GSdYW1p4nW5YQIezjM663a3xRoPfAjQrNFcK1xynrONabRT1aA6l4TlrYuL7XkjgR6_X_skn-vKYdSKzc31jVr1Uz0SNS79kbYXLUIakgU/s320/pasandoValores.png" border="1" alt=""id="BLOGGER_PHOTO_ID_5432778224118826546" /></a><br /><br /><span style="font-weight:bold;">Salida del ejemplo anterior:</span><br />Primera Impresion...<br />Java<br />C++<br />Segunda Impresion...<br />Java<br />C++<br />Ruby<br /><br />Para terminar también es bueno saber que puedo utilizar objetos y métodos de java dentro de los scripts, para ello debo importar el paquete que desee y utilizarlo dentro del script, veamos ejemplo:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ4a6P14sblr4sQBfL-_zHsPo8HhmudbcCnfTOljbEOvJ8c0D1JPb1hlwxKlrl03Pow3B4QpGl4qWqZWBoeVv8RYoA6rkj5vS4wixoeWmU3q7tW86zbJnT0cfM2nE9so4LnMSX8PiQnb8/s1600-h/importando.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 191px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ4a6P14sblr4sQBfL-_zHsPo8HhmudbcCnfTOljbEOvJ8c0D1JPb1hlwxKlrl03Pow3B4QpGl4qWqZWBoeVv8RYoA6rkj5vS4wixoeWmU3q7tW86zbJnT0cfM2nE9so4LnMSX8PiQnb8/s320/importando.png" border="1" alt=""id="BLOGGER_PHOTO_ID_5432778228678405666" /></a><br /><br />Salida del ejemplo anterior, por consola un número aleatorio del 0 al 1.<br /><br />Para descargar un ejemplo completo de Scripting Java 6 haga click <a href="http://java.sun.com/developer/technicalArticles/J2SE/Desktop/scripting/DesktopScripting.zip">Aquí</a>Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com2tag:blogger.com,1999:blog-7189135837700621853.post-64194920478596594702010-01-30T18:14:00.001-08:002010-10-07T10:30:56.342-07:00Hablemos de las novedades de Java 6 Saludos de nuevo, es un placer para mí encontrarnos de nuevo en este año para compartir nuevas experiencias y conocimientos en el caso de la tecnología Java.<br /> Para empezar este año hablaremos sobre la nueva versión de Java 6 (J2SE 6) y algo de lo nuevo que ha incluido esta versión.<br /> Para comenzar nombremos algunas de ellas:<br /> • Conexión con lenguajes de Script como JavaScript, PHP, Ruby, Phyton, entre los que pude encontrar.<br /> • Exportar una clase como un Servicio Web.<br /> • Uso de Derby , herramienta que ofrece conectarse y manipular bases de datos Derby.<br /> • Hablaremos sobre algunas novedades del paquete javax.swing.<br /><br /> En fin, todo en lo que esté a mi alcance posible, para conocer las buenas nuevas que trae esta versión que está disponible ya, y que hasta esta fecha permanece como la versión más reciente.<br /><br /> Espero que esta información sirva de provecho y aclare dudas con respecto a las novedades de java 6. Feliz viaje.Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com0tag:blogger.com,1999:blog-7189135837700621853.post-44692244450274522682009-12-31T05:28:00.000-08:002009-12-31T06:15:55.981-08:00Feliz Año nuevo 2010Al culminar este año les agradezco que hayan compartido con nosotros nuestro primer año en línea de "Acerca de Java".<br /><br />Espero seguir compartiendo junto a ustedes siempre, esperando de sus comentarios y sugerencias para poder llevar un mejor servicio de estudio de la tecnología Java, con la bendición de Dios, la compañía de los ángeles y con todos ustedes lectores que son los principales protagonistas.<br /><br />Para el año entrante 2010 espero sigamos adelante, haciendo uso de nuevas alternativas para compartir las técnicas de programación, también de innovaciones de esta tecnología, enlaces a otras páginas webs y blogs que puedan aclararnos las ideas y compartir el conocimiento que nos lleve a crecer como personas y a mejorar las condiciones de vida del ser humano.<br /><br />Nos espera todavía mucho por recorrer, java es un lenguaje muy extenso y por eso hay tantos libros que lo abordan de distinta manera. Gracias a todos los que escriben por pasión al conocimiento, al libro de la WROX "Java JDK 6.0" (W. Clay Richardson y otros autores) de la cual he extraído algunas ideas para compartir, a DEITEL por su libro "Java, cómo programar" donde explican de forma clara, extensa y precisa la programación orientada a objetos en Java 1.4; por supuesto, también gracias al API de Java que es la guía de referencia de cualquier programador Java y por último a todos los blogs, foros y demás herramientas de internet que sirven para tener información de referencia y poder aclararla o extenderla. Es decir gracias a todos aquellos que directa o indirectamente aportan o hacen posible este servicio.<br /><br />Y además, gracias de nuevo a ustedes por su compañía y apoyo.<br /><br />¡Nos vemos en el 2010, Feliz Navidad y un 2010 lleno de amor y esperanza!<br /><br />Les desea su servidor Kelvin Atencio a través de www.acercadejava.blogspot.comKelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com0tag:blogger.com,1999:blog-7189135837700621853.post-85120808489701722752009-12-22T10:21:00.001-08:002010-10-07T10:29:47.546-07:00Tenemos 2 de Argumentos variables y otras 2 más...<span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">Nota:</span> </span><span style="font-weight: bold; font-style: italic;font-size:85%;" >Si no ve bien las imágenes del código puede dar click en ella y esta se mostrará más fielmente en una nueva pantalla.</span><span style="font-weight: bold;"><br /><br />1.- ¿Cuál es el resultado de compilar y ejecutar el siguiente código? </span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJmoeC55mlxZhOB07JGms1Zv6WDi6nBs15BI5tKRayimxpBtjIM8TWHfwA7AwFJvLnVSsDc2dBn2-A-ff3PQmGUhrM7VYfYMbixJCpLSKW-LBpcGQ7AeT-DOf3osUuvbVf_sUWgqXcP4Y/s1600-h/varArgs.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 201px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJmoeC55mlxZhOB07JGms1Zv6WDi6nBs15BI5tKRayimxpBtjIM8TWHfwA7AwFJvLnVSsDc2dBn2-A-ff3PQmGUhrM7VYfYMbixJCpLSKW-LBpcGQ7AeT-DOf3osUuvbVf_sUWgqXcP4Y/s320/varArgs.png" alt="" id="BLOGGER_PHOTO_ID_5418127543532972770" border="1" /></a><br />[A].- Error de compilación<br />[B].- Se imprime 1<br />[C].- Se imprime 2<br />[D].- Se imprime 3<br />[E].- Se imprime 4<br />[F].- Se lanza una excepción en ejecución<br /><br /><span style="font-weight: bold;">2.- ¿Cuál es el resultado al compilar y ejecutar este código?</span><br /><span style="font-weight: bold;"> Suponga que en ejecución se pasan los parámetros de la siguiente manera: </span><br /><span style="font-weight: bold;"> >java PruebaVarArgs2 arg1 arg2 arg3</span><br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzbJPMbFEb1g_1nVBbMceW6Prt61XS34JYyAZ3VTidGWtbjOhkOYhcZLTtcoyBsurlXpXRFH3w-6-VkVKmOfGakMzTWbAqrH9UpQBR79npUuI0W8e_yVebf2Fc2THyTKK9R73UaX8yLz8/s1600-h/varArgs2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 187px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzbJPMbFEb1g_1nVBbMceW6Prt61XS34JYyAZ3VTidGWtbjOhkOYhcZLTtcoyBsurlXpXRFH3w-6-VkVKmOfGakMzTWbAqrH9UpQBR79npUuI0W8e_yVebf2Fc2THyTKK9R73UaX8yLz8/s320/varArgs2.png" alt="" id="BLOGGER_PHOTO_ID_5418127549231233378" border="1" /></a><br />[A].- Se imprime "entro en arreglo"<br />[B].- Se imprime "entro en elipsis"<br />[C].- Se lanza IllegalArgumentException<br />[D].- Se lanza ArrayIndexOutOfBoundsException<br />[E].- El programa no puede compilar<br />[F].- Ninguna de las anteriores<br /><br /><span style="font-weight: bold;">3.- ¿Que se imprime al compilar y ejecutar el siguiente código?</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji5lCJIPdL0IQklvwSxL_5xbkP-KJlWSSxztVszyVJlPCkUz81mHq-6d0v2C14ysIJeRRxx_EZtkxqH6N06j3bPBlbTz7EqL_xx8BbitSrASO6XH9V1GvNMZIh7YhPSWMzEeGIh2pQsuI/s1600-h/switch.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 167px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji5lCJIPdL0IQklvwSxL_5xbkP-KJlWSSxztVszyVJlPCkUz81mHq-6d0v2C14ysIJeRRxx_EZtkxqH6N06j3bPBlbTz7EqL_xx8BbitSrASO6XH9V1GvNMZIh7YhPSWMzEeGIh2pQsuI/s320/switch.png" alt="" id="BLOGGER_PHOTO_ID_5418127544224251586" border="1" /></a>[A].- This is the default outputtwentyten<br />[B].- twentyten<br />[C].- twenty<br />[D].- Error de compilacion<br />[E].- Excepción en ejecución<br /><br /><span style="font-weight: bold;">4.- ¿Qué se imprime en pantalla al compilar y ejecutar el siguiente código?</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9HfVUjhQ0joMsavezRwsoqAEPt1kM8xpDSGiXbUHvv3KXNZBm3-dq9D5XujpsFWQP337bNd4dewZcvEIup9Onz61vfEqPTlIDRIO5SuwdwX8z-ZKkY80kRdFl2opj0ssoCNBsr9WQw70/s1600-h/rectangulo.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 266px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9HfVUjhQ0joMsavezRwsoqAEPt1kM8xpDSGiXbUHvv3KXNZBm3-dq9D5XujpsFWQP337bNd4dewZcvEIup9Onz61vfEqPTlIDRIO5SuwdwX8z-ZKkY80kRdFl2opj0ssoCNBsr9WQw70/s320/rectangulo.png" alt="" id="BLOGGER_PHOTO_ID_5418127541290785538" border="1" /></a>[A].- medidas finales (Alto: 50.0, Ancho: 20.0)<br />[B].- medidas finales (Alto: 60.0, Ancho: 30.0)<br />[C].- medidas finales (Alto: 80.0, Ancho: 20.0)<br />[D].- medidas finales (Alto: 80.0, Ancho: 30.0)<br />[E].- medidas finales (Alto: 60.0, Ancho: 20.0)<br />[F].- medidas finales (Alto: 50.0, Ancho: 30.0)<br /><br /><span style="font-weight: bold;">Respuestas Correctas:</span><br /><br /><span style="font-weight: bold;">1.- [D]. Se imprime 3</span>.<br />Si, el compilador no tiene ninguna dificultad al compilar este código, pero en la ejecución como ambos métodos pueden ejecutar el código se le da prioridad al que recibe dos parámetros por defecto. Es decir si llamo a metodo(), o metodo(5), o metodo(1,8,7), se imprime 0, 1 y 3 respectivamente que es la longitud de z, pero al llamar a metodo(6,2) se ejecuta metodo(int x, int y) y por lo tanto se imprime 3 que es el resultado de 6 entre 2.<br /><br /><span style="font-weight: bold;">2.- [E]. El programa no puede compilar</span>:<br />Esto debido a que el compilador interpreta tanto método String[] como String... como arreglos y por lo tanto el método está duplicado, por lo tanto el programa no compila.<br /><br /><span style="font-weight: bold;">3.- [B]. twentyten:<br />C</span>omo k vale 20, el programa imprime twenty, luego, como no existe un break, continúa abajo hasta case 10, por lo que imprime ten también. La compilación tiene efecto aunque default este de primero y aunque esté en cualquier parte de switch este sólo se ejecuta si ninguno de los case coincide.<br /><br /><span style="font-weight: bold;">4.- [C]. medidas finales (Alto: 80.0, Ancho: 20.0):<br /></span>Java por defecto pasa los parámetros por valor. Para referencias y arreglos puedo cambiar el contenido pero no puedo asignarle una nueva referencia. Debido a esto, la línea 24 deja a rectangulo igual (50.0, 20.0), pero al llamar a cambiarAlto si cambia el valor dentro de la referencia y por lo tanto cambia el alto a 80.0, por lo tanto las medidas finales son Alto: 80.0 y Ancho 20.0<span style="font-weight: bold;"><br /></span>Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com0tag:blogger.com,1999:blog-7189135837700621853.post-56355456264746759682009-11-30T19:27:00.000-08:002010-10-07T10:29:02.205-07:00Tres preguntas variadas<span style="font-weight: bold;">1.- Cuál es el resultado de compilar y ejecutar el siguiente código?</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcveGhmn4qE4S9DfKIBfqHg1oXSqpSM7_x2-bzQHGQtfyotr0qKlcNGeqsqekwHFZu2fMjm9W2SH8Q_FWXYQTvr6JU-TMDVs9qadD9ieMJBHZ8zg4yZ0BxybuYh1_Ct2ZSmRxJ5eF5bJ0/s1600/Correr.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 315px; height: 320px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcveGhmn4qE4S9DfKIBfqHg1oXSqpSM7_x2-bzQHGQtfyotr0qKlcNGeqsqekwHFZu2fMjm9W2SH8Q_FWXYQTvr6JU-TMDVs9qadD9ieMJBHZ8zg4yZ0BxybuYh1_Ct2ZSmRxJ5eF5bJ0/s320/Correr.png" alt="" id="BLOGGER_PHOTO_ID_5410104591171782178" border="1" /></a><br /><br />[A].- Imprime CAMain<br />[B].- Imprime ABCAMain<br />[C].- Imprime BCAMain<br />[D].- Imprime CBAAMain<br />[E].- Error de compilación<br />[F].- Excepcion en la ejecución<br /><br /><br /><span style="font-weight: bold;">2.- Cual es el resultado al compilar y ejecutar el siguiente código?</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC3DIzomM053IK-4J0qcGvpuLykJla6EwRIypF0G826Ucvj0GMKC6Kuk-ltFM5wiq5oeHOjpsOpddHBIS-ffH6j1q7EqVvliu_24_dpXSWUxbc2qBiJupBrys1gG5z3a4jGjFl_ogyyEY/s1600/CortoCircuito.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 152px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC3DIzomM053IK-4J0qcGvpuLykJla6EwRIypF0G826Ucvj0GMKC6Kuk-ltFM5wiq5oeHOjpsOpddHBIS-ffH6j1q7EqVvliu_24_dpXSWUxbc2qBiJupBrys1gG5z3a4jGjFl_ogyyEY/s320/CortoCircuito.png" alt="" id="BLOGGER_PHOTO_ID_5410104588518766530" border="1" /></a><br /><br />[A].- 0123<br />[B].- 13<br />[C].- 1234<br />[D].- Error de compilación<br />[E].- Excepción en tiempo de ejecución<br /><br /><span style="font-weight: bold;">3.- Cual es el resultado al compilar y ejecutar el siguiente código?</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4XURj17kYaGziW0kt6I29FFiUW_Gq6Ek-nKDb25TH5PxDP9LTu8alujJlohmJzEjS2SlrEcjZhIizI6_v2lN5r1GF-Z9zejV8z1ESFpqDIuplzeD2tDOKxtmVPeiHs-L7-4P-G3RIPVo/s1600/excepcion.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 226px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4XURj17kYaGziW0kt6I29FFiUW_Gq6Ek-nKDb25TH5PxDP9LTu8alujJlohmJzEjS2SlrEcjZhIizI6_v2lN5r1GF-Z9zejV8z1ESFpqDIuplzeD2tDOKxtmVPeiHs-L7-4P-G3RIPVo/s320/excepcion.png" alt="" id="BLOGGER_PHOTO_ID_5410104582939300594" border="1" /></a>[A].- Se imprime intenta, atrapa, finalmente y luego se lanza excepcion.<br />[B].- Error de compilación. Método main no debe lanzar (throws) Excepciones.<br />[C].- Error de compilación linea 17. No se puede lanzar excepcion en bloque finally.<br />[D].-Ninguna de las anteriores.<br /><br /><br /><span style="font-weight: bold;">Respuestas:</span><br /><br />1.- [C]: Debido a que cuando se crea el objeto C en la línea 19, se llama a los constructores por defecto de A, B y C, pero el constructor de A no hace nada (constructor por defecto), el método A que aparece allí es un método de clase ya que devuelve "void" (no es un constructor ya que tiene la palabra void), entonces al invocarse el constructor B se imprime B, luego se imprime C que es el constructor de C, y luego se invoca al mátodo A en la línea 20 por lo que se imprime A, para termina se imprime Main.<br /><br />2.- [A]: Debido a que a es "true" esto hace que se entre en la estructura if sin verificar la segunda condición, es decir (++x) > 0. Por lo tanto se imprimen los valores que trae x por defecto del ciclo for.<br /><br />3.- [D].- Como e1 = e está en una estructura catch el compilador no tiene la garantía de que esta sentencia se ejecute y por lo tanto se lanza una excepción en esta línea ya que el compilador no tiene la garantía que e1 sea inicializada.Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com0tag:blogger.com,1999:blog-7189135837700621853.post-30894409260425618452009-11-26T18:11:00.000-08:002010-10-07T10:28:32.485-07:00Tres preguntas de colecciones y genericos.Ahora tengo tres preguntas que aunque cortas me parecen claves saber para la programación con Genéricos y Colecciones.<br /><br /><span style="font-weight: bold;">1.- Cuál es el resultado de compilar y ejecutar el siguiente programa?</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgis2XaYFuw18APkyl-5DtnumvOoJY75LpIvdOb0a4ZddwZLleUm6ktcPh5sDEFvIWChyJikRYgWCTpkWF_L02LGcCLhSgHLDqptAnSefIyzlhPtnkJxiTcT9dosOnOdPKziPu_1YysIik/s1600/1.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 186px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgis2XaYFuw18APkyl-5DtnumvOoJY75LpIvdOb0a4ZddwZLleUm6ktcPh5sDEFvIWChyJikRYgWCTpkWF_L02LGcCLhSgHLDqptAnSefIyzlhPtnkJxiTcT9dosOnOdPKziPu_1YysIik/s320/1.jpg" alt="" id="BLOGGER_PHOTO_ID_5408606327123151634" border="1" /></a><br />[A].- 15.09<br /> 1.0<br /> 1.0<br /> 2.0<br />[B].- 15.09<br /> 1.0<br /> 2.0<br />[C].- 15.09<br /> 1<br /> 1<br /> 2<br />[D].- 15.09<br /> 1.0<br /> 1<br /> 2<br />[E].- Error de compilacion<br /><br /><span style="font-weight: bold;">2.- Qué opción se debe colocar en la línea 6 donde aparece XXXX (las 4 xs) para que el programa compile?</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTRDd9mHbrCJ7gAYzgnWQWmzg-CvYI-b5i4mdVDK252GOcFPrQ3VSebe-WK4lL5mKCDW2DEwUY3DLnL7uItei7RAUvZ6BVb2QCF5rsibCrafvPkGReGvY2D8QF8yaGQdcfrCNr07Vq1yg/s1600/Dibujo.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 92px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTRDd9mHbrCJ7gAYzgnWQWmzg-CvYI-b5i4mdVDK252GOcFPrQ3VSebe-WK4lL5mKCDW2DEwUY3DLnL7uItei7RAUvZ6BVb2QCF5rsibCrafvPkGReGvY2D8QF8yaGQdcfrCNr07Vq1yg/s320/Dibujo.jpg" alt="" id="BLOGGER_PHOTO_ID_5408606334140083378" border="1" /></a><br /><br />[A].- Object[ ]<br />[B].- Integer[ ]<br />[C].- int[ ]<br />[D].- cualquiera de las anteriores<br />[E].- A o B<br />[F].- B o C<br /><br /><span style="font-weight: bold;"><br />3.- Cuál es el resultado de compilar y ejecutar el siguiente código?</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiENC_Lbc1aHSbBvM7jj_SdyW9ltIfn9mx9gguYbXU0jajRd18UahC5lXCQ91jGHf76VlR8l1t50yIiqQKXhvhoClyAiIQcIkHnfB_FD20-NZXvzE3S5khTpMXNdByVWVEZfKkRuaPmOfs/s1600/3.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 97px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiENC_Lbc1aHSbBvM7jj_SdyW9ltIfn9mx9gguYbXU0jajRd18UahC5lXCQ91jGHf76VlR8l1t50yIiqQKXhvhoClyAiIQcIkHnfB_FD20-NZXvzE3S5khTpMXNdByVWVEZfKkRuaPmOfs/s320/3.jpg" alt="" id="BLOGGER_PHOTO_ID_5408615408367792322" border="1" /></a><br /><br />[A].- truetrue<br />[B].- truefalse<br />[C].- falsetrue<br />[D].- falsefalse<br />[E].- Error de compilación<br />[F].- Exception en tiempo de ejecución<br /><br /><span style="font-weight: bold;">RESPUESTAS.-</span><br />1.-[E] Hay un error de compilación en la linea 14 debido a que no puedo asignar un objeto ArrayList<Double> a uno ArrayList<Object> ya que en genericos no hay relación de superclase y subclase, es decir se comportan como objetos distintos. Si se quisiera realizar esta operación puede cambiar la línea 5 de List<Object> a List<?> (Comodín) para mas información consulte el artículo de Genéricos <a href="http://acercadejava.blogspot.com/2009/01/tipos-genericos-o-parametrizados-en.html">Aquí</a><br /><br />2.-[A] el método toArray() de List devuelve un arreglo de tipo Object[ ].<br /><br />3.-[E] Si se desea saber si un objeto TreeSet o Collection debe usarse las colecciones pero sin los tipos de datos parametrizado, algo como: <br />coleccion instanceof TreeSet<br />coleccion instanceof Collection<br />No se puede saber si es una instancia de un genérico parametrizado.Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com0tag:blogger.com,1999:blog-7189135837700621853.post-87785202617104754312009-10-31T17:14:00.000-07:002010-10-07T10:28:04.915-07:00Ahora son 4 preguntas.<span style="font-weight: bold;">Nota: Si deseas ver mejor la imagen puedes hacer click sobre ella.<br /><br />1.- ¿Cuál es el resultado de compilar y ejecutar el siguiente código?</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRPZbiA5UxfcRBblIJbK0Ko8T9kXmT4L0D3bhQYKSHwK-Y2KUOBL341JysULb-Ojjuir6uA_wEf2ZxE6zMFZ27jaVT2womwfrTET1IPcFn0DwEqkOFAUCXBwZ72wJ8O_TZfbdoNBj0SI4/s1600-h/Constante.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 239px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRPZbiA5UxfcRBblIJbK0Ko8T9kXmT4L0D3bhQYKSHwK-Y2KUOBL341JysULb-Ojjuir6uA_wEf2ZxE6zMFZ27jaVT2womwfrTET1IPcFn0DwEqkOFAUCXBwZ72wJ8O_TZfbdoNBj0SI4/s320/Constante.png" alt="" id="BLOGGER_PHOTO_ID_5398923918021397426" border="1" /></a>[A].-Error de compilación en línea 6. El constructor no puede tener valor de retorno.<br />[B].-El programa compila pero lanza un error en tiempo de ejecución en línea 13, ya que se intenta cambiar un valor constante.<br />[C].-Se imprime 35<br />[D].-Se imprime 55<br />[E].- Error de compilación en línea 13, mala llamada al constructor.<br />[F].-Ninguna de las anteriores<br /><br /><span style="font-weight: bold;">2.- ¿Cuál es el resultado de compilar y ejecutar el siguiente código?</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHWveppyW9-RfthzV5_1v0YVMtLV9p_Totwmj-U4loeNieLvo1kNR53ATD4qjf_ACzITxnC6WzA7up_SSAVM45FknscFmhR2q0MTskc-F0kUIPxeejb6R4vHZSWQJEYMmJUH7oLFx86UE/s1600-h/CastClase.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 157px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHWveppyW9-RfthzV5_1v0YVMtLV9p_Totwmj-U4loeNieLvo1kNR53ATD4qjf_ACzITxnC6WzA7up_SSAVM45FknscFmhR2q0MTskc-F0kUIPxeejb6R4vHZSWQJEYMmJUH7oLFx86UE/s320/CastClase.png" alt="" id="BLOGGER_PHOTO_ID_5398922466764095394" border="1" /></a>[A].- El programa compila y ejecuta sin problemas. No se genera salida.<br />[B].- ClassCastException en tiempo de ejecución.<br />[C].- Error en la compilación.<br />[D].-Ninguna de las anteriores.<br /><br /><span style="font-weight: bold;">3.- ¿Qué resulta al compilar y ejecutar el siguiente código?. Suponga que las aserciones están ensambladas:</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7LLudWl3_DO-m7Nj-F0u5Dp9J-towKXxvkJiWQMsI3-CVOhriqQtw2cbFECGuswhQhcJtORtM6d6xuWdOpCzojP32p-HoIv-6fvnR5wpc82ekCCwwUR0-t_jgoxJR8XiOvI4EF4glr3k/s1600-h/assert.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 243px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7LLudWl3_DO-m7Nj-F0u5Dp9J-towKXxvkJiWQMsI3-CVOhriqQtw2cbFECGuswhQhcJtORtM6d6xuWdOpCzojP32p-HoIv-6fvnR5wpc82ekCCwwUR0-t_jgoxJR8XiOvI4EF4glr3k/s320/assert.png" alt="" id="BLOGGER_PHOTO_ID_5398922462144800178" border="1" /></a>[A].- Error de compilación.<br />[B].- Sólo se imprime ABC.<br />[C].- Se imprime ABC y se lanza AsertionException.<br />[D].- Se impime ABC y se lanza AsertionError.<br /><br /><br /><span style="font-weight: bold;">4.- ¿Cuál es la salida generada al ejecutar el siguiente código?</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDLSOFzr6zlW4THkumEJNnV9SUQlxbkAlltxFz6fWa7qbavohQTMtAAd7GePy-qNgzCF9WMS85EuYiP0b6UnlzjlhtHLE6dMx_C9W7L50W0BrC6Xn034G9D6r8myfj5sZGP7uOTdeKOwo/s1600-h/PruebaConstructores.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 437px; height: 296px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDLSOFzr6zlW4THkumEJNnV9SUQlxbkAlltxFz6fWa7qbavohQTMtAAd7GePy-qNgzCF9WMS85EuYiP0b6UnlzjlhtHLE6dMx_C9W7L50W0BrC6Xn034G9D6r8myfj5sZGP7uOTdeKOwo/s320/PruebaConstructores.png" alt="" id="BLOGGER_PHOTO_ID_5398922470269822338" border="1" /></a><br />[A].- 123<br /> 000<br /> 123<br />[B].- 000<br /> 123<br /> 123<br />[C].- 123<br /> 123<br /> 000<br />[D].- 101202603<br /> 123<br /> 123<br />[E].- 000<br /> 123<br />[F].- 123<br /> 101202603<br /> 123<br /><br /><span style="font-weight: bold;"> Respuestas Correctas:</span><br /><span style="font-weight: bold;">1.- [F]: </span><br />Sucede un error de compilación, pero en la línea 7 debido a que en un método no constructor no puede cambiarse el valor de una constante (final) en este caso la variable final VALOR. La A es incorrecta ya que debido a que el método public int Ejecutable devuelve un entero se convierte en un método no constructor. B, C y D es incorrecta debido a que el sistema no compila.<br /><br /><span style="font-weight: bold;">2.- [C]:</span><br />No se puede castear dos clases que tengan el mismo padre, podría crearse una instancia de la clase padre llamado p, podriamos hacer p = (Hija2) h2; o h2 = (Padre) p; pero entre dos clases que tienen el mismo padre no puede haber un casteo.<br /><br /><span style="font-weight: bold;">3.- [A]:</span><br />Hay error de compilación debido a que en el método f la sentencia default del switch no tiene valor de retorno y tampoco lanza una exception. La aserción no es suficiente para el compilador.<br /><br /><span style="font-weight: bold;">4.- [B]:</span><br />Hagamos una traza del programa: Primero se ejecuta el método main que realiza una instancia de PruebaConstructor( ). Este constructor hace una llamanda al constructor con tres enteros pasando los valores 101, 202 y 603, a su vez este llama al método inicializar pasandole los valores recibidos. Al llegar al método inicializar se hace la primera impresión llamando a this.uno, this.dos y this.tres pero hasta este momento no han sido inicializados y por eso imprimen sus valores por defecto (tres ceros se imprimen en la línea 14). Luego en las líneas 15, 16 y 17, this.uno toma el valor 1, this.dos toma 2, y this.tres se le asigna 3, debido al operador ternario. Estos se imprimen en la línea 18, luego de esto se retorna el control a PruebaConstructor que recibe tres enteros, aquí no hay mas sentencias, se retorna a PruebaConstructor( ) que imprime 123 debido a la línea 6. Resultado respuesta B.Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com0tag:blogger.com,1999:blog-7189135837700621853.post-26397725023634069202009-10-25T17:26:00.000-07:002010-10-07T10:27:39.095-07:00<span style="font-weight: bold;">1. ¿Cual de las siguientes opciones son los códigos que deben colocarse en las líneas 3 y 10 respectivamente, para que la salida imprima "Buena Opcion"?</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyUJ5temyBm0GCKh9Vf8SwpKg0WrF3alP0JzimNBwF_mC9eNjQWpAPGCafOUbLAxLh_E7NCnqltwtnz7izoD5uY7EyNa31HBzoGQxp1VTvLJXKCxlNopoe2CSR_5vQYbkqQ4dEbR_dDEM/s1600-h/ExternaFinal.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 213px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyUJ5temyBm0GCKh9Vf8SwpKg0WrF3alP0JzimNBwF_mC9eNjQWpAPGCafOUbLAxLh_E7NCnqltwtnz7izoD5uY7EyNa31HBzoGQxp1VTvLJXKCxlNopoe2CSR_5vQYbkqQ4dEbR_dDEM/s320/ExternaFinal.png" alt="" id="BLOGGER_PHOTO_ID_5396700935959185970" border="1" /></a><br />[A].- this.Interna.metodo1(); y this.Externa.metodo2();<br />[B].- new Interna().metodo1(); y new Externa().metodo2();<br />[C].- new Interna().metodo1(); y Externa.this.metodo2();<br />[D].- Interna.this.metodo1(); y Externa.this.metodo2();<br />[E].- this.Interna.metodo1(); y new Externa().metodo2();<br />[F].- new Interna().metodo1(); y this.Externa.metodo2();<br /><br /><span style="font-weight: bold;">2.- ¿Cuál es el resultado de compilar y correr el siguiente código?</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOmvmLrBtn9CoRPQ6HAuNy9nKVueDdhafGcDP9VRz4WjQ64FO4I3-1TMtAGRNjv9Zw3Vewy5xnPs1bFDaSDlSInV_9X3mM_EUeGZfqU8ScSCelY4JlG6Drwxf7RqtFyIg9jILet8gg1Fk/s1600-h/floatFinal.PNG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 310px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOmvmLrBtn9CoRPQ6HAuNy9nKVueDdhafGcDP9VRz4WjQ64FO4I3-1TMtAGRNjv9Zw3Vewy5xnPs1bFDaSDlSInV_9X3mM_EUeGZfqU8ScSCelY4JlG6Drwxf7RqtFyIg9jILet8gg1Fk/s320/floatFinal.PNG" alt="" id="BLOGGER_PHOTO_ID_5396704059528091410" border="1" /></a><br />[A].- imprime enteroCorto100<br />[B].- imprime puntoFlotante100<br />[C].- imprime doblePrecision100<br />[D].- Error de compilación. No hay constructor para entero.<br />[E].- Error en tiempo de Ejecución.<br /><br /><span style="font-weight: bold;">3.- ¿Cuál es la salida al compilar y ejecutar el siguiente código?</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdw8tj22yIze4VlYBbxUq3wxzsB0aUe58nRsO-d-LD018qIIP_ZV5vLzr_f_luj9Vw0p_s0nfFvcPYFf3tlW-0C4NefYmX3qDZ0O9e37FxZYRpM_Nk5qum9O-1N7POesM0bHI-dvozQWg/s1600-h/constructoresFinal.PNG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 311px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdw8tj22yIze4VlYBbxUq3wxzsB0aUe58nRsO-d-LD018qIIP_ZV5vLzr_f_luj9Vw0p_s0nfFvcPYFf3tlW-0C4NefYmX3qDZ0O9e37FxZYRpM_Nk5qum9O-1N7POesM0bHI-dvozQWg/s320/constructoresFinal.PNG" alt="" id="BLOGGER_PHOTO_ID_5396704054262521234" border="1" /></a><br /><br />[A].- 0<br />[B].- 3<br />[C].- 4<br />[D].- 5<br />[E].- 6<br />[F].- Error de compilacion.<br /><br /><span style="font-weight: bold;">Respuestas Correctas:</span><br /><span style="font-weight: bold;">1.-Respuesta correcta: C.</span><br />La opción A es incorrecta ya que Interna no es un campo de Externa ni viceversa, por lo tanto tampoco lo son las opciones E y F. La opción B, aunque compila lanza un StackOverflowError, debido a que en el constructor de Externa creo una instancia de Interna y dentro de Interna llama un constructor de Externa.<br />La opción D no es correcta ya que Interna.this.metodo1() se usa sólo si estoy dentro de una clase interna para llamar al método de la clase externa.<br />La opción correcta es la C, debido a que creo una nueva instancia de Interna en la clase externa y luego hago una llamada al metodo2 sin crear una nueva instancia.<br /><br /><span style="font-weight: bold;">2.-Respuesta correcta: B.</span><br />La respuesta correcta es B debido a lo que se llama promoción de argumentos, donde el tipo de cada valor en una expresión se promueve a su tipo "más alto" en la expresión.<br />las reglas de promoción son:<br />short o char --> int --> long --> float --> double:<br />Por lo tanto como no hay constuctor para int ni para long, entonces el valor es promovido hasta float porque este tiene constructor.<br /><br /><span style="font-weight: bold;">3.- Respuesta correcta: F.</span><br />La sentencia this() para llamar a otro constructor dentro de un constructor, debe ser la primera sentencia del mismo.Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com0tag:blogger.com,1999:blog-7189135837700621853.post-42462928005147304652009-09-30T11:16:00.001-07:002010-10-07T10:27:13.738-07:00Nuevas Preguntas de ensayo para el SCJP 5.0Saludos compañeros y bienvenidos de nuevo a un nuevo articulo de Acerca de Java. Allí van, tres preguntas más para nuestra preparación a la prueba SCJP 5.0.<br /><br /><span style="font-weight: bold;">1.- ¿Cuál es el resultado de compilar y ejecutar el siguiente código?</span><a style="font-size: 81px; line-height: 96.2px;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOEw3W66HoyAkfrjE3BrhiGS3Bw-wuEvqdJejYQ7D5CeHhH8ZizwGvUkjar4R83LOjUPyQxKs1eFemS1S8dW0AYfVyPK00zdOoyQXmf5mzKO6wxLRmGMScoNPD-aMo8zB1CXchG29GZF0/s1600-h/Hilos.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 189px; font-size: 81px; line-height: 96.2px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOEw3W66HoyAkfrjE3BrhiGS3Bw-wuEvqdJejYQ7D5CeHhH8ZizwGvUkjar4R83LOjUPyQxKs1eFemS1S8dW0AYfVyPK00zdOoyQXmf5mzKO6wxLRmGMScoNPD-aMo8zB1CXchG29GZF0/s320/Hilos.png" alt="" id="BLOGGER_PHOTO_ID_5387313208188311090" border="1" height="283" width="480" /></a>[A].- El programa compila y ejecuta sin producir ninguna salida.<br /><br />[B].- Error de compilación. Hace falta sincronización de metodo().<br /><br />[C].- Error de compilación. Falta sentencia llamada al método notify() o notifyAll() en alguna parte del codigo.<br /><br />[D].- Se lanza IllegalMonitorStateException en tiempo de ejecución<br /><br />[E].- Ninguna de las anteriores<br /><br /><span style="font-weight: bold;">2.- En el siguiente código. ¿Cuál línea imprime false?</span><br /><br /><a style="font-size: 81px; line-height: 96.2px;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIPPjvUDNsVgq_xFws6_b5yz-Nk6F1o0nUQAa23eZAyfSSUQ4CbID1dEXTzWtxxsGEO_WakMj2figeQO3wvDNIDjAyQgCeM9DyK0WCA7FEyWVkDf1c6RuXrRIvsyO0lXAah04kLuNkYEc/s1600-h/Iguales.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 140px; font-size: 81px; line-height: 96.2px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIPPjvUDNsVgq_xFws6_b5yz-Nk6F1o0nUQAa23eZAyfSSUQ4CbID1dEXTzWtxxsGEO_WakMj2figeQO3wvDNIDjAyQgCeM9DyK0WCA7FEyWVkDf1c6RuXrRIvsyO0lXAah04kLuNkYEc/s320/Iguales.png" alt="" id="BLOGGER_PHOTO_ID_5387313211242193058" border="1" height="210" width="480" /></a><br />[A].- Línea 6.<br />[B].- Línea 7.<br />[C].- Línea 8.<br />[D].- Línea 9.<br />[E].- Más de una línea imprime false.<br />[F].- Ninguna de las anteriores<br /><br /><span style="font-weight: bold;">3.- ¿Cuál es el resultado de compilar y ejecutar el siguiente código?</span><br /><a style="font-size: 81px; line-height: 96.2px;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbbliAAsenssjLWA5A2xE5Mz1CI34Qy5Qw0nOfdyXXRw_fk0v6IJahDpxNvm5HiEOXqabtQ0ksRnCty0pgKymaqleR-q4Pz-KJayNQDYq-zkwkB4qNQi_yzlnQnyINxbFMf_n0EV4lGuI/s1600-h/Coleccion.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 160px; font-size: 81px; line-height: 96.2px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbbliAAsenssjLWA5A2xE5Mz1CI34Qy5Qw0nOfdyXXRw_fk0v6IJahDpxNvm5HiEOXqabtQ0ksRnCty0pgKymaqleR-q4Pz-KJayNQDYq-zkwkB4qNQi_yzlnQnyINxbFMf_n0EV4lGuI/s320/Coleccion.png" alt="" id="BLOGGER_PHOTO_ID_5387313216556228466" border="1" height="240" width="480" /></a>[A].- Se imprime: CHAO Desde HOLA Hacia<br />[B].- Se imprime CHAO Desde Hacia HOLA<br />[C].- Se imprime HOLA CHAO Hacia Desde<br />[D].- Se imprime HOLA CHAO Hacia Desde HOLA<br />[E].- Error en tiempo de compilación.<br />[F].- Error en tiempo de ejecución.<br /><br /><span style="font-weight: bold;">1.- Respuesta correcta: D. IllegalMonitorStateException.</span><br />Se lanza IllegalMonitorStateException ya que el metodo wait() no se encuentra en un método sincronizado. La sincronización se verifica en tiempo de ejecución por lo tanto la opción B no es correcta como tampoco es necesario encontrar en el código una sentencia notify o notifyAll. El código compila pero lanza la excepción en ejecución.<br /><br /><span style="font-weight: bold;">2.- Respuesta Correcta: D. Línea 9.</span><br />Recordemos que el método <span style="font-style: italic;font-family:courier new;" >equals</span> verifica el contenido de las variables String y devuelve verdadero en caso de ser iguales, por otra parte == verifica que apunten al mismo objeto. Los objetos str1 y str2 apuntan al mismo objeto "Hola" por lo tanto arrojan verdadero en equals y ==, pero str3 aunque tiene el mismo contenido "Hola" no apuntan al mismo objeto ya que crea un nuevo objeto String a partir de str1, por lo tanto la línea 9 imprime false.<br /><br /><span style="font-weight: bold;">3.- Respuesta Correcta: A. Se imprime: CHAO Desde HOLA Hacia<br /></span>TreeSet<span style="font-weight: bold;"> </span>almacena objetos no duplicados en forma ordenada. Hay que recordar que HOLA aparece primero a Hacia a pesar de que la a primero está en el alfabeto, pero en sistema La O mayúscula aparece primero que la a minúscula y por lo tanto aparecerán en ese orden.<span style="font-weight: bold;"><br /><br /></span>Es todo hasta ahora. Espero les haya gustado el artículo.<span style="font-weight: bold;"> </span>Nos vemos en una próxima edición<span style="font-weight: bold;">.<br /></span>Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com0tag:blogger.com,1999:blog-7189135837700621853.post-81831137027125551382009-09-20T11:50:00.000-07:002010-10-07T10:26:17.761-07:00Saludos compañeros y bienvenidos a mi nuevo artículo de Acerca de Java y, como lo prometido es deuda aquí van las primeras tres preguntas de Java:<br /><p><strong>1. ¿Cuál será el resultado de compilar y ejecutar el siguiente código?</strong></p><p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWTUb65foJi505MbctfZKU1PS6VVMrsGbX5csSHh-5qfrRlWbS0QPeL8FZwhYje_t2HX7wfPFch0cCjUbvFhuio3aiQruhrqVwFDKngVnLBcIUXutH1N5gWSyxfxvNMQ8UDjZMtOIQZBI/s1600-h/y.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 284px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWTUb65foJi505MbctfZKU1PS6VVMrsGbX5csSHh-5qfrRlWbS0QPeL8FZwhYje_t2HX7wfPFch0cCjUbvFhuio3aiQruhrqVwFDKngVnLBcIUXutH1N5gWSyxfxvNMQ8UDjZMtOIQZBI/s320/y.png" alt="" id="BLOGGER_PHOTO_ID_5383624573717166802" border="1" /></a></p>A.- Se imprimer: "Valor de y: 0"<br /><br />B.- Se imprime: "Valor de y: 1"<br /><p>C.- Se imprime: "Valor de y: 2"</p>D.- Se imprime: "Valor de y: 3"<br /><p>E.- Error de compilación línea 19: No se ha inicializado out.</p>F.- Ninguna de las anteriores<br /><br /><p><strong>2.- ¿Cuál será el resultado de compilar y ejecutar el siguiente código?</strong></p><br /><p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY4xdQW4fJjQQcEtVSImmhQlmbL5gbVqtvrPHUhXke_dAAaSmGLp9dqhGBErVd4nxzeyCYbabZ-uMXPTkB2KYK0IvcgaQZzq0tdjVUqyJwPx0RB0zmYmnujWLSum6YRWg7BGA4E5a1liM/s1600-h/excepciones.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 295px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY4xdQW4fJjQQcEtVSImmhQlmbL5gbVqtvrPHUhXke_dAAaSmGLp9dqhGBErVd4nxzeyCYbabZ-uMXPTkB2KYK0IvcgaQZzq0tdjVUqyJwPx0RB0zmYmnujWLSum6YRWg7BGA4E5a1liM/s320/excepciones.png" alt="" id="BLOGGER_PHOTO_ID_5383624610477584530" border="1" /></a></p><br /><p>A.- Error de compilación: Línea 9: No se puede lanzar excepción una vez atrapada.</p>B.- Se imprime:<br />Ejecuto metodo 1<br />Excepcion metodo 1 <br />Excepcion metodo 2<br /><br />C.- Se imprime:<br />Ejecuto metodo 1<br />Excepcion metodo 1<br />Excepcion metodo 2<br />Final metodo 1<br /><p>D.- Se imprime:</p><p>Ejecuto metodo 1</p><p>Excepcion metodo 1</p><p> Final metodo 1</p><p>Excepcion metodo 2<br /></p><br />E.- Compila bien, pero lanza excepción en tiempo de ejecución.<br /><p><strong>3.- ¿Cuál será el resultado de compilar y ejecutar el siguiente código?</strong></p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-9H_2fU2YGl0HKhttuLPldZCcXgWirCaz09FFjLZvb19g-ofYt0YADNTYWhzK9hZuAJ9qk5hU1VoP0MJ1acyhPFLTqArS8FnahsekqFfqa2psSFG_Bx9eEzGCwiYeJiwov4Ay3I3IdA8/s1600-h/4.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 265px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-9H_2fU2YGl0HKhttuLPldZCcXgWirCaz09FFjLZvb19g-ofYt0YADNTYWhzK9hZuAJ9qk5hU1VoP0MJ1acyhPFLTqArS8FnahsekqFfqa2psSFG_Bx9eEzGCwiYeJiwov4Ay3I3IdA8/s320/4.png" alt="" id="BLOGGER_PHOTO_ID_5383626367851829538" border="1" /></a><p>A.- Error de compilación.</p>B.- Se imprime:<br /><br />Constructor Clase 1<br /><p> Primer constructor Clase 2</p>Constructor Clase 1<br /><p> Llamada String </p><br /><p>C.- Se imprime:<br /></p><p>Primer constructor Clase 2</p>Llamada String<br /><p>D.- Se lanza Excepción en tiempo de ejecución.</p><br /><br /><p><strong>Respuestas:</strong></p><strong>1.- La respuesta es F. </strong>Esto debido a que el compilador cree que pudiera no inicializarse la variable "ye" (y) antes de imprimirla. Si se ve bien el código podrá verse que existen bloques if else if, pero no hay una sentencia else que indique al compilador que de alguna manera va a entrar a inicializar y, es decir, no hay error lógico debido a que sabemos que la variable y va a inicializarse ya que i toma o un valor menor a cero, mayor a cero o igual, pero no se lo estamos indicando al compilador, si cambiamos la línea 15 con una sentencia else eliminamos el error de compilación. y se de esa forma podría imprimirse 2, pero el compilador tal como está escrito no lo interpreta así.<br /><p><strong>2.- La respuesta es D. </strong>Según el orden en que se ejecuta el código tenemos: en el método main, se llama al método 2, que intenta ejecutar el método 1, aquí se imprime como primera línea "Ejecuto metodo 1", luego se lanza la excepción que es atrapada por el mismo método, se imprime "Excepcion metodo 1", luego se ejecuta el bloque finally que imprime: "Final metodo 1". Luego, se lleva al control al método 2 con lo que se llama <em>Limpieza de la Pila</em> ya que la excepción lanzada en la línea 9 no puede ser atrapada por método 1. Por ello se atrapa la excepción en el método 2 y se imprime: "Excepcion metodo 2".</p><br /><p><strong>3.- La respuesta es A: </strong>Al crear un constructor que recibe un parámetro entero en la Clase1 se elimina el constructor por defecto que no recibe parámetros, por lo tanto al crear un constructor en la clase derivada (Clase2) se debe recordar que la primera sentencia es la llamada al constructor de la super clase, si hay un constructor que no recibe parámetros en la super clase la llamada es implícita super(), pero en este caso no hay constructor por defecto y por lo tanto debe llamarse explícitamente al constructor de la super clase super(int) en la linea 9 antes de la sentencia System.out.println al igual que en la linea 13. Por ello hay error de compilación en el código de la pregunta 3.</p>Kelvinhttp://www.blogger.com/profile/07970921241870468843noreply@blogger.com0