<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;A0MESXc5eSp7ImA9WhRUFU4.&quot;"><id>tag:blogger.com,1999:blog-1856038649839016004</id><updated>2012-01-25T19:56:48.921-05:00</updated><category term="Java ME" /><category term="PostgreSQL" /><category term="MySQL" /><category term="Desktop" /><category term="Java EE" /><category term="NetBeans" /><category term="Java" /><category term="IDE" /><category term="Movil" /><category term="Java SE" /><title>Javadabadu! Blog de desarrollo de software en entornos desktop, web y móviles con Java, PHP, etc.</title><subtitle type="html">Mi humilde y modesta experiencia e investigación en el desarrollo y programación de sistemas y aplicaciones de software en plataformas desktop, web y móviles utilizando tecnología Java, PHP, HTML, CSS, JavaScript y otras mas.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://javadabaduuu.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://javadabaduuu.blogspot.com/" /><author><name>Geek Melomano</name><uri>http://www.blogger.com/profile/08645769188131644822</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-6gqWEfG1SpU/TaaF1va0HUI/AAAAAAAABNQ/GyjY0n24njA/s220/Perfil.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/fdidE" /><feedburner:info uri="blogspot/fdide" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>blogspot/fdidE</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;CkYAQXg_fip7ImA9WhZVEEg.&quot;"><id>tag:blogger.com,1999:blog-1856038649839016004.post-8406189471429915989</id><published>2009-09-30T23:40:00.008-05:00</published><updated>2011-05-22T02:42:20.646-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-22T02:42:20.646-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MySQL" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Desktop" /><category scheme="http://www.blogger.com/atom/ns#" term="Java SE" /><category scheme="http://www.blogger.com/atom/ns#" term="NetBeans" /><title>Interfaces CRUD para Mantenimiento de Bases de Datos (y II)</title><content type="html">&lt;p align="justify"&gt;Continuando con el post anterior, ahora vamos a crear las acciones que realizan las operaciones de mantenimiento en la tabla de la base de datos Customers. Para esto, vamos a asociar a cada botón de nuestra ventana la correspondiente acción de la manera que ya hemos visto en posts anteriores. La siguiente tabla resume los valores de las propiedades de las acciones Nuevo, Guardar, Actualizar y Eliminar:&lt;/p&gt;&lt;div align="center"&gt;&lt;table border="1" cellspacing="0" cellpadding="2" width="600" align="center"&gt;&lt;thead&gt;
&lt;tr&gt; &lt;th valign="top"&gt;PROPIEDAD&lt;/th&gt; &lt;th valign="top"&gt;Nuevo&lt;/th&gt; &lt;th valign="top"&gt;Guardar&lt;/th&gt; &lt;th valign="top"&gt;Actualizar&lt;/th&gt; &lt;th valign="top"&gt;Eliminar&lt;/th&gt; &lt;/tr&gt;
&lt;/thead&gt; &lt;tbody&gt;
&lt;tr&gt; &lt;td valign="top"&gt;Método de acción&lt;/td&gt; &lt;td valign="top"&gt;registrarCliente&lt;/td&gt; &lt;td valign="top"&gt;guardarCambios&lt;/td&gt; &lt;td valign="top"&gt;actualizarDatos&lt;/td&gt; &lt;td valign="top"&gt;eliminarCliente&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td valign="top"&gt;Segundo plano&lt;/td&gt; &lt;td valign="top"&gt;No&lt;/td&gt; &lt;td valign="top"&gt;Sí&lt;/td&gt; &lt;td valign="top"&gt;Sí&lt;/td&gt; &lt;td valign="top"&gt;No&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td valign="top"&gt;Texto&lt;/td&gt; &lt;td valign="top"&gt;Nuevo&lt;/td&gt; &lt;td valign="top"&gt;Guardar&lt;/td&gt; &lt;td valign="top"&gt;Actualizar&lt;/td&gt; &lt;td valign="top"&gt;Eliminar&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td valign="top"&gt;Propiedad habilitada&lt;/td&gt; &lt;td valign="top"&gt;-&lt;/td&gt; &lt;td valign="top"&gt;necesitaGuardar&lt;/td&gt; &lt;td valign="top"&gt;-&lt;/td&gt; &lt;td valign="top"&gt;clienteSeleccionado&lt;/td&gt; &lt;/tr&gt;
&lt;/tbody&gt; &lt;/table&gt;&lt;/div&gt;&lt;p align="justify"&gt;Si desean recordar cómo se crean y configuran acciones pueden leer la entrada anterior &lt;a href="http://javadabaduuu.blogspot.com/2009/04/desarrollo-de-aplicaciones-con-swing.html" target="_blank"&gt;Desarrollo de aplicaciones con Swing Application Framework&lt;/a&gt;. Una vez establecidas las acciones vamos a escribir el código que llevará a cabo cada operación de mantenimiento.&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h4&gt;Acción registrarCliente&lt;/h4&gt;&lt;p align="justify"&gt;En esta acción creamos un nuevo cliente, lo persistimos en el administrador de entidades creado en el post anterior y lo agregamos a la lista de resultados, también creada antes. Además debemos seleccionar la fila del objeto JTable asociada al nuevo cliente y activar el indicador &lt;strong&gt;necesitaGuardar&lt;/strong&gt; para que la acción Guardar sea habilitada.&lt;/p&gt;&lt;p align="justify"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Customers nuevoCliente = new Customers();    &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; entityManager1.persist(nuevoCliente);     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; list1.add(nuevoCliente);     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int fila = list1.size() - 1;     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jTable1.setRowSelectionInterval(fila, fila);     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jTable1.scrollRectToVisible(jTable1.getCellRect(fila, 0, true));     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; setNecesitaGuardar(true);&lt;/p&gt;&lt;h4&gt;Acción guardarCambios&lt;/h4&gt;&lt;p align="justify"&gt;El código de está acción debe situarse en el método &lt;strong&gt;doInBackground&lt;/strong&gt; de la clase interna que debería tener el nombre &lt;strong&gt;GuardarCambiosTask&lt;/strong&gt;. Aquí solo confirmamos transacción e iniciamos una nueva. En caso de una excepción (la llamada a &lt;strong&gt;commit&lt;/strong&gt; puede lanzar una &lt;strong&gt;RollbackException&lt;/strong&gt; si la transacción ha sido deshecha anteriormente) “mezclamos” los datos de los clientes con los datos almacenados en la base de datos.&lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try {    &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; entityManager1.getTransaction().commit();     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; entityManager1.getTransaction().begin();     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } catch (RollbackException ex) {     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Logger.getLogger(MarcoClientes.class.getName()).log(Level.SEVERE, null, ex);     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; entityManager1.getTransaction().begin();     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;Customers&amp;gt; clientes = new ArrayList&amp;lt;Customers&amp;gt;(list1.size());     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (Customers cliente : list1) clientes.add(entityManager1.merge(cliente));     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; list1.clear();     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; list1.addAll(clientes);     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return null;&lt;/p&gt;&lt;p align="justify"&gt;Además, debemos establecer la propiedad necesitaGuardar en false porque los cambios ya se han guardado. Esto lo vamos a hacer en el método succeeded:&lt;/p&gt;&lt;blockquote&gt;&lt;p align="justify"&gt;setNecesitaGuardar(false);&lt;/p&gt;&lt;/blockquote&gt;&lt;h4&gt;Acción actualizarDatos&lt;/h4&gt;&lt;p align="justify"&gt;Para actualizar los datos ignorando todo cambio que se haya hecho solo es necesario deshacer los cambios de la transacción e iniciar una nueva. Luego es necesario “refrescar” la lista de clientes que tenemos con los datos almacenados en la base de datos, recuperándolos nuevamente volviendo a ejecutar la consulta del objeto Query. Al igual que la acción anterior, este código se ubica en el método doInBackground:&lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; entityManager1.getTransaction().rollback();    &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; entityManager1.getTransaction().begin();     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;Customers&amp;gt; clientes = query1.getResultList();     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (Customers cliente : clientes) entityManager1.refresh(cliente);     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; list1.clear();     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; list1.addAll(clientes);     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return null;&lt;/p&gt;&lt;h4&gt;Acción eliminarCliente&lt;/h4&gt;&lt;p align="justify"&gt;Puede haber más de un cliente seleccionado en el objeto JTable. Por eso, para cada fila seleccionada recuperamos el objeto Customers &lt;strong&gt;del modelo de la tabla, no de su vista&lt;/strong&gt; (puede ser que se haya cambiado de sitio las filas, uno nunca sabe). Los clientes recuperados son eliminados de la lista de clientes y del administrador de entidades.&lt;/p&gt;&lt;p align="justify"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (int indice : jTable1.getSelectedRows()) {    &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Customers cliente = list1.get(jTable1.convertRowIndexToModel(indice));     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; list1.remove(cliente);     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; entityManager1.remove(cliente);     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; setNecesitaGuardar(true);&lt;/p&gt;&lt;h4&gt;Tokes finales&lt;/h4&gt;&lt;p align="justify"&gt;Hay algunas cosas a considerar antes de terminar. Al momento de crear las acciones se crearon dos propiedades booleanas: &lt;strong&gt;necesitaGuardar&lt;/strong&gt; y &lt;strong&gt;clienteSeleccionado&lt;/strong&gt;. La primera no necesita modificaciones. La segunda no debe ser llamada explícitamente, sino que debe cambiar de acuerdo a la selección del usuario en el objeto JTable. Para esto vamos a eliminar el campo clienteSeleccionado y su método setter, quedándonos sólo con su respectivo getter, el cual modificaremos de la siguiente manera:&lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public boolean isClienteSeleccionado() {    &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return jTable1.getSelectedRow() != -1;     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;&lt;p align="justify"&gt;Para activar esta propiedad cuando el usuario seleccione una fila del objeto JTable (y, por consiguiente, sea habilitada la acción Eliminar) vamos a escribir un método en el cual agregamos un &lt;strong&gt;oyente de selección al modelo de selección&lt;/strong&gt; del objeto JTable, disparando un cambio en la propiedad &lt;strong&gt;clienteSeleccionado&lt;/strong&gt;:&lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; private void initListeners() {    &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jTable1.getSelectionModel().addListSelectionListener(new ListSelectionListener() {     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void valueChanged(ListSelectionEvent e) {     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; firePropertyChange(&amp;quot;clienteSeleccionado&amp;quot;, !isClienteSeleccionado(),     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; isClienteSeleccionado());     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;&lt;p align="justify"&gt;Este método debe ser llamado desde el constructor. Adicionalmente, cada vez que haya un cambio en los datos del cliente seleccionado debe activarse la propiedad necesitaGuardar (para habilitar la acción Guardar). Los cambios pueden ser hechos en el objeto JTable o en los campos de texto que muestran los datos de dirección del cliente, por lo tanto es lógico pensar que se tendría que agregar oyentes al objeto JTable y a cada campo de texto para activar la propiedad ante cualquier cambio. &lt;/p&gt;&lt;p align="justify"&gt;Un acercamiento más apropiado es utilizar el &lt;strong&gt;grupo de enlaces&lt;/strong&gt; creado cuando enlazamos los componentes con la lista de clientes. Este grupo es un objeto &lt;strong&gt;BindingGroup&lt;/strong&gt; al cual se le puede agregar un &lt;strong&gt;oyente de enlace&lt;/strong&gt; de tipo &lt;strong&gt;BindingListener&lt;/strong&gt;. Para esto agregamos un objeto &lt;strong&gt;AbstractBindingListener&lt;/strong&gt; (que deriva de BindingListener e implementa la funcionalidad básica de notificación de enlaces) y redefimos su método &lt;strong&gt;targetChanged&lt;/strong&gt; (llamado cuando hay un cambio en el bean objetivo del enlace) activando la propiedad necesitaGuardar. Esto lo hacemos en el método recién creado:&lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; bindingGroup.addBindingListener(new AbstractBindingListener() {    &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; @Override public void targetChanged(Binding binding, PropertyStateEvent event) {     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; setNecesitaGuardar(true);     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/p&gt;&lt;p align="justify"&gt;Y bien, eso es todo. Con esto acaba el desarrollo de esta sencilla ventana de mantenimiento de tipo CRUD. Lógicamente hemos obviado algunas tareas comunes, como búsquedas y otras cosas. Queda como un ejercicio (!) hacer las ventanas de mantenimiento de las demás tablas jejeje. A continuación inserto los videos correspondientes a esta entrada y la anterior, así como el enlace al código fuente del ejemplo. En la siguiente entrada desarrollaremos una ventana más compleja, en la cual se tocarán aspectos más avanzados.&lt;/p&gt;&lt;p align="center"&gt;&lt;/p&gt;&lt;div align="center"&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:d6207bab-ad5d-49ce-9353-5cf31a841897" class="wlWriterEditableSmartContent"&gt;&lt;div id="17eb71c9-8969-4097-a2a0-41d370e13dae" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=o-2jyKqISyo&amp;amp;feature=youtube_gdata" target="_new"&gt;&lt;img src="http://lh3.ggpht.com/_ktBjQvAp4Qo/SsQyzdCFqSI/AAAAAAAAAhE/78S4A0LV_hw/video6d2c1bda75db%5B3%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('17eb71c9-8969-4097-a2a0-41d370e13dae'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/o-2jyKqISyo&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/o-2jyKqISyo&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;/p&gt;&lt;div align="center"&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:3f2e677f-9000-4af5-9bd6-82e0e5d85daf" class="wlWriterEditableSmartContent"&gt;&lt;div id="ce570595-f059-4b5e-9f1f-8440de69c580" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=C-M4CgVBaKA&amp;amp;feature=youtube_gdata" target="_new"&gt;&lt;img src="http://lh5.ggpht.com/_ktBjQvAp4Qo/SsQy0AO4wJI/AAAAAAAAAhI/Kqu1qI6g3go/videoaf47482c3702%5B2%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('ce570595-f059-4b5e-9f1f-8440de69c580'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/C-M4CgVBaKA&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/C-M4CgVBaKA&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://www.megaupload.com/?d=MERYFLCZ" target="_blank"&gt;Código fuente de la aplicación de ejemplo en MegaUpload&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Copyright © 2011 Jonathan Muñoz Aleman. Todos los derechos reservados.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1856038649839016004-8406189471429915989?l=javadabaduuu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yOgWS-bQbXOVJ-ETidqWXWVMj4A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yOgWS-bQbXOVJ-ETidqWXWVMj4A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yOgWS-bQbXOVJ-ETidqWXWVMj4A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yOgWS-bQbXOVJ-ETidqWXWVMj4A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fdidE/~4/DltPWYZnMrA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javadabaduuu.blogspot.com/feeds/8406189471429915989/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://javadabaduuu.blogspot.com/2009/09/interfaces-crud-para-mantenimiento-de_30.html#comment-form" title="20 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/8406189471429915989?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/8406189471429915989?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fdidE/~3/DltPWYZnMrA/interfaces-crud-para-mantenimiento-de_30.html" title="Interfaces CRUD para Mantenimiento de Bases de Datos (y II)" /><author><name>Geek Melomano</name><uri>http://www.blogger.com/profile/08645769188131644822</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-6gqWEfG1SpU/TaaF1va0HUI/AAAAAAAABNQ/GyjY0n24njA/s220/Perfil.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_ktBjQvAp4Qo/SsQyzdCFqSI/AAAAAAAAAhE/78S4A0LV_hw/s72-c/video6d2c1bda75db%5B3%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>20</thr:total><feedburner:origLink>http://javadabaduuu.blogspot.com/2009/09/interfaces-crud-para-mantenimiento-de_30.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYFRHwzfSp7ImA9WhZVEEg.&quot;"><id>tag:blogger.com,1999:blog-1856038649839016004.post-7169212908592276677</id><published>2009-09-30T23:34:00.005-05:00</published><updated>2011-05-22T02:41:55.285-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-22T02:41:55.285-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MySQL" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Desktop" /><category scheme="http://www.blogger.com/atom/ns#" term="Java SE" /><category scheme="http://www.blogger.com/atom/ns#" term="NetBeans" /><title>Interfaces CRUD para Mantenimiento de Bases de Datos (I)</title><content type="html">&lt;p align="justify"&gt;Luego de terminar un ciclo de locos y de aprobar todos mis cursos, por fin hoy puedo publicar una entrada en este blog, continuando con el desarrollo de la aplicación que empece en el último post sobre Java con bases de datos. La última vez se crearon las clases entidad que se mapean con las tablas de la base de datos MySQL de ejemplo y se explicó muchos aspectos sobre este proceso, como la especificación JPA y sus diferentes implementaciones, unidades de persistencia, clases entidad, etc.&lt;/p&gt;&lt;p align="justify"&gt;Hoy voy a crear una interfaz gráfica de usuario para realizar operaciones de mantenimiento en las tablas de la base de datos. Antes que nada tengo que decir que voy a utilizar bastante el API Beans Binding para enlazar las propiedades de los componentes visuales con las de las clases entidad, y para esto debemos hacer que nuestras clases entidad sean beans “con todas las de la ley”. Esto se consigue agregándoles el soporte de cambio de propiedades.&lt;/p&gt;&lt;p align="justify"&gt;Esto lo he tocado en un post anterior, pero no esta demás recordarlo. Primero, debemos agregar una instancia de &lt;strong&gt;PropertyChangeSupport&lt;/strong&gt; a cada una de las clases entidad que tengamos. Pero existe una trampa: si la agregamos y nada más, JPA pensará que se trata de un campo más en la tabla correspondiente a la clase entidad y lo mapeará en ella. Para evitar esto, hacemos uso de la anotación &lt;strong&gt;@Transient&lt;/strong&gt;, de la siguiente manera:&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;@Transient    &lt;br /&gt;
private PropertyChangeSupport soportePropiedades = new PropertyChangeSupport(this);&lt;/p&gt;&lt;p align="justify"&gt;A continuación modificamos todos los métodos setter de las propiedades de nuestras clases entidad, disparando un cambio de propiedad con el valor anterior y el nuevo. Por ejemplo:&lt;/p&gt;&lt;p&gt;public void setCustomerID(String customerID) {    &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; String anterior = this.customerID;     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.customerID = customerID;     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; soportePropiedades.firePropertyChange(&amp;quot;customerID&amp;quot;, anterior, customerID);     &lt;br /&gt;
}&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_ktBjQvAp4Qo/SsQxCaozM_I/AAAAAAAAAfQ/kV-MG0G9LZw/s1600-h/Untitled03.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="Untitled0" border="0" alt="Untitled0" align="left" src="http://lh4.ggpht.com/_ktBjQvAp4Qo/SsQxDAIXRnI/AAAAAAAAAfU/ugMZofd2XlI/Untitled0_thumb1.jpg?imgmax=800" width="206" height="122" /&gt;&lt;/a&gt;Bien, pues ahora sí es hora de crear nuestras ventanas. Como cuando creamos nuestro proyecto lo hicimos utilizando Swing Application Framework, ya tenemos una ventana principal con un menú. Voy a tratar dicha ventana como una ventana MDI, que tiene múltiples&lt;a href="http://lh5.ggpht.com/_ktBjQvAp4Qo/SsQxDpXqjWI/AAAAAAAAAfY/i65fj28Z6xU/s1600-h/Untitled13.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="Untitled1" border="0" alt="Untitled1" align="right" src="http://lh4.ggpht.com/_ktBjQvAp4Qo/SsQxFF_Pw9I/AAAAAAAAAfc/5kmkX8zFPa4/Untitled1_thumb1.jpg?imgmax=800" width="235" height="191" /&gt;&lt;/a&gt; ventanas internas y para esto, debemos modificar esa ventana, borrando el panel central y arrastrando y soltando en cualquier lugar del diseñador un objeto &lt;strong&gt;JDesktopPane&lt;/strong&gt; de la paleta de componentes. A continuación, en la ficha Inspector seleccionamos el elemento &lt;strong&gt;[FrameView]&lt;/strong&gt; y luego, en la ficha Propiedades, establecemos la propiedad &lt;strong&gt;component&lt;/strong&gt; con el objeto JDesktopPane que acabamos de agregar.&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_ktBjQvAp4Qo/SsQxFqpzO_I/AAAAAAAAAfg/QWWGrQii1eM/s1600-h/Untitled5.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Untitled" border="0" alt="Untitled" src="http://lh5.ggpht.com/_ktBjQvAp4Qo/SsQxGKn8dkI/AAAAAAAAAfk/PG6144Vca_w/Untitled_thumb2.jpg?imgmax=800" width="412" height="312" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Además, vamos a agregar un método que permita agregar marcos internos en esta ventana MDI, haciéndolos visibles, seleccionándolos y gestionando sus posiciones iniciales. No voy a explicar el funcionamiento de este método, por que considero que es autoexplicativo:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;private void agregarMarcoInterno(JInternalFrame marco) {    &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; marco.setLocation(xSigMarco, ySigMarco);     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; marco.setVisible(true);     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; desktopPane.add(marco); &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try {    &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; marco.setSelected(true);     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } catch (PropertyVetoException ex) {     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (distanciaEntreMarcos == 0)    &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; distanciaEntreMarcos = marco.getHeight() - marco.getContentPane().getHeight(); &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xSigMarco += distanciaEntreMarcos;    &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ySigMarco += distanciaEntreMarcos;     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (xSigMarco + marco.getWidth() &amp;gt; desktopPane.getWidth()) xSigMarco = 0;     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (ySigMarco + marco.getHeight() &amp;gt; desktopPane.getHeight()) ySigMarco = 0;     &lt;br /&gt;
}&lt;/p&gt;&lt;p&gt;El método recibe un objeto &lt;strong&gt;JInternalFrame&lt;/strong&gt;, que es un marco interno de una ventana MDI. Por lo tanto vamos a crear un Formulario JInternalFrame en el proyecto. Una vez creada, pasamos a diseñarla para que tenga el siguiente aspecto:&lt;/p&gt;&lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Untitled2" border="0" alt="Untitled2" src="http://lh6.ggpht.com/_ktBjQvAp4Qo/SsQxG2N-9JI/AAAAAAAAAfo/6OOFe8U8L7c/Untitled2_thumb8.jpg?imgmax=800" width="425" height="390" /&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p align="justify"&gt;Quiero suponer que los componentes que uso son conocidos para los lectores. El objetivo de nuestra interfaz es realizar las operaciones de mantenimiento a la tabla Customers de la base de datos, listando a todos los clientes en el JTable y que, al seleccionar un cliente, se muestre sus datos de dirección en los objetos JTextField. Como dije antes, para esto haremos uso intensivo de Beans Binding. Comencemos.&lt;/p&gt;&lt;p align="justify"&gt;En primer lugar debemos agregar a la ventana los objetos que nos permitirán persistir y consultar los datos de los clientes de la base de datos. Estos componentes se encuentran en &lt;a href="http://lh3.ggpht.com/_ktBjQvAp4Qo/SsQxHJsiKfI/AAAAAAAAAfs/PMoe9cdcGjo/s1600-h/Untitled33.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="Untitled3" border="0" alt="Untitled3" align="left" src="http://lh5.ggpht.com/_ktBjQvAp4Qo/SsQxHunemzI/AAAAAAAAAfw/IxIzTSaSQnk/Untitled3_thumb1.jpg?imgmax=800" width="195" height="90" /&gt;&lt;/a&gt;la categoría &lt;strong&gt;Persistencia de Java&lt;/strong&gt; de la paleta. El primero que vamos a agregar (arrastrando y soltando) será un&amp;#160; &lt;strong&gt;Administrador de entidades&lt;/strong&gt;, que es un objeto &lt;strong&gt;EntityManager&lt;/strong&gt; que nos permitirá interactuar con la base de datos a través de la unidad de persistencia que creamos en nuestro proyecto en el post anterior. Por esto, debemos asegurarnos que en la propiedad persistenceUnit de dicho administrador de entidades esté el nombre de nuestra unidad de persistencia. &lt;/p&gt;&lt;p align="justify"&gt;Luego agregamos un objeto &lt;strong&gt;Consulta&lt;/strong&gt;, que es un objeto &lt;strong&gt;Query&lt;/strong&gt; que nos permite realizar una consulta en la base de datos utilizando el lenguaje &lt;strong&gt;JPQL&lt;/strong&gt;, devolviendo un objeto entidad o una lista de ellos. La propiedad &lt;strong&gt;query&lt;/strong&gt; contiene la cadena de consulta JPQL y la propiedad &lt;strong&gt;entityManager&lt;/strong&gt; hace referencia al administrador de entidades que hemos creado antes. Ambas propiedades deben ser establecidas como se muestra en la tabla:&lt;/p&gt;&lt;div align="center"&gt;&lt;table border="1" cellspacing="0" cellpadding="2" width="400" align="center"&gt;&lt;tbody&gt;
&lt;tr&gt;         &lt;td valign="top" width="200"&gt;&lt;strong&gt;PROPIEDAD&lt;/strong&gt;&lt;/td&gt;          &lt;td valign="top" width="200"&gt;&lt;strong&gt;VALOR&lt;/strong&gt;&lt;/td&gt;       &lt;/tr&gt;
&lt;tr&gt;         &lt;td valign="top" width="200"&gt;query&lt;/td&gt;          &lt;td valign="top" width="200"&gt;SELECT c FROM Customers c&lt;/td&gt;       &lt;/tr&gt;
&lt;tr&gt;         &lt;td valign="top" width="200"&gt;entityManager&lt;/td&gt;          &lt;td valign="top" width="200"&gt;entityManager1&lt;/td&gt;       &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_ktBjQvAp4Qo/SsQxIUkfsZI/AAAAAAAAAf0/Xjk8FqN3M7Q/s1600-h/Untitled69.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="Untitled6" border="0" alt="Untitled6" align="right" src="http://lh4.ggpht.com/_ktBjQvAp4Qo/SsQxIxSMfOI/AAAAAAAAAf4/lIPVXq41mYk/Untitled6_thumb5.jpg?imgmax=800" width="235" height="241" /&gt;&lt;/a&gt;Después agregamos un objeto &lt;strong&gt;Resultado de la Consulta&lt;/strong&gt;, que es un objeto List que almacena la lista de resultados del objeto Query. Establecemos la propiedad &lt;strong&gt;query&lt;/strong&gt; para que haga referencia al objeto Query que creamos antes. Además, seleccionamos la propiedad &lt;strong&gt;observable&lt;/strong&gt; para que cualquier cambio en la lista sea notificado a los componentes que estén enlazados con ella, como nuestro JTable. También debemos especificar qué tipo de objetos almacenará esta lista y para eso vamos a la pestaña Código y en la propiedad &lt;strong&gt;Parámetros de tipo&lt;/strong&gt; escribimos “&amp;lt;Customers&amp;gt;”.&lt;/p&gt;&lt;p align="justify"&gt;Ahora podemos enlazar nuestros componentes visuales con los objetos entidad devueltos por los objetos que acabamos de crear. Comenzamos con el JTable enlazando su propiedad elements con el objeto List y seleccionando solo algunas propiedades de la clase Customers.&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_ktBjQvAp4Qo/SsQxJw6CsKI/AAAAAAAAAf8/ppD7glvAnhE/s1600-h/Untitled74.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Untitled7" border="0" alt="Untitled7" src="http://lh5.ggpht.com/_ktBjQvAp4Qo/SsQxLGZIQ1I/AAAAAAAAAgA/N5APMOL8JfI/Untitled7_thumb2.jpg?imgmax=800" width="497" height="477" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Alternativamente, podemos modificar el contenido de la tabla, para cambiar, por ejemplo, el título de las columnas. Para esto, hacemos clic derecho sobre la tabla y seleccionamos &lt;strong&gt;Contenido de la tabla…&lt;/strong&gt; En la pestaña Columnas de la ventana abierta podemos especificar el título de las columnas, y si éstas son redimensionables o editables, y otras propiedades que por ahora no voy a explicar.&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_ktBjQvAp4Qo/SsQxMLkeR2I/AAAAAAAAAgE/_nWozMWpkFs/s1600-h/Untitled812.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Untitled8" border="0" alt="Untitled8" src="http://lh3.ggpht.com/_ktBjQvAp4Qo/SsQxM40PgZI/AAAAAAAAAgI/LLWVamVLx74/Untitled8_thumb8.jpg?imgmax=800" width="554" height="380" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Es el turno de los campos de texto. Enlazamos su propiedad text con una propiedad especifica del objeto Customers seleccionado en el JTable. Por ejemplo, enlazamos el campo de texto etiquetado como Dirección con la propiedad address de Customers:&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_ktBjQvAp4Qo/SsQxN3UI8AI/AAAAAAAAAgM/DUOYxCPZbXE/s1600-h/Untitled94.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Untitled9" border="0" alt="Untitled9" src="http://lh4.ggpht.com/_ktBjQvAp4Qo/SsQxOjcRq9I/AAAAAAAAAgQ/XAq5TQtTVTI/Untitled9_thumb2.jpg?imgmax=800" width="497" height="347" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Procedemos de la misma forma para los demás campos de texto, que se resume en la tabla:&lt;/p&gt;&lt;div align="center"&gt;&lt;table border="1" cellspacing="0" cellpadding="2" width="400" align="center"&gt;&lt;tbody&gt;
&lt;tr&gt;         &lt;td valign="top" width="200"&gt;&lt;strong&gt;Campo de Texto&lt;/strong&gt;&lt;/td&gt;          &lt;td valign="top" width="200"&gt;&lt;strong&gt;Enlazado de Expresión&lt;/strong&gt;&lt;/td&gt;       &lt;/tr&gt;
&lt;tr&gt;         &lt;td valign="top" width="200"&gt;jTextField2 (Ciudad)&lt;/td&gt;          &lt;td valign="top" width="200"&gt;${selectedElement.city}&lt;/td&gt;       &lt;/tr&gt;
&lt;tr&gt;         &lt;td valign="top" width="200"&gt;jTextField3 (Región)&lt;/td&gt;          &lt;td valign="top" width="200"&gt;${selectedElement.region}&lt;/td&gt;       &lt;/tr&gt;
&lt;tr&gt;         &lt;td valign="top" width="200"&gt;jTextField4 (Código postal)&lt;/td&gt;          &lt;td valign="top" width="200"&gt;${selectedElement.postalCode}&lt;/td&gt;       &lt;/tr&gt;
&lt;tr&gt;         &lt;td valign="top" width="200"&gt;jTextField5 (País)&lt;/td&gt;          &lt;td valign="top" width="200"&gt;${selectedElement.country}&lt;/td&gt;       &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p align="justify"&gt;Con la funcionalidad agregada hasta ahora es suficiente para visualizar todos los datos de todos los clientes de la base de datos. Si no me creen, puedo probarlo. Para esto abrimos la ventana principal (la que modificamos para que sea MDI), y agregamos un elemento de menú desde la paleta al menú Archivo y le asignamos una acción, como ya hemos visto en el post referente al framework Swing Application Framework.&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_ktBjQvAp4Qo/SsQxPkM33RI/AAAAAAAAAgU/mPPUmIhetJA/s1600-h/Untitled104.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Untitled10" border="0" alt="Untitled10" src="http://lh5.ggpht.com/_ktBjQvAp4Qo/SsQxQaS_krI/AAAAAAAAAgY/THdwbNDE4Wo/Untitled10_thumb2.jpg?imgmax=800" width="412" height="312" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_ktBjQvAp4Qo/SsQxSLMZSLI/AAAAAAAAAgc/wIT5syAKP6c/s1600-h/Untitled118.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Untitled11" border="0" alt="Untitled11" src="http://lh6.ggpht.com/_ktBjQvAp4Qo/SsQxTbIQv7I/AAAAAAAAAgg/3-9UP2O13oo/Untitled11_thumb6.jpg?imgmax=800" width="526" height="547" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;En el cuerpo del método de la acción creada, llamamos al método que creamos para agregar marcos internos a la ventana MDI, creando un nuevo marco de clientes:&lt;/p&gt;&lt;p align="center"&gt;agregarMarcoInterno(new MarcoClientes());&lt;/p&gt;&lt;p align="justify"&gt;Al ejecutar la aplicación podemos observar que todo va bien: los clientes son listados en la tabla y al seleccionar uno de ellos se muestran sus datos de dirección en los campos de texto. Pero eso es solo el comienzo. Aún falta implementar las operaciones de mantenimiento; pero como este post ya se hizo grande voy a hacerlo en una segunda parte. Por ahora solo me queda decir: Esta historia continuará!!!&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_ktBjQvAp4Qo/SsQxVHBKgAI/AAAAAAAAAgk/5GuArqnInt0/s1600-h/Untitled124.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Untitled12" border="0" alt="Untitled12" src="http://lh6.ggpht.com/_ktBjQvAp4Qo/SsQxW-YCxqI/AAAAAAAAAgo/INDO9ZyBc04/Untitled12_thumb2.jpg?imgmax=800" width="464" height="490" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Copyright © 2011 Jonathan Muñoz Aleman. Todos los derechos reservados.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1856038649839016004-7169212908592276677?l=javadabaduuu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5WVL0MODp3SMliOHWOwHbCiXxm0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5WVL0MODp3SMliOHWOwHbCiXxm0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5WVL0MODp3SMliOHWOwHbCiXxm0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5WVL0MODp3SMliOHWOwHbCiXxm0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fdidE/~4/C0Sk3P0fmJ0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javadabaduuu.blogspot.com/feeds/7169212908592276677/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://javadabaduuu.blogspot.com/2009/09/interfaces-crud-para-mantenimiento-de.html#comment-form" title="25 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/7169212908592276677?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/7169212908592276677?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fdidE/~3/C0Sk3P0fmJ0/interfaces-crud-para-mantenimiento-de.html" title="Interfaces CRUD para Mantenimiento de Bases de Datos (I)" /><author><name>Geek Melomano</name><uri>http://www.blogger.com/profile/08645769188131644822</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-6gqWEfG1SpU/TaaF1va0HUI/AAAAAAAABNQ/GyjY0n24njA/s220/Perfil.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_ktBjQvAp4Qo/SsQxDAIXRnI/AAAAAAAAAfU/ugMZofd2XlI/s72-c/Untitled0_thumb1.jpg?imgmax=800" height="72" width="72" /><thr:total>25</thr:total><feedburner:origLink>http://javadabaduuu.blogspot.com/2009/09/interfaces-crud-para-mantenimiento-de.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcMRXw-fip7ImA9WhZVEEg.&quot;"><id>tag:blogger.com,1999:blog-1856038649839016004.post-1545373248022211207</id><published>2009-08-09T18:34:00.004-05:00</published><updated>2011-05-22T02:41:24.256-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-22T02:41:24.256-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MySQL" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Desktop" /><category scheme="http://www.blogger.com/atom/ns#" term="Java SE" /><category scheme="http://www.blogger.com/atom/ns#" term="NetBeans" /><title>Creación de Clases Entidad a partir de una Base de Datos</title><content type="html">&lt;p align="justify"&gt;Vuelvo a publicar una entrada en este blog después de dos semanas de ausencia, debido a problemas de salud y de computadora (otra vez!). Pero en fin, en esta ocasión voy a tratar de ilustrar la forma de desarrollar una aplicación que se conecte a una base de datos sin utilizar el asistente que vimos en el post anterior. Esto para dar más flexibilidad a nuestros sistemas de la que nos puede dar el IDE NetBeans con dicho asistente.&lt;/p&gt;&lt;p align="justify"&gt;Algo de teoría: desde los albores de la POO los programadores han tenido que lidiar con el problema de representar los datos que se tienen en una base de datos, en un modelo de clases y objetos. Esto lleva el término de &lt;strong&gt;Mapeo Objeto-Relacional&lt;/strong&gt; (ORM, por sus siglas en inglés), mecanismo por el cual se puede solucionar este problema. Java tiene una especificación llamada &lt;strong&gt;JPA&lt;/strong&gt; (Java Persistence API) que permite realizar este mapeo.&lt;/p&gt;&lt;p align="justify"&gt;Pero solo es eso: una especificación que indica el mecanismo necesario para llevar a cabo el mapeo. Existen básicamente cuatro implementaciones de JPA, a saber: Hibernate, TopLink, OpenJPA y EclipseLink. El elegir una u otra implementación depende únicamente del rendimiento, pues gracias a JPA podemos trabajar con cualquiera de estas implementaciones y cambiar entre ellas de manera transparente para nosotros. (Justamente mencione las implementaciones en orden de rendimiento, de acuerdo a unas pruebas hechas por otro blogger).&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;p align="justify"&gt;El mapeo objeto-relacional se realiza a través de las llamadas &lt;strong&gt;clases entidad&lt;/strong&gt;, que son POJO’s que tienen una estructura especial. Un &lt;strong&gt;POJO&lt;/strong&gt; (Plain Old Java Object) es un objeto de una clase simple, que no implementa raras interfaces y que puede ser escrita de la manera convencional. Los POJO’s fueron la respuesta a la tendencia que había de obligar a los programadores a crear clases que implementaran interfaces (como en EJB).&lt;/p&gt;&lt;p align="justify"&gt;JPA es todo un mundo, sin embargo esta entrada no pretende ser una guía de referencia, así que voy a mostrar como crear clases entidad a partir de la base de datos Northwind, famosa en entornos SQL Server y también disponible para MySQL. Así que para comenzar creamos un proyecto de aplicación de escritorio (para utilizar Swing Application Framework aunque ahora no lo utilicemos, voy a seguir con este ejemplo en los demás post). Además, no vamos a utilizar el shell de aplicación de base de datos, porque vamos a crear las clases entidad y la unidad de persistencia por nuestra cuenta.&lt;/p&gt;&lt;p align="justify"&gt;Una vez que el asistente ha creado nuestra aplicación, creamos las clases entidad pulsando Ctrl + N, y eligiendo en la ventana resultante la categoría &lt;strong&gt;Persistencia&lt;/strong&gt; y en Tipo de archivo &lt;strong&gt;Clases entidad a partir de base de datos&lt;/strong&gt;.&lt;/p&gt;&lt;p align="justify"&gt;En el siguiente paso del asistente especificamos la conexión de la que recuperará los datos. Una vez hecho esto, se listan las tablas existentes en la base de datos. Hacemos clic en Agregar todo para crear las clases entidad de todas las tablas de nuestra base de datos. La ventaja de esto es que el asistente crea las clases entidad con toda la funcionalidad necesaria para realizar el mapeo incluyendo las relaciones que pueden haber en nuestra base de datos. Si solo agregamos unas cuantas tablas, y en un momento posterior tenemos que mapear las demás, tendríamos que hacer todo esto nosotros a mano.&lt;/p&gt;&lt;p align="justify"&gt;El siguiente paso nos muestra las tablas de la base de datos y sus correspondientes clases entidad, permitiendo modificar sus nombres. También nos permite especificar un paquete para las clases que se van a crear (lo cual es recomendable).&lt;/p&gt;&lt;p align="justify"&gt;En la parte inferior nos dice que el proyecto no tiene una &lt;strong&gt;unidad de persistencia&lt;/strong&gt;. Una unidad de persistencia contiene los parámetros necesarios para realizar la conexión a la base de datos: la clase del &lt;strong&gt;proveedor de persistencia&lt;/strong&gt; (que se encuentra en los jars de la implementación JPA que elijamos), las clases entidad de nuestra aplicación y los parámetros JDBC de acceso a la base de datos. La unidad de persistencia se almacena en un archivo llamado &lt;strong&gt;persistence.xml&lt;/strong&gt; y es la responsable de que podamos cambiar de implementación JPA e incluso de SGBD sin que toquemos el código de nuestra aplicación.&lt;/p&gt;&lt;p align="justify"&gt;Creamos la unidad de persistencia pulsando el botón Crear unidad de persistencia (obvio no). En la ventana resultante especificamos el nombre de la unidad de persistencia y la biblioteca que vamos a utilizar. Esa es otra ventaja de crear las clases entidad a mano. Utilizando el shell de base de datos, NetBeans trabaja por defecto con TopLink. En este caso tenemos la libertad de escoger nuestra implementación. Hibernate para nosotros. La estrategia de generación de tablas se refiere a la política utilizada para crear nuevas tablas en nuestra base de datos. Como no vamos a hacer esto, lo dejamos con Ninguno.&lt;/p&gt;&lt;p align="justify"&gt;En el último paso tenemos opciones adicionales. La única que vamos a modificar es el tipo de colección. Para explicar porque tomemos un ejemplo. Existe una relación de uno a muchos entre los clientes y sus pedidos. Un cliente puede hacer muchos pedido, pero cada pedido pertenece a un único cliente. Para realizar el mapeo en estas tablas, JPA incluye en la clase Pedido una referencia al objeto Cliente al que pertenece, mientras que en la clase Cliente agrega una lista de objetos Pedido. Podemos especificar que esta lista sea de tipo Collection, List o Set. Nosotros vamos a decirle a JPA que utilice una referencia List.&lt;/p&gt;&lt;p align="justify"&gt;Y eso es todo. El asistente se ocupa de crear las clases entidad capaces de realizar el mapeo objeto-relacional en nuestra base de datos por nosotros. Pero esto no es suficiente. En nuestra aplicación debemos crear el código que creara la unidad de persistencia y los objetos que permitirán realizar consultas y persistir objetos en nuestra base de datos. Esto también es muy fácil. Basta con escribir las siguientes líneas de código:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;EntityManagerFactory factory =      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Persistence.createEntityManagerFactory(&amp;quot;UnidadPersistencia&amp;quot;);      &lt;br /&gt;
EntityManager manager = factory.createEntityManager();&lt;/p&gt;&lt;/blockquote&gt;&lt;p align="justify"&gt;El método createEntityManagerFactory toma el nombre de la unidad de persistencia, la crea y devuelve un objeto EntityManagerFactory, que es utilizado para crear objetos EntityManager. Los objetos EntityManager tienen métodos que permiten realizar consultas, persistir, actualizar y eliminar objetos en nuestra base de datos (obviamente lo que se modifican son los registros de las tablas) y muchas otras cosas más. Para realizar una consulta se utiliza el lenguaje &lt;strong&gt;JPQL&lt;/strong&gt; (Java Persistence Query Language), que es similar a SQL, pero trabaja con objetos y sus propiedades. He aquí un ejemplo:&lt;/p&gt;&lt;p align="center"&gt;Query consulta = manager.createQuery(“SELECT c.companyName FROM Customers c”);&lt;/p&gt;&lt;p align="justify"&gt;Vemos que la consulta utiliza una sintaxis orientada a objetos. Como la propiedad companyName de Customers es de tipo String, al ejecutar la consulta nos dará como resultado una lista de objetos String. La recuperamos de la siguiente manera:&lt;/p&gt;&lt;blockquote&gt;&lt;p align="justify"&gt;List&amp;lt;String&amp;gt; resultados = consulta.getResultList();&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Los objetos Query poseen métodos que permiten devolver un único objeto y especificar parámetros en la consulta, pero los veremos más adelante (si no tengo problemas con mi computadora). Eso es todo amigos. Hasta otra oportunidad.&lt;/p&gt;&lt;div style="padding-bottom: 0px; padding-left: 0px; width: 425px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:8e2dbafc-f6f9-46e3-9936-dd12dc3624cd" class="wlWriterEditableSmartContent"&gt;&lt;div id="bff2f040-3a3d-47a9-bc13-bb1b453ebb90" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=IZHRCslI9FE" target="_new"&gt;&lt;img src="http://lh5.ggpht.com/_ktBjQvAp4Qo/Sn9dBziGcaI/AAAAAAAAAbY/N11dr6SHI6M/video04a9fc1234ce%5B2%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('bff2f040-3a3d-47a9-bc13-bb1b453ebb90'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/IZHRCslI9FE&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/IZHRCslI9FE&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.megaupload.com/?d=POT2FTJJ" target="_blank"&gt;Código fuente del ejemplo en MegaUpload&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Copyright © 2011 Jonathan Muñoz Aleman. Todos los derechos reservados.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1856038649839016004-1545373248022211207?l=javadabaduuu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZOm4F6MAi22Ks2mjpF9JU8VJWpc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZOm4F6MAi22Ks2mjpF9JU8VJWpc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZOm4F6MAi22Ks2mjpF9JU8VJWpc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZOm4F6MAi22Ks2mjpF9JU8VJWpc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fdidE/~4/6xWYNmdSEDE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javadabaduuu.blogspot.com/feeds/1545373248022211207/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://javadabaduuu.blogspot.com/2009/08/creacion-de-clases-entidad-partir-de.html#comment-form" title="12 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/1545373248022211207?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/1545373248022211207?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fdidE/~3/6xWYNmdSEDE/creacion-de-clases-entidad-partir-de.html" title="Creación de Clases Entidad a partir de una Base de Datos" /><author><name>Geek Melomano</name><uri>http://www.blogger.com/profile/08645769188131644822</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-6gqWEfG1SpU/TaaF1va0HUI/AAAAAAAABNQ/GyjY0n24njA/s220/Perfil.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_ktBjQvAp4Qo/Sn9dBziGcaI/AAAAAAAAAbY/N11dr6SHI6M/s72-c/video04a9fc1234ce%5B2%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>12</thr:total><feedburner:origLink>http://javadabaduuu.blogspot.com/2009/08/creacion-de-clases-entidad-partir-de.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcCQnc_fip7ImA9WhZVEEg.&quot;"><id>tag:blogger.com,1999:blog-1856038649839016004.post-1949698687451850424</id><published>2009-07-20T13:45:00.003-05:00</published><updated>2011-05-22T02:41:03.946-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-22T02:41:03.946-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MySQL" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Desktop" /><category scheme="http://www.blogger.com/atom/ns#" term="Java SE" /><category scheme="http://www.blogger.com/atom/ns#" term="NetBeans" /><title>Desarrollo de Aplicaciones con Conexión a Bases de Datos con NetBeans</title><content type="html">&lt;p align="justify"&gt;Hoy empezare con una serie de entradas que tienen un único fin: ilustrar la manera de desarrollar aplicaciones en Java que se conecten a una base de datos utilizando el IDE NetBeans. Para empezar, la aplicación de hoy es bastante sencilla, ya que primero debemos aprender el uso de los asistentes de NetBeans para conexiones a BD.&lt;/p&gt;&lt;p align="justify"&gt;La base de datos que voy a utilizar contiene información sobre grupos de rock, sus integrantes y géneros, etc.. El modelo relacional de la base de datos lo hice utilizando MySQL Workbench y se muestra aquí:&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_ktBjQvAp4Qo/SmS61rkxogI/AAAAAAAAAZQ/71XqPkUppLE/s1600-h/modelo%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Modelo relacional de la BD" border="0" alt="Modelo relacional de la BD" src="http://lh4.ggpht.com/_ktBjQvAp4Qo/SmS64gftT4I/AAAAAAAAAZU/T0inGe51a-8/modelo_thumb%5B1%5D.jpg?imgmax=800" width="429" height="252" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;p align="justify"&gt;En este blog voy a utilizar el servidor MySQL para los ejemplos. La manera en que se creen las bases de datos en el servidor, y cómo se puebla ésta de datos, se escapa del alcance de este blog. Suponiendo que ya tenemos configurado nuestro servidor, hemos creado la base de datos y sus tablas, y ya tenemos datos en ella, podemos continuar.&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_ktBjQvAp4Qo/SmS66BbgDtI/AAAAAAAAAZY/FEbnPLWKBlY/s1600-h/prestaciones%5B4%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="prestaciones" border="0" alt="prestaciones" align="left" src="http://lh4.ggpht.com/_ktBjQvAp4Qo/SmS69YqGzFI/AAAAAAAAAZc/8yg0n-eAlPY/prestaciones_thumb%5B1%5D.jpg?imgmax=800" width="244" height="126" /&gt;&lt;/a&gt; Una vez que estamos en el IDE, tenemos que registrar el servidor de bases de datos (si no lo está). Para esto, vamos a la pestaña Prestaciones y hacemos clic derecho en el nodo Bases de datos. En el menú contextual, hacemos clic en Registrar servidor MySQL. Se mostrará una ventana en la que ingresaremos la configuración del servidor, que normalmente es como se muestra en la figura:&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_ktBjQvAp4Qo/SmS7AsJw7tI/AAAAAAAAAZg/0J9dirTQkMI/s1600-h/basedatos%5B5%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="basedatos" border="0" alt="basedatos" src="http://lh6.ggpht.com/_ktBjQvAp4Qo/SmS7DqjTDJI/AAAAAAAAAZk/yYSVQ-kC0wc/basedatos_thumb%5B2%5D.jpg?imgmax=800" width="404" height="270" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;En la pestaña Propiedades de administración podemos especificar la &lt;a href="http://lh6.ggpht.com/_ktBjQvAp4Qo/SmS7FUiMQaI/AAAAAAAAAZo/WO9AJAdpeeE/s1600-h/conexion%5B4%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="conexion" border="0" alt="conexion" align="right" src="http://lh5.ggpht.com/_ktBjQvAp4Qo/SmS7HxG9v2I/AAAAAAAAAZs/F6XivbZNW1c/conexion_thumb%5B1%5D.jpg?imgmax=800" width="244" height="223" /&gt;&lt;/a&gt; ruta de las herramientas que utilizamos para administrar el servidor. Una vez que hemos hecho esto, podemos observar las bases de datos de nuestro servidor. Para conectarnos a una de ellas, hacemos clic derecho en su nombre y seleccionamos Conectar. En la ventana que aparece a continuación, debemos ingresar el nombre y la contraseña del usuario que &lt;a href="http://lh6.ggpht.com/_ktBjQvAp4Qo/SmS7KX5EFrI/AAAAAAAAAZ0/2-BiIDzvKYU/s1600-h/datos%5B11%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="datos" border="0" alt="datos" align="left" src="http://lh6.ggpht.com/_ktBjQvAp4Qo/SmS7LzUy4HI/AAAAAAAAAZ4/5x8oJ7pX65I/datos_thumb%5B6%5D.jpg?imgmax=800" width="177" height="244" /&gt;&lt;/a&gt; utilizaremos para realizar la conexión. Después de hacer clic en Aceptar veremos que en Prestaciones se ha agregado un nuevo nodo que representa la conexión hecha, mediante la cual podemos acceder a las tablas de la base de datos y los datos que contiene.&lt;/p&gt;&lt;p align="justify"&gt;Vamos a crear un nuevo proyecto de tipo Aplicación de escritorio Java. Luego de darle un nombre, especificamos que utilizará el intérprete de órdenes Aplicación de bases de datos, para que cree la funcionalidad básica por nosotros, como se muestra abajo:&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_ktBjQvAp4Qo/SmS7N-5qzQI/AAAAAAAAAZ8/Tq52cQvwpcY/s1600-h/shell%5B4%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="shell" border="0" alt="shell" src="http://lh5.ggpht.com/_ktBjQvAp4Qo/SmS7PK5M7zI/AAAAAAAAAaA/7oeqHfQNnKo/shell_thumb%5B1%5D.jpg?imgmax=800" width="429" height="289" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;En la lista &lt;strong&gt;Conexión con base de datos&lt;/strong&gt; del siguiente paso podemos elegir una conexión o crear una nueva. Vamos a escoger la que acabamos de crear. Inmediatamente, se listan las tablas disponibles, de la cual vamos a elegir &lt;strong&gt;grupo&lt;/strong&gt;.A continuación, se listan los campos de la tabla para especificar cuales se van a incluir. Todos en este caso.&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_ktBjQvAp4Qo/SmS7Qu_KgXI/AAAAAAAAAaE/ZhmreM4iV-M/s1600-h/tabla%5B4%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="tabla" border="0" alt="tabla" src="http://lh5.ggpht.com/_ktBjQvAp4Qo/SmS7RihGlCI/AAAAAAAAAaI/ZilNnw0E-K0/tabla_thumb%5B1%5D.jpg?imgmax=800" width="429" height="264" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;En el siguiente paso podemos especificar las opciones de detalle, las cuales son dos:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;Cuadros de texto.&lt;/strong&gt; Crea un objeto JTable en el que se muestran los registros de la tabla grupo, y una serie de campo de texto que muestran los detalles de los registros por cada campo de la tabla.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;Tabla.&lt;/strong&gt; Crea un objeto JTable en el que se muestran los registros de la tabla grupo, y otra tabla que contiene los registros de una tabla de detalle (generalmente correspondiente a una relación 1-n) para el registro seleccionado en la tabla maestra (grupo).&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p align="justify"&gt;Para hacerlo más interesante vamos a escoger la última opción y vamos a seleccionar la tabla &lt;strong&gt;musicosgrupos&lt;/strong&gt; en la lista para mostrar el detalle de los grupos y sus músicos:&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_ktBjQvAp4Qo/SmS7TONQ9zI/AAAAAAAAAaM/iUAcZjeqIEA/s1600-h/detalle%5B4%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="detalle" border="0" alt="detalle" src="http://lh6.ggpht.com/_ktBjQvAp4Qo/SmS7UGtp-EI/AAAAAAAAAaQ/zfyvFzf_bl8/detalle_thumb%5B1%5D.jpg?imgmax=800" width="429" height="241" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Hacemos clic en Finalizar. Eso es todo. El asistente generará una aplicación completamente funcional por nosotros haciendo uso del framework Swing Application Framework y el API Beans Binding (por eso desarrolle esas librerías en entradas anteriores). Si ejecutamos la aplicación, podremos ver los resultados esperados.&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_ktBjQvAp4Qo/SmS7VYP6T3I/AAAAAAAAAaU/cJtkFg7lQT0/s1600-h/aplicacion%5B5%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="aplicacion" border="0" alt="aplicacion" src="http://lh3.ggpht.com/_ktBjQvAp4Qo/SmS7WsVYstI/AAAAAAAAAaY/n6CAs8ZRCR8/aplicacion_thumb%5B2%5D.jpg?imgmax=800" width="304" height="319" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p align="justify"&gt;Con esta aplicación podemos hacer muchas cosas, como insertar, editar, actualizar y eliminar registros de las tablas de la base de datos (la clásica aplicación CRUD). El asistente también hace uso de JPA (Java Persistence API), que es la especificación estándar para el manejo de la persistencia en Java. Pero solo es una especificación. La implementación concreta es TopLink, una librería de Oracle (también existen otras como Hibernate e iBatis).&lt;/p&gt;&lt;p align="justify"&gt;Sin embargo, hay muchos problemas con esta aplicación. Si nos damos cuenta, la tabla de detalles no muestra el nombre de los integrantes de cada grupo. El asistente no es lo suficientemente inteligente para hacer estos enlaces. Sin embargo esto es fácil de resolver gracias al soporte de NetBeans para Beans Binding, y lo demostraré en otra entrada.&lt;/p&gt;&lt;p align="justify"&gt;Un problema peor es que es difícil ampliar la aplicación. Lo más común es tener una ventana MDI desde la cual acceder a través de un menú o una barra de herramientas a otras ventanas que contienen los detalles de las tablas de nuestra base de datos. Con solo modificar lo que ha creado el asistente no basta para este propósito.&lt;/p&gt;&lt;p align="justify"&gt;En las siguientes entradas veremos como crear una aplicación que se conecte a una base de datos sin utilizar el asistente de NetBeans, para realizar aplicaciones más complejas y ricas y resolver estos problemas. Como prometí, cada entrada tendrá un video tutorial y ahí va:&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:229ac6d3-d134-4307-915e-5cd3eb4febc4" class="wlWriterEditableSmartContent"&gt;&lt;div id="6d9b0f3a-a501-4ac4-9ae2-4a64b84a3f7a" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=xz4lolka6vs" target="_new"&gt;&lt;img src="http://lh3.ggpht.com/_ktBjQvAp4Qo/SmS7Ygic2vI/AAAAAAAAAac/Gm76f31qWQo/video935c543348a8%5B2%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('6d9b0f3a-a501-4ac4-9ae2-4a64b84a3f7a'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/xz4lolka6vs&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/xz4lolka6vs&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p align="justify"&gt;También coloco a continuación los enlaces al código fuente de la aplicación, junto con el script de la base de datos. Conmigo será hasta otra oportunidad.&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://www.megavideo.com/?d=UWR9H1DS" target="_blank"&gt;Código fuente y script de la base de datos del ejemplo&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Copyright © 2011 Jonathan Muñoz Aleman. Todos los derechos reservados.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1856038649839016004-1949698687451850424?l=javadabaduuu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/H1cIUKtWrtTopwfeuPXcnGKA3UA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/H1cIUKtWrtTopwfeuPXcnGKA3UA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/H1cIUKtWrtTopwfeuPXcnGKA3UA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/H1cIUKtWrtTopwfeuPXcnGKA3UA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fdidE/~4/VxT66jMMws0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javadabaduuu.blogspot.com/feeds/1949698687451850424/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://javadabaduuu.blogspot.com/2009/07/desarrollo-de-aplicaciones-con-conexion.html#comment-form" title="15 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/1949698687451850424?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/1949698687451850424?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fdidE/~3/VxT66jMMws0/desarrollo-de-aplicaciones-con-conexion.html" title="Desarrollo de Aplicaciones con Conexión a Bases de Datos con NetBeans" /><author><name>Geek Melomano</name><uri>http://www.blogger.com/profile/08645769188131644822</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-6gqWEfG1SpU/TaaF1va0HUI/AAAAAAAABNQ/GyjY0n24njA/s220/Perfil.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_ktBjQvAp4Qo/SmS64gftT4I/AAAAAAAAAZU/T0inGe51a-8/s72-c/modelo_thumb%5B1%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>15</thr:total><feedburner:origLink>http://javadabaduuu.blogspot.com/2009/07/desarrollo-de-aplicaciones-con-conexion.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcAQ3c6eCp7ImA9WhZVEEg.&quot;"><id>tag:blogger.com,1999:blog-1856038649839016004.post-3063556512484614408</id><published>2009-07-11T17:56:00.002-05:00</published><updated>2011-05-22T02:40:42.910-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-22T02:40:42.910-05:00</app:edited><title>Los primeros videotutoriales</title><content type="html">&lt;p align="justify"&gt;La última vez que fui a Lima adquirí unos auriculares con micrófonos para empezar con unos planes que tenía hace mucho tiempo. El primero era el de hablar con mis contactos mediante Skype y ya lo hice: hace unos días estuve hablando con una buena amiga mexicana. La segunda razón, la más importante, era tener la posibilidad de crear mis propios videotutoriales sobre tecnología Java. A pesar de algunos inconvenientes (mi voz y mis perros, por ejemplo), esta semana hice dos, que explican el desarrollo de ejemplos de entradas anteriores en este blog. Y como, si una imagen vale más que mil palabras, entonces 30 imágenes por segundo valen mucho más, aquí los publico.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="padding-bottom: 0px; padding-left: 0px; width: 400px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:8faed83a-1420-4298-98a7-5d8b8f7973b0" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;object width="400" height="290"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5513383&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=5513383&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="290"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;div style="padding-bottom: 0px; padding-left: 0px; width: 400px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:5bacfb94-9aa5-4be6-87e3-9f9cb6bec96b" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5552190&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=c9ff23&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=5552190&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=c9ff23&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Además, también he subido los códigos fuentes de los ejemplos, que los pueden encontrar en las siguientes direcciones:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.megaupload.com/?d=EAZ8HF8X" target="_blank"&gt;Ejemplo de Swing Application Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.megaupload.com/?d=BXPRB1X0" target="_blank"&gt;Ejemplo de Beans Binding&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Espero les guste y sea de su agrado.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Copyright © 2011 Jonathan Muñoz Aleman. Todos los derechos reservados.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1856038649839016004-3063556512484614408?l=javadabaduuu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8udyZyy6mryznWTXK7yqqMmb0QA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8udyZyy6mryznWTXK7yqqMmb0QA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8udyZyy6mryznWTXK7yqqMmb0QA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8udyZyy6mryznWTXK7yqqMmb0QA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fdidE/~4/83EPszq5GMI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javadabaduuu.blogspot.com/feeds/3063556512484614408/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://javadabaduuu.blogspot.com/2009/07/los-primeros-videotutoriales.html#comment-form" title="1 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/3063556512484614408?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/3063556512484614408?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fdidE/~3/83EPszq5GMI/los-primeros-videotutoriales.html" title="Los primeros videotutoriales" /><author><name>Geek Melomano</name><uri>http://www.blogger.com/profile/08645769188131644822</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-6gqWEfG1SpU/TaaF1va0HUI/AAAAAAAABNQ/GyjY0n24njA/s220/Perfil.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://javadabaduuu.blogspot.com/2009/07/los-primeros-videotutoriales.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcFSXk7eSp7ImA9WhZVEEg.&quot;"><id>tag:blogger.com,1999:blog-1856038649839016004.post-7646810891336411669</id><published>2009-07-08T11:59:00.002-05:00</published><updated>2011-05-22T02:40:18.701-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-22T02:40:18.701-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Java EE" /><title>Resumen de un fin de semana con Spring e Hibernate</title><content type="html">&lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_ktBjQvAp4Qo/SlTQWpkIvVI/AAAAAAAAAX0/52pF_vr-QeA/s1600-h/logopastilla3%5B7%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="logopastilla3" border="0" alt="logopastilla3" align="left" src="http://lh6.ggpht.com/_ktBjQvAp4Qo/SlTQXLvVGtI/AAAAAAAAAX4/_IcjUvEDzQ4/logopastilla3_thumb%5B3%5D.jpg?imgmax=800" width="115" height="171" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p align="justify"&gt;Hace menos de un mes iba a haber un curso sobre tecnología Java en la ciudad donde vivo, Chimbote, organizado por el Colegio de Ingenieros del Perú. Muchos temas de los que iban a tocar ya me eran familiares, pero yo deseaba tener una certificación (porque con decir que sí sabes no basta para un empleador). Así que me preinscribí en el curso y fui a pagar a dos días de empezar el curso. Mi sorpresa fue grande cuando me dijeron que no se iba a abrir el curso porque solo yo estaba inscrito. Eso me hizo dar cuenta de la realidad de mi ciudad. La mayoría de desarrolladores y empresas utilizan PowerBuilder para sus sistemas, y los que no lo hacen en .NET. Parece que con Java no tengo futuro en Chimbote.&lt;/p&gt;&lt;p align="justify"&gt;Por suerte, en la capital Lima sí es más difundida la tecnología Java, y este fin de semana hubo un taller sobre Spring en una organización llamada CJava, que es el partner peruano de Sun Microsystems. Aproveché que tenía ahorrado el dinero del primer curso fallido y me inscribí en éste, así que me escape de las obligaciones universitarias un rato para aprender este framework, del cual solo había escuchado.&lt;/p&gt;&lt;p align="justify"&gt;Y pues que puedo decir, fue una experiencia muy enriquecedora en mi relación con esta tecnología. Descubrí muchas cosas nuevas y también me siento orgulloso de haber respondido a los requisitos previos del curso. El tema central fue la utilización de los frameworks Spring e Hibernate en el desarrollo de aplicaciones, aunque se mencionó sobre otras tecnologías como Struts, iBatis, ExtJS. Hay mucho para aprender.&lt;/p&gt;&lt;p align="justify"&gt;Aunque la potencia de Spring se ve en aplicaciones Web, también puede ser utilizado en aplicaciones de escritorio (de hecho, debería utilizarse, porque introduce al programador en las buenas prácticas para hacer software de calidad). Tiene una gran similitud con Struts (y eso fue un problema para mí, porque no he utilizado Struts) y es muy fácil de utilizar. Por otra parte, Hibernate es un framework para persistencia de Java que se ajusta al API JPA (como TopLink, que es el que utilizo yo). Ambos frameworks trabajan bastante con archivos de configuración XML, lo cual solo resulta más fácil de utilizar.&lt;/p&gt;&lt;p align="justify"&gt;Asistiendo a este tipo de eventos, uno puede darse cuenta de si estás yendo por el camino correcto, y también lo que te falta por recorrer. Además pude ver las tecnologías que usan otros programadores. Por ejemplo, los otros participantes (por cierto, solo fuimos 3 asistentes, una cosa impresionante) utilizaban iBatis para manejar la persistencia de objetos, a diferencia mía que yo utilizo TopLink. Ellos estaban utilizando Struts en sus aplicaciones Web. Yo solo trabajo con el patrón DAO y para la interfaz utilizo JavaServer Faces.&lt;/p&gt;&lt;p align="justify"&gt;Además de estos frameworks también hablamos sobre otros temas como JavaFX, JasperReports y iReport, ExtJS (un rica librería de controles para interfaces web hecha en JavaScript) y otras. Conforme avance con los temas de este blog, también hare un par de entradas sobre estos frameworks, algo sencillo nomás. Fue un fin de semana rico en conocimientos y espero tener tiempo para practicar más.&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_ktBjQvAp4Qo/SlTQYs-qoGI/AAAAAAAAAX8/xdMFQk380bg/s1600-h/spring25%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="spring25" border="0" alt="spring25" src="http://lh5.ggpht.com/_ktBjQvAp4Qo/SlTQZyzNgcI/AAAAAAAAAYA/2TZDrYWTUw0/spring25_thumb%5B1%5D.png?imgmax=800" width="240" height="114" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://lh4.ggpht.com/_ktBjQvAp4Qo/SlTQaTqW-ZI/AAAAAAAAAYE/HgYG6Dsvd3k/s1600-h/hibernate%5B8%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="hibernate" border="0" alt="hibernate" src="http://lh4.ggpht.com/_ktBjQvAp4Qo/SlTQa1YQ-YI/AAAAAAAAAYI/pxIlj2bpCYs/hibernate_thumb%5B6%5D.jpg?imgmax=800" width="135" height="135" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Copyright © 2011 Jonathan Muñoz Aleman. Todos los derechos reservados.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1856038649839016004-7646810891336411669?l=javadabaduuu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YwdeRfp15BdH5rdgqZmKR719Vz4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YwdeRfp15BdH5rdgqZmKR719Vz4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YwdeRfp15BdH5rdgqZmKR719Vz4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YwdeRfp15BdH5rdgqZmKR719Vz4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fdidE/~4/g76-P026nXw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javadabaduuu.blogspot.com/feeds/7646810891336411669/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://javadabaduuu.blogspot.com/2009/07/resumen-de-un-fin-de-semana-con-spring.html#comment-form" title="2 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/7646810891336411669?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/7646810891336411669?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fdidE/~3/g76-P026nXw/resumen-de-un-fin-de-semana-con-spring.html" title="Resumen de un fin de semana con Spring e Hibernate" /><author><name>Geek Melomano</name><uri>http://www.blogger.com/profile/08645769188131644822</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-6gqWEfG1SpU/TaaF1va0HUI/AAAAAAAABNQ/GyjY0n24njA/s220/Perfil.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_ktBjQvAp4Qo/SlTQXLvVGtI/AAAAAAAAAX4/_IcjUvEDzQ4/s72-c/logopastilla3_thumb%5B3%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://javadabaduuu.blogspot.com/2009/07/resumen-de-un-fin-de-semana-con-spring.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04NRHg4cSp7ImA9WhZVEEk.&quot;"><id>tag:blogger.com,1999:blog-1856038649839016004.post-4524763352508251398</id><published>2009-06-14T15:15:00.003-05:00</published><updated>2011-05-22T02:39:55.639-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-22T02:39:55.639-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Desktop" /><category scheme="http://www.blogger.com/atom/ns#" term="Java SE" /><category scheme="http://www.blogger.com/atom/ns#" term="NetBeans" /><title>Enlace de datos con Beans Binding</title><content type="html">&lt;p align="justify"&gt;Después de escribir dos entradas sobre MySQL, hoy voy a continuar haciendo lo propio con Java. Cuento con poco tiempo, así que decidí tocar un tema que, por ahora, se presenta pequeño. Digo por ahora porque más adelante, cuando hable sobre aplicaciones con conexión a bases de datos con Java voy a utilizar bastante este tema.&lt;/p&gt;&lt;p align="justify"&gt;En muchas ocasiones, necesitamos sincronizar datos en varios componentes, de modo que, al cambiar los datos en un componente, se esto se refleje en los demás componentes. Para esto, normalmente se escriben oyentes de eventos, los cuales se agregan a los componentes para que reciban una notificación al realizarse un cambio.&lt;/p&gt;&lt;p align="justify"&gt;Por ejemplo, podemos tener una lista de personas en un JComboBox. Se desea que, al seleccionar una persona en el combo, se muestren sus datos en componentes JTextField. Para esto, se asocia un oyente de acción (ActionListener) con el combo, y tenemos que escribir el código que muestre los datos en los campos de texto.&lt;/p&gt;&lt;p align="justify"&gt;No es cuestión de tener pereza de escribir código, sino que a veces es mejor olvidarse de estos detalles para centrarse en la funcionalidad propia de la aplicación. Afortunadamente, gracias a una librería llamada Beans Binding y a su fabulosa integración con NetBeans, esto es posible. Para aclarar, no es mi intención hacer una descripción detallada de esta API, sino deseo mostrar como utilizarla a través del soporte que tiene NetBeans para no tener que escribir código.&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_ktBjQvAp4Qo/SjVaNsrGIzI/AAAAAAAAATc/_aku-DSLXqc/s1600-h/menu%5B4%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="menu" border="0" alt="menu" align="left" src="http://lh4.ggpht.com/_ktBjQvAp4Qo/SjVaOLYGjTI/AAAAAAAAATg/QWegaySrwlU/menu_thumb%5B2%5D.jpg?imgmax=800" width="233" height="152" /&gt;&lt;/a&gt; Para empezar, necesitamos crear un nuevo proyecto. Luego creamos la clase Persona, que implementa la interfaz Serializable (esto es importante para convertir nuestra clase en un bean). Para agregar una propiedad, pulsamos las teclas Alt + Insert, lo cual despliega un menú en el que seleccionamos Agregar Propiedad. En la ventana, establecemos los atributos de la propiedad, como se muestra en la figura:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_ktBjQvAp4Qo/SjVaOy-7ylI/AAAAAAAAATk/MtQ_vFRKROQ/s1600-h/ventana%5B18%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="ventana" border="0" alt="ventana" src="http://lh5.ggpht.com/_ktBjQvAp4Qo/SjVaPoj5gBI/AAAAAAAAATo/WFocoF9RyXI/ventana_thumb%5B14%5D.jpg?imgmax=800" width="450" height="349" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p align="justify"&gt;En la figura se resalta que debemos marcar la opción Generar soporte para cambio de propiedad. Esto también es necesario para tratar a la persona como un bean. Sin embargo, la notificación a los oyentes de cambio no es automática, así que la agregaremos nosotros. Para esto, solo es necesario modificar el método setter de cada propiedad (en este caso, el método setter de “nombre” es “setNombre”), escribiendo el siguiente código (las líneas azules son la que escribiremos):&lt;/p&gt;&lt;p&gt;public void setNombre(String nombre) {   &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;String anterior = this.nombre;     &lt;br /&gt;
&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.nombre = nombre;    &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;propertyChangeSupport.firePropertyChange(&amp;quot;nombre&amp;quot;, anterior, nombre);     &lt;br /&gt;
&lt;/font&gt;}&lt;/p&gt;&lt;p align="justify"&gt;Ahora debemos agregar y modificar de la misma manera las siguientes propiedades (todas las propiedades son privadas):&lt;/p&gt;&lt;div align="center"&gt;&lt;table border="1" cellspacing="0" cellpadding="2" width="400" align="center"&gt;&lt;tbody&gt;
&lt;tr&gt;         &lt;td valign="top" width="200"&gt;&lt;strong&gt;NOMBRE&lt;/strong&gt;&lt;/td&gt;          &lt;td valign="top" width="200"&gt;&lt;strong&gt;TIPO&lt;/strong&gt;&lt;/td&gt;       &lt;/tr&gt;
&lt;tr&gt;         &lt;td valign="top" width="200"&gt;edad&lt;/td&gt;          &lt;td valign="top" width="200"&gt;int&lt;/td&gt;       &lt;/tr&gt;
&lt;tr&gt;         &lt;td valign="top" width="200"&gt;varon&lt;/td&gt;          &lt;td valign="top" width="200"&gt;boolean&lt;/td&gt;       &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p align="justify"&gt;Finalmente, vamos a crear unas personas predefinidas para mostrarlas en nuestra interfaz. Primero creamos un constructor pulsando Alt+Insert y seleccionando la opción Constructor. En la ventana emergente seleccionamos las tres propiedades que hemos creado. Luego, escribimos el siguiente método:&lt;/p&gt;&lt;p&gt;public static List&amp;lt;Persona&amp;gt; crearPersonas() {   &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;Persona&amp;gt; personas = new ArrayList&amp;lt;Persona&amp;gt;();    &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; personas.add(new Persona(&amp;quot;Bill Gates&amp;quot;, 45, true));    &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; personas.add(new Persona(&amp;quot;Jennifer López&amp;quot;, 32, false));    &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; personas.add(new Persona(&amp;quot;Linus Torvalds&amp;quot;, 37, true));    &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return personas;    &lt;br /&gt;
}&lt;/p&gt;&lt;p align="justify"&gt;Una vez que tenemos nuestra clase Persona, vamos a trabajar con Beans Binding. Creamos un nuevo Formulario JFrame y le agregamos los siguientes componentes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;     &lt;div align="justify"&gt;Un componente JList para mostrar a las personas&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;     &lt;div align="justify"&gt;Un componente JTextField para mostrar los nombres.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;     &lt;div align="justify"&gt;Un componente JSlider para visualizar la edad.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;     &lt;div align="justify"&gt;Un componente JCheckBox para indicar si es varón o no.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;     &lt;div align="justify"&gt;Componentes JLabel para etiquetar los demás componentes.&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p align="justify"&gt;El diseño de nuestro formulario, después de ajustar el texto de los componentes, debe parecerse a la siguiente figura:&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_ktBjQvAp4Qo/SjVaQO28LKI/AAAAAAAAATs/-0h3al4-rW0/s1600-h/dise%C3%B1o%5B4%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="diseño" border="0" alt="diseño" src="http://lh6.ggpht.com/_ktBjQvAp4Qo/SjVaQpRKKqI/AAAAAAAAATw/hIIbjTwcDFo/dise%C3%B1o_thumb%5B2%5D.jpg?imgmax=800" width="400" height="212" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Ahora vamos a agregar al formulario una propiedad que contenga la lista de personas creada anteriormente. Para esto, vamos a la pestaña Fuente y agregamos la propiedad pulsando Alt+Insertar:&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_ktBjQvAp4Qo/SjVaRGQ64hI/AAAAAAAAAT0/wMJVc-kUuhg/s1600-h/ventana2%5B4%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="ventana2" border="0" alt="ventana2" src="http://lh5.ggpht.com/_ktBjQvAp4Qo/SjVaR9KM_XI/AAAAAAAAAT4/i47CvCVZFYg/ventana2_thumb%5B2%5D.jpg?imgmax=800" width="450" height="308" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Esta vez no marcamos la opción Generar soporte para cambio de propiedad, porque la clase JFrame ya tiene este soporte incorporado. También debemos cambiar el método setter de esta propiedad, sin embargo, en el momento de cambiar el método setter de esta propiedad, en la última línea solo debemos escribir:&lt;/p&gt;&lt;p align="justify"&gt;firePropertyChange(&amp;quot;listaPersonas&amp;quot;, anterior, listaPersonas);&lt;/p&gt;&lt;p align="justify"&gt;Bien, ahora que ya tenemos el origen del enlace, vamos a enlazar nuestros componentes a esta lista. En primer lugar vamos a enlazar el JList con la lista de personas para que se muestren al ejecutar la aplicación. Para algunos componentes, como JList y Jtable, Beans Binding define unas &lt;strong&gt;propiedades virtuales&lt;/strong&gt; para utilizarlas en el enlace. En ambos componentes, se añaden las siguientes propiedades:&lt;/p&gt;&lt;div align="center"&gt;&lt;table border="1" cellspacing="0" cellpadding="2" width="400" align="center"&gt;&lt;tbody&gt;
&lt;tr&gt;         &lt;td valign="top" width="110"&gt;&lt;strong&gt;PROPIEDAD&lt;/strong&gt;&lt;/td&gt;          &lt;td valign="top" width="290"&gt;&lt;strong&gt;DESCRIPCIÓN&lt;/strong&gt;&lt;/td&gt;       &lt;/tr&gt;
&lt;tr&gt;         &lt;td valign="top" width="110"&gt;elements&lt;/td&gt;          &lt;td valign="top" width="290"&gt;           &lt;p align="left"&gt;Una lista que contiene los elementos del componente.&lt;/p&gt;&lt;/td&gt;       &lt;/tr&gt;
&lt;tr&gt;         &lt;td valign="top" width="110"&gt;selectedElement&lt;/td&gt;          &lt;td valign="top" width="290"&gt;           &lt;p align="left"&gt;Una referencia al elemento seleccionado en el componente.&lt;/p&gt;&lt;/td&gt;       &lt;/tr&gt;
&lt;tr&gt;         &lt;td valign="top" width="110"&gt;selectedElements&lt;/td&gt;          &lt;td valign="top" width="290"&gt;           &lt;p align="left"&gt;Una lista que contiene los elementos seleccionados en el componente.&lt;/p&gt;&lt;/td&gt;       &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;/p&gt;&lt;p align="justify"&gt;Nosotros vamos a utilizar la propiedad &lt;strong&gt;elements&lt;/strong&gt; para enlazarla con la lista de personas. Para esto hacemos clic derecho en el JList y seleccionamos la opción elements del submenú Enlazar. Esto nos lleva a la siguiente ventana:&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_ktBjQvAp4Qo/SjVaSvsCk5I/AAAAAAAAAT8/mc3IG7eatbQ/s1600-h/enlace%5B5%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="enlace" border="0" alt="enlace" src="http://lh6.ggpht.com/_ktBjQvAp4Qo/SjVaTJrwWpI/AAAAAAAAAUA/6KliwqpRcVU/enlace_thumb%5B3%5D.jpg?imgmax=800" width="400" height="183" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;En la lista desplegable &lt;strong&gt;Código fuente de enlace&lt;/strong&gt; seleccionamos el item Form, para indicar que la propiedad a la que vamos a enlazar pertenece al objeto formulario. En la lista desplegable &lt;strong&gt;Expresión de enlace&lt;/strong&gt;, seleccionamos la propiedad listaPersonas. En la lista desplegable &lt;strong&gt;Mostrar expresión&lt;/strong&gt; encontramos las propiedades de la clase Persona. Seleccionamos la propiedad nombre para mostrar el nombre de las personas que están en la lista en el JList.&lt;/p&gt;&lt;p align="justify"&gt;Ahora vamos a enlazar los demás componentes. Al seleccionar una persona en el JList se debe mostrar sus datos en los otros componentes. Empecemos por el componente JTextField. Abrimos la ventana Enlazar de la misma forma como lo hicimos con el JList. En la lista desplegable &lt;strong&gt;Código fuente de enlace&lt;/strong&gt; seleccionamos el item jList1 (que es el nombre del componente JList). En la lista desplegable &lt;strong&gt;Expresión de enlace&lt;/strong&gt; buscamos la propiedad virtual selectedElement y desplegamos sus nodos para seleccionar la propiedad nombre de la clase Persona. Esto es porque el JList contiene una lista de objetos Persona, y el elemento seleccionado es un objeto de esta clase. Esto genera una expresión de la forma ${selectedElement.nombre}.&lt;/p&gt;&lt;p align="justify"&gt;Vamos a hacer lo mismo para los demás componentes, utilizando la información de la siguiente tabla:&lt;/p&gt;&lt;div align="center"&gt;&lt;table border="1" cellspacing="0" cellpadding="2" width="400" align="center"&gt;&lt;tbody&gt;
&lt;tr&gt;         &lt;td valign="top" width="107"&gt;&lt;strong&gt;Componente&lt;/strong&gt;&lt;/td&gt;          &lt;td valign="top" width="117"&gt;&lt;strong&gt;Propiedad&lt;/strong&gt;&lt;/td&gt;          &lt;td valign="top" width="175"&gt;&lt;strong&gt;Expresión&lt;/strong&gt;&lt;/td&gt;       &lt;/tr&gt;
&lt;tr&gt;         &lt;td valign="top" width="107"&gt;JSlider&lt;/td&gt;          &lt;td valign="top" width="117"&gt;value&lt;/td&gt;          &lt;td valign="top" width="175"&gt;${selectedElement.edad}&lt;/td&gt;       &lt;/tr&gt;
&lt;tr&gt;         &lt;td valign="top" width="107"&gt;JCheckBox&lt;/td&gt;          &lt;td valign="top" width="117"&gt;selected&lt;/td&gt;          &lt;td valign="top" width="175"&gt;${selectedElement.varon}&lt;/td&gt;       &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p align="justify"&gt;Para probar que el mecanismo de enlace funciona, ejecutamos la aplicación. Si todo ha ido bien el resultado debe parecerse a la figura:&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_ktBjQvAp4Qo/SjVaTq1Rz5I/AAAAAAAAAUE/fUEwaIdkLO8/s1600-h/run%5B5%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="run" border="0" alt="run" src="http://lh6.ggpht.com/_ktBjQvAp4Qo/SjVaUZ9f9WI/AAAAAAAAAUI/InNZdC8s7rA/run_thumb%5B3%5D.jpg?imgmax=800" width="400" height="222" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;Y eso es todo. El API Beans Binding nos libera de crear oyentes e implementar sus métodos para enlazar componentes, y el soporte de NetBeans para esta librería hace esto por nosotros sin escribir código. Puede que el ejemplo sea muy sencillo y trivial, pero de la misma forma como hemos enlazado componentes con una clase común, también podemos hacerlo con una clase entidad que ataque una base de datos, o cualquier cosa. Además, si modificamos las propiedades de las personas con los componentes, por ejemplo si cambiamos el nombre, estos cambios se reflejan automáticamente en los demás componentes y en el objeto Persona modificado.&lt;/p&gt;&lt;p align="justify"&gt;Mas adelante, cuando escriba sobre aplicaciones con Bases de Datos con Java, vamos a ver otras funcionalidades avanzadas de esta API.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Copyright © 2011 Jonathan Muñoz Aleman. Todos los derechos reservados.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1856038649839016004-4524763352508251398?l=javadabaduuu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YJ-YQeUW1rHBQzNiFoux7vX7q8I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YJ-YQeUW1rHBQzNiFoux7vX7q8I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YJ-YQeUW1rHBQzNiFoux7vX7q8I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YJ-YQeUW1rHBQzNiFoux7vX7q8I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fdidE/~4/0qUXz7KHIfE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javadabaduuu.blogspot.com/feeds/4524763352508251398/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://javadabaduuu.blogspot.com/2009/06/enlace-de-datos-con-beans-binding.html#comment-form" title="17 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/4524763352508251398?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/4524763352508251398?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fdidE/~3/0qUXz7KHIfE/enlace-de-datos-con-beans-binding.html" title="Enlace de datos con Beans Binding" /><author><name>Geek Melomano</name><uri>http://www.blogger.com/profile/08645769188131644822</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-6gqWEfG1SpU/TaaF1va0HUI/AAAAAAAABNQ/GyjY0n24njA/s220/Perfil.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_ktBjQvAp4Qo/SjVaOLYGjTI/AAAAAAAAATg/QWegaySrwlU/s72-c/menu_thumb%5B2%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>17</thr:total><feedburner:origLink>http://javadabaduuu.blogspot.com/2009/06/enlace-de-datos-con-beans-binding.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MERHw4eCp7ImA9WxJXEks.&quot;"><id>tag:blogger.com,1999:blog-1856038649839016004.post-7501204637706500434</id><published>2009-06-05T22:47:00.003-05:00</published><updated>2009-06-05T23:10:05.230-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-05T23:10:05.230-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MySQL" /><title>Continuación: MySQL Cluster y MySQL Proxy</title><content type="html">&lt;p align="justify"&gt;Esta entrada responde a un pregunta hecha en un comentario hecho en la entrada anterior acerca de estas dos tecnologías que, la verdad, se explican por si solas debido a sus nombres.&lt;/p&gt;&lt;p align="justify"&gt;MySQL Cluster es una nueva tecnología que permite gestionar varios servidores MySQL convencionales como un cluster, a través de un nuevo motor de almacenamiento en memoria llamado NDB, preparado exactamente para trabajar en estos entornos. La ventaja de este servidor se da en sistemas que requieren de una enorme potencia de almacenamiento, así como la utilización óptima de los recursos disponibles. MySQL Cluster gestiona los cambios hechos en cualquier nodo del cluster para reflejarlos en los demás nodos automáticamente. La siguiente figura muestra un bosquejo de la arquitectura de MySQL Cluster:&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_ktBjQvAp4Qo/SinmlZrKihI/AAAAAAAAASw/s5UoARBX8Oo/s1600-h/cluster-components-1%5B3%5D.png"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: block; FLOAT: none; MARGIN-LEFT: auto; BORDER-TOP: 0px; MARGIN-RIGHT: auto; BORDER-RIGHT: 0px" title="cluster-components-1" border="0" alt="cluster-components-1" src="http://lh4.ggpht.com/_ktBjQvAp4Qo/Sinmq6fnAJI/AAAAAAAAAS0/rD6VCOJ9Xug/cluster-components-1_thumb%5B1%5D.png?imgmax=800" width="388" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Como se puede apreciar, en el sistema existen diversos nodos NDB que interactúan entre sí para satisfacer las peticiones de los servidores MySQL. El mantenimiento de los datos se realiza a través de aplicaciones cliente comunes y corrientes. A continuación, viene un video más informativo sobre MySQL Cluster:&lt;/p&gt;&lt;div style="PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; WIDTH: 425px; PADDING-RIGHT: 0px; DISPLAY: block; FLOAT: none; MARGIN-LEFT: auto; MARGIN-RIGHT: auto; PADDING-TOP: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:70f82c2d-db07-44a2-aea7-92a5e05d2406" class="wlWriterEditableSmartContent"&gt;&lt;div style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-TOP: 0px" id="5354e61f-a485-41d6-a7e1-334f302b0877"&gt;&lt;a href="http://www.youtube.com/watch?v=_A7nS2u0w6s" target="_new"&gt;&lt;img style="BORDER-BOTTOM-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none" alt="" src="http://lh3.ggpht.com/_ktBjQvAp4Qo/Sinmtwe25II/AAAAAAAAAS4/NSn6vbNcZ-g/video0bc870feb564%5B2%5D.jpg?imgmax=800" width="'\" onload="var downlevelDiv = document.getElementById('5354e61f-a485-41d6-a7e1-334f302b0877'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/_A7nS2u0w6s&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=" height="'\" galleryimg="no" type="'\" hl="'en\" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Por otra parte, MySQL Proxy es un middleware que se sitúa entre una aplicación cliente y un servidor MySQL para realizar labores de seguimiento y optimización de la comunicación entre nuestro cliente y nuestro servidor. Permite hacer balance de carga, monitorización de consultas, etc.&lt;/p&gt;&lt;br /&gt;&lt;a href="http://bitacoras.com/votar/anotacion/javadabaduuu.blogspot.com/2009/06/continuacion-mysql-cluster-y-mysql.html"&gt;&lt;img src="http://widgets.bitacoras.com/votar/normal/javadabaduuu.blogspot.com/2009/06/continuacion-mysql-cluster-y-mysql" alt="votar" title="Votar esta anotación en Bitacoras.com" style="vertical-align:middle;border:0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Copyright © 2011 Jonathan Muñoz Aleman. Todos los derechos reservados.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1856038649839016004-7501204637706500434?l=javadabaduuu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8cGA4tbGV5BbnveysI26-fF2Y4A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8cGA4tbGV5BbnveysI26-fF2Y4A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8cGA4tbGV5BbnveysI26-fF2Y4A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8cGA4tbGV5BbnveysI26-fF2Y4A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fdidE/~4/VHMIqcPUuuk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javadabaduuu.blogspot.com/feeds/7501204637706500434/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://javadabaduuu.blogspot.com/2009/06/continuacion-mysql-cluster-y-mysql.html#comment-form" title="1 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/7501204637706500434?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/7501204637706500434?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fdidE/~3/VHMIqcPUuuk/continuacion-mysql-cluster-y-mysql.html" title="Continuación: MySQL Cluster y MySQL Proxy" /><author><name>Geek Melomano</name><uri>http://www.blogger.com/profile/08645769188131644822</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-6gqWEfG1SpU/TaaF1va0HUI/AAAAAAAABNQ/GyjY0n24njA/s220/Perfil.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_ktBjQvAp4Qo/Sinmq6fnAJI/AAAAAAAAAS0/rD6VCOJ9Xug/s72-c/cluster-components-1_thumb%5B1%5D.png?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://javadabaduuu.blogspot.com/2009/06/continuacion-mysql-cluster-y-mysql.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEDR3Y7eCp7ImA9WxJQFk0.&quot;"><id>tag:blogger.com,1999:blog-1856038649839016004.post-7742420361873208869</id><published>2009-05-29T00:18:00.002-05:00</published><updated>2009-05-29T08:27:56.800-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-29T08:27:56.800-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MySQL" /><category scheme="http://www.blogger.com/atom/ns#" term="PostgreSQL" /><title>Paréntesis: Datawarehouse con MySQL y PostgreSQL</title><content type="html">&lt;p align="justify"&gt;Como bien indica el título de esta entrada, voy a hacer un paréntesis en el objetivo de este blog, para responder un comentario de un lector, el cual hace la siguiente pregunta:&lt;/p&gt;&lt;p&gt;&lt;em&gt;“Que tal!!..&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Primeramente te felicito x tu blog esta muy bueno. Posteas muy buenos temas... Mi pregunta es la siguiente: cual crees que es el mejor dbms para implementar un datawarehouse y que sea bueno con transacciones: mysql o postgresql??&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;gracias”&lt;/em&gt;&lt;/p&gt;&lt;p align="justify"&gt;Bien, empezaré diciendo que antes de preocuparse de que DBMS vamos a utilizar, se debe tener cuidado en el diseño del Datawarehouse y su interacción con los Data Marts. Otra recomendación es que siempre es preferible utilizar la tecnología que dominemos mejor. Así obtendremos mejores resultados con mayor facilidad.&lt;/p&gt;&lt;p align="justify"&gt;MySQL posee por defecto el motor de almacenamiento MyISAM que fue pensado desde el inicio para trabajar con Datawarehouses. MySQL optimiza el uso de la memoria y el espacio de almacenamiento para realizar consultas rápidas sobre grandes repositorios de datos. Además posee características que lo hacen ideal para su utilización con Datawarehouses, como la gestión de almacenamiento automático prácticamente sin límites, soporte robusto de indexación, carga paralela de datos, etc.&lt;/p&gt;&lt;p align="justify"&gt;Por otro lado, aunque no conozco muy bien a PostgreSQL, tengo entendido que tiene un modo Datawarehouse y además, es bien sabido que PostgreSQL es el DBMS de software libre que más se acerca a DBMSs más experimentados en Business Intelligence, como Oracle y MS SQL Server. Sin embargo, para optimizarlo para trabajar con Datawarehouse hay que ajustar algunos parámetros del servidor a mano. Además, existe una especie de “distro de PostgreSQL” llamada Bizgre que está más enfocada al trabajo con Datawarehouse.&lt;/p&gt;&lt;p align="justify"&gt;En conclusión, en mi humilde opinión, es mejor utilizar MySQL para implementar un DataWarehouse, pues está mejor preparado para estos menesteres. Espero haber ayudado y gracias por el comentario. En estas semanas he estado algo ocupado con el inicio de clases, y parece que este ciclo va a estar duro, pero me voy a dar un tiempo para postear algo la próxima semana. Promesa es deuda.&lt;/p&gt;&lt;table border="0" cellspacing="0" cellpadding="2" width="400"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;&lt;p align="center"&gt;&lt;a href="http://lh6.ggpht.com/_ktBjQvAp4Qo/Sh9wHM_-ERI/AAAAAAAAASQ/dPcyAeiAfNE/s1600-h/mysql%5B3%5D.png"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="mysql" border="0" alt="mysql" src="http://lh5.ggpht.com/_ktBjQvAp4Qo/Sh9wH58qsJI/AAAAAAAAASU/5LaNoiuOq_o/mysql_thumb%5B1%5D.png?imgmax=800" width="167" height="87" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="200"&gt;&lt;p align="center"&gt;&lt;a href="http://lh3.ggpht.com/_ktBjQvAp4Qo/Sh9wIv19BJI/AAAAAAAAASY/qpp1848CNg0/s1600-h/logo_postgres%5B3%5D.jpg"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="logo_postgres" border="0" alt="logo_postgres" src="http://lh5.ggpht.com/_ktBjQvAp4Qo/Sh9wKZlocTI/AAAAAAAAASc/uD0JlrjjlYI/logo_postgres_thumb%5B1%5D.jpg?imgmax=800" width="125" height="82" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;a href="http://bitacoras.com/anotaciones/enlace_a_la_anotacion"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; VERTICAL-ALIGN: middle; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="Votar esta anotación en Bitacoras.com" alt="votar" src="http://widgets.bitacoras.com/votar/normal/enlace_a_la_anotacion" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Copyright © 2011 Jonathan Muñoz Aleman. Todos los derechos reservados.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1856038649839016004-7742420361873208869?l=javadabaduuu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/W4-7nGK0eWrVdSXfVDYRW7GDOdo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/W4-7nGK0eWrVdSXfVDYRW7GDOdo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/W4-7nGK0eWrVdSXfVDYRW7GDOdo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/W4-7nGK0eWrVdSXfVDYRW7GDOdo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fdidE/~4/ElZv680Q6Eg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javadabaduuu.blogspot.com/feeds/7742420361873208869/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://javadabaduuu.blogspot.com/2009/05/parentesis-datawarehouse-con-mysql-y.html#comment-form" title="5 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/7742420361873208869?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/7742420361873208869?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fdidE/~3/ElZv680Q6Eg/parentesis-datawarehouse-con-mysql-y.html" title="Paréntesis: Datawarehouse con MySQL y PostgreSQL" /><author><name>Geek Melomano</name><uri>http://www.blogger.com/profile/08645769188131644822</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-6gqWEfG1SpU/TaaF1va0HUI/AAAAAAAABNQ/GyjY0n24njA/s220/Perfil.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_ktBjQvAp4Qo/Sh9wH58qsJI/AAAAAAAAASU/5LaNoiuOq_o/s72-c/mysql_thumb%5B1%5D.png?imgmax=800" height="72" width="72" /><thr:total>5</thr:total><feedburner:origLink>http://javadabaduuu.blogspot.com/2009/05/parentesis-datawarehouse-con-mysql-y.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04GSXk9eip7ImA9WhZVEEk.&quot;"><id>tag:blogger.com,1999:blog-1856038649839016004.post-6539315323314657686</id><published>2009-04-20T17:49:00.002-05:00</published><updated>2011-05-22T02:38:48.762-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-22T02:38:48.762-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Desktop" /><category scheme="http://www.blogger.com/atom/ns#" term="Java SE" /><category scheme="http://www.blogger.com/atom/ns#" term="NetBeans" /><title>Desarrollo de aplicaciones con Swing Application Framework</title><content type="html">&lt;p align="justify"&gt;Seguramente lo que todos los programadores empezamos haciendo es desarrollar aplicaciones de escritorio. Sean programas que realizan cálculos simples o sistemas completos con conexión a una base de datos, estas aplicaciones poseen un conjunto de características comunes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Tienen interfaces gráficas (GUI). &lt;/li&gt;
&lt;li&gt;Tienen un &lt;strong&gt;ciclo de vida&lt;/strong&gt;, desde la carga hasta la finalización de la aplicación. &lt;/li&gt;
&lt;li&gt;Manipulan &lt;strong&gt;recursos&lt;/strong&gt; como imágenes, fuentes, colores, etc. &lt;/li&gt;
&lt;li&gt;Ejecutan &lt;strong&gt;acciones&lt;/strong&gt; en respuesta a ciertos &lt;strong&gt;eventos &lt;/strong&gt;lanzados por el usuario. &lt;/li&gt;
&lt;li&gt;Tienen un &lt;strong&gt;estado de sesión&lt;/strong&gt; (hay programas que recuerdan el tamaño que tuvo la ventana en la última ejecución). &lt;/li&gt;
&lt;/ul&gt;&lt;p align="justify"&gt;Muchas veces sin darnos cuenta cada vez que creamos una aplicación escribimos código que hace estas tareas de manera repetitiva. De esto se dieron cuenta en la comunidad de java.net y desarrollaron un API muy útil que se encarga de gestionar estos aspectos. El objetivo de este tutorial es demostrar cómo se puede desarrollar una aplicación de escritorio utilizando el API Swing Application Framework con las herramientas de NetBeans disponibles para esto.&lt;/p&gt;&lt;p align="justify"&gt;Empecemos. Debemos crear un nuevo proyecto de tipo Aplicación de Escritorio, como se muestra en la figura. Luego escribimos un nombre para el proyecto y especificamos que es una aplicación básica (utilizaremos una aplicación de base de datos en otro tutorial). Finalmente terminamos el asistente y tendremos una aplicación completamente funcional que ya tiene algunas características especiales.&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_ktBjQvAp4Qo/Sez7Wjb0lGI/AAAAAAAAANo/LE9bTCd9-Bc/s1600-h/nuevo%5B4%5D.png"&gt;&lt;img title="nuevo" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="348" alt="nuevo" src="http://lh6.ggpht.com/_ktBjQvAp4Qo/Sez7ZPRFHfI/AAAAAAAAANs/DPHALrWBSJc/nuevo_thumb%5B1%5D.png?imgmax=800" width="504" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Vemos que la aplicación creada tiene una clase principal (NombreProyectoApp), un marco principal con un menú y una barra de estado (NombreProyectoView) y una ventana de diálogo Acerca de (NombreProyectoAboutBox). Si ejecutamos la aplicación, veremos que el marco principal se centra en la pantalla, y los menús tienen la funcionalidad para salir de la aplicación y mostrar el diálogo Acerca de. Además, si cambiamos el tamaño del marco principal, salimos de la aplicación y la ejecutamos de nuevo, veremos que la aplicación recuerda el tamaño anterior.&lt;/p&gt;&lt;p align="justify"&gt;Vamos a diseñar el marco principal. Agregamos una etiqueta desde la paleta y la expandimos para que ocupe la mayor parte del panel central. En la pestaña Propiedades podemos personalizar esta etiqueta de la siguiente manera, haciendo clic en el botón … de cada propiedad:&lt;/p&gt;&lt;div align="center"&gt;&lt;table cellspacing="0" cellpadding="2" width="400" align="center" border="1"&gt;&lt;tbody&gt;
&lt;tr&gt;         &lt;td valign="top" width="200"&gt;&lt;strong&gt;&lt;font face="Segoe UI" color="#000080"&gt;PROPIEDAD&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;          &lt;td valign="top" width="200"&gt;&lt;strong&gt;&lt;font face="Segoe UI" color="#000080"&gt;VALOR&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;       &lt;/tr&gt;
&lt;tr&gt;         &lt;td valign="top" width="200"&gt;background&lt;/td&gt;          &lt;td valign="top" width="200"&gt;negro&lt;/td&gt;       &lt;/tr&gt;
&lt;tr&gt;         &lt;td valign="top" width="200"&gt;font&lt;/td&gt;          &lt;td valign="top" width="200"&gt;Segoe UI 24 Negrita&lt;/td&gt;       &lt;/tr&gt;
&lt;tr&gt;         &lt;td valign="top" width="200"&gt;foreground&lt;/td&gt;          &lt;td valign="top" width="200"&gt;blanco&lt;/td&gt;       &lt;/tr&gt;
&lt;tr&gt;         &lt;td valign="top" width="200"&gt;icon&lt;/td&gt;          &lt;td valign="top" width="200"&gt;Al gusto&lt;/td&gt;       &lt;/tr&gt;
&lt;tr&gt;         &lt;td valign="top" width="200"&gt;text&lt;/td&gt;          &lt;td valign="top" width="200"&gt;Hola mundo&lt;/td&gt;       &lt;/tr&gt;
&lt;tr&gt;         &lt;td valign="top" width="200"&gt;opaque&lt;/td&gt;          &lt;td valign="top" width="200"&gt;true&lt;/td&gt;       &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_ktBjQvAp4Qo/Sez7cytv16I/AAAAAAAAANw/63AVcDYoX-Y/s1600-h/dise%C3%B1o%5B3%5D.png"&gt;&lt;img title="diseño" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="404" alt="diseño" src="http://lh4.ggpht.com/_ktBjQvAp4Qo/Sez7f1yIKbI/AAAAAAAAAN0/7eWJwEJOlA0/dise%C3%B1o_thumb%5B1%5D.png?imgmax=800" width="504" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;El resultado se puede parecer a la figura anterior. Si se habrán fijado, cuando personalizamos una propiedad en su ventana, en la parte inferior existe una opción que dice “Definir como un recurso”. El API Swing Application Framework gestiona estas propiedades como recursos de la aplicación en archivos de propiedades, uno por cada clase, con nombres jerárquicos, como “etiqueta.texto = Hola Mundo”. De esta manera, se puede personalizar también el menú principal y el diálogo Acerca.&lt;/p&gt;&lt;p align="justify"&gt;Debido a que el framework se encarga del ciclo de vida de la aplicación, también se encarga de la finalización de ésta, de modo que podamos realizar cualquier tarea antes de salir del programa de manera segura. Esto resulta vital para liberar recursos, cerrar conexiones a bases de datos o pedir al usuario una confirmación. Esto se hace agregando un oyente &lt;strong&gt;ExitListener&lt;/strong&gt; a la clase principal (la que termina en App) en el método &lt;strong&gt;startup&lt;/strong&gt; (que es el método que inicializa la aplicación), antes de llamar al método &lt;strong&gt;show&lt;/strong&gt;. El código es el siguiente (las líneas de azul son las que escribiremos):&lt;/p&gt;&lt;p&gt;@Override protected void startup() {    &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;addExitListener(new ExitListener() {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public boolean canExit(EventObject event) {       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return JOptionPane.showConfirmDialog(getMainFrame(),       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;¿Desea salir?&amp;quot;) == JOptionPane.YES_OPTION;       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void willExit(EventObject event) {}      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });       &lt;br /&gt;
&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; show(new AplicacionEscritorioView(this));     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;&lt;p&gt;Si ejecutan la aplicación e intentan salir, sea por la opción de menú Exit o cerrando la ventana, aparece el mensaje de confirmación.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p align="justify"&gt;Como mencioné antes, todas las aplicaciones ejecutan acciones como respuesta a eventos generados por los componentes de la interfaz de usuario. Podemos especificar estas acciones de manera más orientada a objetos a través de la anotación &lt;strong&gt;@Action&lt;/strong&gt;, creando un método que tenga esta anotación y asociando dicho objeto a los componentes que deban ejecutar esa acción.&lt;/p&gt;&lt;p align="justify"&gt;Para ejemplificar esto, agregaremos una opción de menú al menú File del marco de la aplicación. Pero el texto del menú no debe ser tratado como un recurso, pues estos datos se obtienen de la acción, y la acción es tratada como un recurso más. Debemos especificar que no se desea que el texto sea un recurso en la ficha de Propiedades. El aspecto del diseño debe parecerse al de la figura:&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_ktBjQvAp4Qo/Sez7gyaMjzI/AAAAAAAAAN4/719LgUYBX9I/s1600-h/recurso%5B7%5D.png"&gt;&lt;img title="recurso" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="302" alt="recurso" src="http://lh6.ggpht.com/_ktBjQvAp4Qo/Sez7iL95xVI/AAAAAAAAAN8/qfsWosH13Yc/recurso_thumb%5B3%5D.png?imgmax=800" width="404" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_ktBjQvAp4Qo/Sez7ltxq7GI/AAAAAAAAAOA/An8QvswbMGY/s1600-h/dise%C3%B1o2%5B3%5D.png"&gt;&lt;img title="diseño2" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="408" alt="diseño2" src="http://lh4.ggpht.com/_ktBjQvAp4Qo/Sez7ov2114I/AAAAAAAAAOE/L6L9y6HoCLw/dise%C3%B1o2_thumb%5B1%5D.png?imgmax=800" width="504" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Luego, en la propiedad &lt;strong&gt;action&lt;/strong&gt; hacemos clic en el botón ‘…’. En el diálogo resultante podremos elegir una acción o definir una nueva, seleccionando la opción Crear acción nueva del cuadro combinado Acción. En clase de acción podemos dejar la clase del marco. En método de acción, ingresamos el nombre del método que soportará la acción. También podemos especificar los atributos de la acción como un nombre, una sugerencia, una combinación de teclas aceleradoras y un ícono.&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_ktBjQvAp4Qo/Sez7q_xy5qI/AAAAAAAAAOI/l9-i6k9Pbf8/s1600-h/accion%5B5%5D.png"&gt;&lt;img title="accion" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="437" alt="accion" src="http://lh6.ggpht.com/_ktBjQvAp4Qo/Sez7slsXFUI/AAAAAAAAAOM/3tIlKXQEg1A/accion_thumb%5B3%5D.png?imgmax=800" width="404" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Al aceptar y crear la acción vemos que el diseño del marco se actualiza. También vemos que el método solicitarMensaje se ha creado y está listo para escribir código en él. Vamos a hacerlo:&lt;/p&gt;&lt;p&gt;@Action public void solicitarMensaje() {    &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;String mensaje = JOptionPane.showInputDialog(&amp;quot;Ingrese un mensaje&amp;quot;);      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jLabel1.setText(mensaje);       &lt;br /&gt;
&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;&lt;p align="justify"&gt;Ahora ejecute su aplicación y verá los resultados esperados. Una gran ventaja que obtenemos del uso de las acciones es que podemos reutilizar el código en otro componente que tenga que ejecutar la misma acción. Podríamos tener un botón de una barra de herramientas que haga lo mismo, y sólo tendríamos que asociar la acción creada a la propiedad &lt;strong&gt;action&lt;/strong&gt; de éste.&lt;/p&gt;&lt;p align="justify"&gt;En ocasiones, podemos necesitar acciones que&amp;#160; se ejecuten en un hilo diferente al de la manipulación de eventos, quizá porque la tarea a realizar va a requerir un largo tiempo porque debe acceder al sistema de ficheros o a la red. En estos casos debemos definir &lt;strong&gt;tareas&lt;/strong&gt; que se ejecuten en segundo plano. El proceso es el mismo que para definir una acción, solo que debemos marcar la casilla “Tarea en segundo plano”. Agreguemos una opción de menú para visualizar este concepto.&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_ktBjQvAp4Qo/Sez7vEip7ZI/AAAAAAAAAOQ/7UsxUNB6vys/s1600-h/tarea%5B3%5D.png"&gt;&lt;img title="tarea" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="418" alt="tarea" src="http://lh5.ggpht.com/_ktBjQvAp4Qo/Sez7w2tNw4I/AAAAAAAAAOU/ZNDGqB0IF6E/tarea_thumb%5B1%5D.png?imgmax=800" width="404" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Vemos que se agrega código adicional en la clase. Se ha creado una acción que devuelve un objeto que deriva de &lt;strong&gt;Task&lt;/strong&gt;, que representa una tarea monitorizable que se ejecuta en segundo plano. Dicho objeto sobreescribe dos métodos de su superclase. El más importante es &lt;strong&gt;doInBackground&lt;/strong&gt;, en el cual se sitúa el código que se desea ejecutar en segundo plano. Vamos a hacer algo sencillo. Cada segundo se mostrará un conteo en la barra de estados. El código es el siguiente:&lt;/p&gt;&lt;p&gt;@Override protected Object doInBackground() &lt;font color="#0000ff"&gt;throws InterruptedException&lt;/font&gt; {     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;for(int i = 0; i &amp;lt; 1000; i++) {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; setMessage(&amp;quot;Contando... [&amp;quot; + i + &amp;quot;]&amp;quot;);       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Thread.sleep(1000);       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; setProgress(i, 0, 999);       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Thread.sleep(1000L);       &lt;br /&gt;
&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return null;&amp;#160; // return your result     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;&lt;p align="justify"&gt;Al ejecutar la aplicación podemos apreciar que, al hacer clic en la opción de menú, se inicia un conteo en la barra de estado que , incluso activa una barra de progreso y una animación conforme avanza el conteo. Lo que sucede es que NetBeans ha agregado por nosotros un &lt;strong&gt;monitorizador de tareas&lt;/strong&gt;, que se encarga de mostrar el progreso de cada tarea en la barra de estados con estos efectos. Además, si intentamos cambiar el mensaje de la etiqueta, o salir de la aplicación, se puede hacer, debido a que el conteo corre en segundo plano y no bloquea el hilo de manipulación de eventos de Swing.&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_ktBjQvAp4Qo/Sez8Dmq8G3I/AAAAAAAAAOc/a1UO7rciFqc/s1600-h/aplicacion%5B5%5D.png"&gt;&lt;img title="aplicacion" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="289" alt="aplicacion" src="http://lh4.ggpht.com/_ktBjQvAp4Qo/Sez8E_9E16I/AAAAAAAAAOg/KI28pTo7eQg/aplicacion_thumb%5B3%5D.png?imgmax=800" width="354" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;En conclusión, con el API Swing Application Framework y el IDE NetBeans podemos crear aplicaciones de escritorio con características y comportamiento profesionales de manera más práctica y eficiente. Con un poco de imaginación se pueden hacer grandes cosas con lo que hemos visto en este tutorial. La mayoría de aplicaciones del mercado se benefician de esta API, ¿por qué nosotros no? Suerte.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Copyright © 2011 Jonathan Muñoz Aleman. Todos los derechos reservados.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1856038649839016004-6539315323314657686?l=javadabaduuu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1UMk5DpfAGXwWyjb02BNUcZunt8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1UMk5DpfAGXwWyjb02BNUcZunt8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1UMk5DpfAGXwWyjb02BNUcZunt8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1UMk5DpfAGXwWyjb02BNUcZunt8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fdidE/~4/ykegJ22BDdM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javadabaduuu.blogspot.com/feeds/6539315323314657686/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://javadabaduuu.blogspot.com/2009/04/desarrollo-de-aplicaciones-con-swing.html#comment-form" title="4 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/6539315323314657686?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/6539315323314657686?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fdidE/~3/ykegJ22BDdM/desarrollo-de-aplicaciones-con-swing.html" title="Desarrollo de aplicaciones con Swing Application Framework" /><author><name>Geek Melomano</name><uri>http://www.blogger.com/profile/08645769188131644822</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-6gqWEfG1SpU/TaaF1va0HUI/AAAAAAAABNQ/GyjY0n24njA/s220/Perfil.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_ktBjQvAp4Qo/Sez7ZPRFHfI/AAAAAAAAANs/DPHALrWBSJc/s72-c/nuevo_thumb%5B1%5D.png?imgmax=800" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://javadabaduuu.blogspot.com/2009/04/desarrollo-de-aplicaciones-con-swing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08MQ3s9fip7ImA9WhZVEEk.&quot;"><id>tag:blogger.com,1999:blog-1856038649839016004.post-6068216968350615676</id><published>2009-04-19T20:55:00.002-05:00</published><updated>2011-05-22T02:38:02.566-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-22T02:38:02.566-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Java ME" /><category scheme="http://www.blogger.com/atom/ns#" term="Movil" /><category scheme="http://www.blogger.com/atom/ns#" term="NetBeans" /><title>Desarrollo de aplicaciones móviles con Java ME, MIDP 2.0 y CLDC 1.1</title><content type="html">&lt;p align="justify"&gt;Uno de los objetivos principales que Sun Microsystems tuvo al crear el lenguaje Java, fue que se pudiera ejecutar en dispositivos electrónicos pequeños como electrodomésticos inteligentes y kioscos de Internet. Aunque nunca llegó a ser un estándar en estos entornos, cuando se produjo el bum de los dispositivos móviles, como teléfonos celulares, PDAs y Pocket PCs, la tecnología Java no se quedó atrás y se adaptó para ayudar a que esta naciente industria se asentará en el mercado. Hoy en día, no hay celulares que no tengan una KVM (Kilo Virtual Machine, la máquina virtual de Java para móviles) con una implementación de Java ME; y la mayoría de los juegos disponibles están desarrollados con esta plataforma.&lt;/p&gt;&lt;p align="justify"&gt;Resulta interesante poder programar para nuestro propio celular de manera fácil y elegante, y es muy emocionante jugar con un programa de tu “puño y tecla”. Por eso, voy a compartir esta sensación en varios tutoriales que visualizan de manera general como se desarrolla una aplicación para un celular utilizando la plataforma Java ME, las especificaciones MIDP y CLDC, y el IDE NetBeans. Es demás decir que estos tutoriales muestran cómo hacer esto de manera fácil y rápida, valiéndose de las herramientas disponibles en el IDE. Además, para ver las aplicaciones corriendo en la vida real, necesitarán un celular con un cable de conexión USB. Para un análisis más detallado de las APIs, existe una infinidad de información en Internet.&lt;/p&gt;&lt;p align="justify"&gt;Para empezar, debemos crear un nuevo proyecto de tipo Mobile Application, como se ve en la figura. Luego de darle un nombre al proyecto y aceptar las opciones por defecto, podemos apreciar la clase HelloMIDlet creada, que es la clase principal de la aplicación, en cuatro vistas diferentes:&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_ktBjQvAp4Qo/SevV1z9XaCI/AAAAAAAAAMo/tMsao3TLdEQ/s1600-h/nuevo%5B4%5D.png"&gt;&lt;img title="Asistente de creación de proyectos" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" height="347" alt="Asistente de creación de proyectos" src="http://lh5.ggpht.com/_ktBjQvAp4Qo/SevV3_z-FRI/AAAAAAAAAMs/_wG9OTIv44M/nuevo_thumb%5B2%5D.png?imgmax=800" width="504" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;     &lt;div&gt;Source: Permite modificar el código fuente de la clase HelloMIDlet.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;     &lt;div&gt;Screen: Permite modificar el diseño de la interfaz gráfica de la aplicación.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;     &lt;div&gt;Flow: Muestra el flujo de la interacción entre los objetos de la aplicación.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;     &lt;div&gt;Analyzer: Sólo muestra algunas notificaciones. No usaremos esta vista.&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p align="justify"&gt;Como vemos en la vista Screen, la aplicación mostrará por defecto el archiconocido mensaje “Hola Mundo”. Por ahora, lo único que haremos es personalizar este mensaje; en otros tutoriales veremos cómo hacer aplicaciones más complejas que está. El objetivo es ver cómo se crean aplicaciones móviles con NetBeans, cómo se ejecutan con el emulador de Sun y cómo preparar e instalar una aplicación en un celular real.&lt;/p&gt;&lt;p align="justify"&gt;Sin embargo, podemos personalizar un poco el formulario y el mensaje mostrado sin salir de la vista Screen, utilizando la ficha Propiedades a la derecha del IDE, como vemos a continuación:&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_ktBjQvAp4Qo/SevV64EKicI/AAAAAAAAAMw/H2RHITqqvlM/s1600-h/dise%C3%B1o%5B4%5D.png"&gt;&lt;img title="Diseño de la aplicación" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" height="366" alt="Diseño de la aplicación" src="http://lh6.ggpht.com/_ktBjQvAp4Qo/SevV9ByqYBI/AAAAAAAAAM0/HSb1BcwCRUI/dise%C3%B1o_thumb%5B2%5D.png?imgmax=800" width="504" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Asimismo, podemos personalizar la configuración principal del proyecto en la ficha Proyectos a la izquierda del IDE, haciendo anticlic en el nombre del proyecto y eligiendo Propiedades, como se aprecia en la figura:&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_ktBjQvAp4Qo/SevV_iKmcUI/AAAAAAAAAM4/ATrPdJwVFnw/s1600-h/proyecto%5B3%5D.png"&gt;&lt;img title="proyecto" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" height="402" alt="proyecto" src="http://lh6.ggpht.com/_ktBjQvAp4Qo/SevWBeglOuI/AAAAAAAAANA/N7Aj1vWL-ME/proyecto_thumb%5B1%5D.png?imgmax=800" width="504" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Para ejecutar la aplicación, se puede hacer clic en el botón verde la barra de herramientas o presionar F6. Los resultados se muestran en la figura:&lt;/p&gt;&lt;p align="justify"&gt;&lt;img title="emulador" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" height="504" alt="emulador" src="http://lh3.ggpht.com/_ktBjQvAp4Qo/SevWDR7iWqI/AAAAAAAAANE/uOtJmr816aE/emulador_thumb%5B4%5D.png?imgmax=800" width="225" border="0" /&gt; &lt;/p&gt;&lt;p align="justify"&gt;Los archivos que se instalan en el celular se encuentran en la carpeta &lt;strong&gt;dist&lt;/strong&gt;, dentro de la carpeta del proyecto. Son los archivos .jar y .jad los que serán copiados al celular. El proceso de instalación de estos archivos difiere debido a las diversas marcas y modelos de celulares (en algunos sólo es necesario copiar el archivo jar), pero básicamente solo es necesario una copia común de estos archivos a la unidad de almacenamiento del celular.&lt;/p&gt;&lt;p align="justify"&gt;Y eso es todo, espero que les sirva de introducción a la programación móvil. Como dije, más adelante escribiré más detalladamente las APIs necesarias para una programación más seria.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Copyright © 2011 Jonathan Muñoz Aleman. Todos los derechos reservados.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1856038649839016004-6068216968350615676?l=javadabaduuu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YLOfU6NqK6VhKrPw6jvWpWujWXs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YLOfU6NqK6VhKrPw6jvWpWujWXs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YLOfU6NqK6VhKrPw6jvWpWujWXs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YLOfU6NqK6VhKrPw6jvWpWujWXs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fdidE/~4/WwUqF-787P0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javadabaduuu.blogspot.com/feeds/6068216968350615676/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://javadabaduuu.blogspot.com/2009/04/desarrollo-de-aplicaciones-moviles-con.html#comment-form" title="9 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/6068216968350615676?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/6068216968350615676?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fdidE/~3/WwUqF-787P0/desarrollo-de-aplicaciones-moviles-con.html" title="Desarrollo de aplicaciones móviles con Java ME, MIDP 2.0 y CLDC 1.1" /><author><name>Geek Melomano</name><uri>http://www.blogger.com/profile/08645769188131644822</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-6gqWEfG1SpU/TaaF1va0HUI/AAAAAAAABNQ/GyjY0n24njA/s220/Perfil.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_ktBjQvAp4Qo/SevV3_z-FRI/AAAAAAAAAMs/_wG9OTIv44M/s72-c/nuevo_thumb%5B2%5D.png?imgmax=800" height="72" width="72" /><thr:total>9</thr:total><feedburner:origLink>http://javadabaduuu.blogspot.com/2009/04/desarrollo-de-aplicaciones-moviles-con.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08HQHw6fCp7ImA9WhZVEEk.&quot;"><id>tag:blogger.com,1999:blog-1856038649839016004.post-4170220317704381627</id><published>2009-04-19T14:19:00.002-05:00</published><updated>2011-05-22T02:37:11.214-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-22T02:37:11.214-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IDE" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="NetBeans" /><title>Instalación de NetBeans™ IDE</title><content type="html">&lt;p align="justify"&gt;Aunque a algunas personas les parezca una exageración esta entrada, voy a hacer un tutorial de como instalar el IDE NetBeans™ por dos razones. Una es que en un grupo de Sonico encontré una chica paraguaya que pedía ayuda en este tema. La segunda es que, como mencioné en la entrada anterior, voy a utilizar esta herramienta para el desarrollo de todos los temas de este blog, y no quiero arriesgarme a que alguna persona tenga problemas al respecto.&lt;/p&gt;&lt;p align="justify"&gt;Cabe mencionar que antes de instalar NetBeans™ debemos tener instalado el JDK (Java Development Kit). La versión actual es la 6 Update 13 y es la que tengo en mi ordenador. En la &lt;a href="http://java.sun.com/javase/downloads/?intcmp=1281" target="_blank"&gt;página de descarga del JDK&lt;/a&gt; existen diversas opciones para descargar, incluso hay se puede descargar un instalador que incluye tanto al JDK como al NetBeans™.&lt;/p&gt;&lt;p align="justify"&gt;Bien, la versión más reciente, estable y en español de NetBeans™ es la 6.5 y esa es la que voy a utilizar. La versión 6.5.1 sólo está soportada en inglés. También esta disponible la versión 6.7, pero es una versión Milestone, que es como una beta, así que no es recomendable su instalación en un entorno de producción. Existen dos formas de instalar este entorno de manera completa: descargando el paquete completo; o descargando e instalando uno por uno los paquetes individuales. Para hacer las cosas fáciles vamos a descargar e instalar el paquete completo, después de todo el instalador es configurable y después de la instalación se pueden quitar algunos módulos.&lt;/p&gt;&lt;p align="justify"&gt;Primero descargaremos el &lt;a href="http://bits.netbeans.org/netbeans/6.5/community/latest/ml/" target="_blank"&gt;paquete de instalación de NetBeans™ 6.5 en español&lt;/a&gt;. La versión que utilizaremos es la de 199 MB, que incluye el soporte para Java SE, Web y EE, ME y los servidores Tomcat y Glassfish. En Windows, el instalador es un archivo .exe convencional. En Linux,&amp;#160; el instalador es un archivo .sh que se ejecuta en el terminal con el comando sh de la siguiente forma:&lt;/p&gt;&lt;p align="center"&gt;sh&amp;#160; netbeans-6.5-ml-java-linux.sh&lt;/p&gt;&lt;p align="justify"&gt;Al iniciar el instalador, se puede hacer clic en el botón Personalizar para elegir los módulos que se desea instalar como se puede apreciar en la figura. Los más importantes, y los que voy a utilizar en este blog, son los que están marcados en la figura&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_ktBjQvAp4Qo/Set5RG1DNrI/AAAAAAAAAMg/R3i15-jZ_ew/s1600-h/Sin%20t%C3%ADtulo-1%5B8%5D.png"&gt;&lt;img title="Sin título-1" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" height="390" alt="Sin título-1" src="http://lh4.ggpht.com/_ktBjQvAp4Qo/Set5SzW9YVI/AAAAAAAAAMk/0Ghofajac7s/Sin%20t%C3%ADtulo-1_thumb%5B6%5D.png?imgmax=800" width="504" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Luego de seguir con los pasos del asistente se tendrá el IDE NetBeans completa y correctamente instalado. Si se presentará algún problema, por favor, comentarlo en esta entrada o mandarme un mensaje a mi &lt;a href="mailto:geek.melomano(at)gmail.com"&gt;correo&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Copyright © 2011 Jonathan Muñoz Aleman. Todos los derechos reservados.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1856038649839016004-4170220317704381627?l=javadabaduuu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1ugcBnvvHUPRUFVx44uVHwcmGzU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1ugcBnvvHUPRUFVx44uVHwcmGzU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1ugcBnvvHUPRUFVx44uVHwcmGzU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1ugcBnvvHUPRUFVx44uVHwcmGzU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fdidE/~4/8V-7uKQ7cJE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javadabaduuu.blogspot.com/feeds/4170220317704381627/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://javadabaduuu.blogspot.com/2009/04/instalacion-de-netbeans-ide.html#comment-form" title="0 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/4170220317704381627?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/4170220317704381627?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fdidE/~3/8V-7uKQ7cJE/instalacion-de-netbeans-ide.html" title="Instalación de NetBeans™ IDE" /><author><name>Geek Melomano</name><uri>http://www.blogger.com/profile/08645769188131644822</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-6gqWEfG1SpU/TaaF1va0HUI/AAAAAAAABNQ/GyjY0n24njA/s220/Perfil.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_ktBjQvAp4Qo/Set5SzW9YVI/AAAAAAAAAMk/0Ghofajac7s/s72-c/Sin%20t%C3%ADtulo-1_thumb%5B6%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://javadabaduuu.blogspot.com/2009/04/instalacion-de-netbeans-ide.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AGQXs_fip7ImA9WxJTEUg.&quot;"><id>tag:blogger.com,1999:blog-1856038649839016004.post-3005373728047129750</id><published>2009-04-19T11:48:00.001-05:00</published><updated>2009-04-19T11:48:40.546-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-19T11:48:40.546-05:00</app:edited><title>Introducción</title><content type="html">&lt;p align="justify"&gt;Hola, que tal a todos los que se den un tiempo para leer este blog, les doy la bienvenida y los felicito por su interés en lo que pueda ofrecerles para aprender algo más de esta hermosa tecnología llamada Java. &lt;/p&gt;  &lt;p align="justify"&gt;Mi objetivo es cubrir varios aspectos de las tres plataformas conocidas: Java SE, ME y EE, y cubrir temas de diversa complejidad, desde lo básico como la utilización de las APIs, programación en AWT y Swing, multithreading, conexiones a BD, i18n, XML, y utilización de APIs externas para facilitar su trabajo. En cuanto a Java ME se verá como escribir aplicaciones para móviles utilizando MIDP 2.0 y CLDC 1.1. También realizaré tutoriales sobre Java en la Web, desde utilización de Servlets y JSP hasta, si se puede, desarrollo de sistemas utilizando un servidor de aplicaciones como Glassfish y algún framework como JSF, Struts o Spring.&lt;/p&gt;  &lt;p align="justify"&gt;Cabe mencionar que no es mi intención desarrollar estos temas en una gran profundidad, pues, por una parte, para eso es necesario un conocimiento avanzado de las características del lenguaje y de las APIs básicas de Java; por otro lado, en mi modesta experiencia, para comprender a fondo estos temas es necesario programar “a mano”, o sea, sin ayuda de un IDE y esto, para muchos, es aburrido y anticuado; además a menudo se cuenta con poco tiempo para desarrollar un proyecto y es mejor echar mano de un buen IDE.&lt;/p&gt;  &lt;p align="justify"&gt;En conclusión, el desarrollo de los temas se hará utilizando un IDE, explícitamente, emplearé NetBeans™ y me enfocaré en cómo se puede sacar más provecho a las características mencionadas antes en este excelente IDE. Sería demasiado para este blog tratar de conectarse a una BD “a mano” utilizando la API de JDBC, pudiendo utilizar NetBeans™ con un framework como TopLink (aunque es emocionante hacerlo: nunca olvidaré la primera vez que lo hice).&lt;/p&gt;  &lt;p align="justify"&gt;Espero que este blog resulte provechoso para todos, solo les pido que si tienen algún comentario, lo hagan en cada entrada, o me manden un mensaje a mi &lt;a href="mailto:geek.melomano(at)gmail.com"&gt;correo&lt;/a&gt;. Muchas gracias.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;Copyright © 2011 Jonathan Muñoz Aleman. Todos los derechos reservados.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1856038649839016004-3005373728047129750?l=javadabaduuu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4v6jDuZULeNyqWCd8mAC0tFd7DE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4v6jDuZULeNyqWCd8mAC0tFd7DE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4v6jDuZULeNyqWCd8mAC0tFd7DE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4v6jDuZULeNyqWCd8mAC0tFd7DE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fdidE/~4/9rqbGx72uZ4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javadabaduuu.blogspot.com/feeds/3005373728047129750/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://javadabaduuu.blogspot.com/2009/04/introduccion.html#comment-form" title="0 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/3005373728047129750?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1856038649839016004/posts/default/3005373728047129750?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fdidE/~3/9rqbGx72uZ4/introduccion.html" title="Introducción" /><author><name>Geek Melomano</name><uri>http://www.blogger.com/profile/08645769188131644822</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-6gqWEfG1SpU/TaaF1va0HUI/AAAAAAAABNQ/GyjY0n24njA/s220/Perfil.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://javadabaduuu.blogspot.com/2009/04/introduccion.html</feedburner:origLink></entry></feed>

