<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Noticias javaHispano.org</title>
    <link>http://www.javahispano.org/noticias.xml</link>
    <description>AsociacióavaHispano. Tu Lenguaje, tu comunidad</description>
    <language>es</language>
    <dc:language>es</dc:language>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/javahispano_noticias" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="javahispano_noticias" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Opiniones acerca de la adquisición de Sun por parte de Oracle</title>
      <link>http://www.javahispano.org/contenidos/es/opiniones_acerca_de_la_adquisicion_de_sun_por_parte_de_oracle/?utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
      <description>&lt;p&gt;Por ahora, la &lt;a href="http://javahispano.org/polls.results.action?option=115"&gt;encuesta del mes&lt;/a&gt; se está decantando claramente en contra de la adquisición: algo más del 40% de los participantes tienen una impresión negativa, mientras que sólo un 25% tiene una impresión positiva. El resto de los participantes tienen una opinión neutra, o no lo tienen claro.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Exactamente ¿qué son las cosas que más os preocupan respecto a la adquisición? ¿La posibilidad de que se descontinúen algunos productos? ¿que quizás Oracle  no vaya a tener una posición tan comprometida con el mundo opensource? ¿Un posible incremento de los precios de soporte, servicios y adquisición de soluciones de Sun?&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;br /&gt;Comentarios: 3 Fecha &amp;uacute;ltimo comentario: 09/02/2010 15:15&lt;br /&gt;&lt;br /&gt;Noticia publicada en &lt;a href="http://www.javahispano.org"&gt;www.javahispano.org&lt;/a&gt;. Accede a la p&amp;aacute;gina web y participa&lt;img src="http://feeds.feedburner.com/~r/javahispano_noticias/~4/PrHa9BqxX08" height="1" width="1"/&gt;</description>
      <category domain="http://www.javahispano.org/contenidos/tags/NEWS/">Noticias</category>
      <category domain="http://www.javahispano.org/contenidos/tags/otro/">Otro</category>
      <category domain="http://www.javahispano.org/contenidos/tags/encuesta/">encuesta</category>
      <pubDate>Tue, 09 Feb 2010 10:38:33 GMT</pubDate>
      <guid>http://www.javahispano.org/contenidos/es/opiniones_acerca_de_la_adquisicion_de_sun_por_parte_de_oracle/?utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</guid>
      <dc:creator>abraham</dc:creator>
      <dc:date>2010-02-09T10:38:33Z</dc:date>
    </item>
    <item>
      <title>Jonathan Schwartz de SUN se despide vía Twitter</title>
      <link>http://www.javahispano.org/contenidos/es/jonathan_schwartz_de_sun_se_despide_via_twitter/?utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
      <description>&lt;span&gt;El pasado viernes, envi&amp;oacute; un mensaje v&amp;iacute;a Twitter, en que luego de comunicar que era su &amp;uacute;ltimo d&amp;iacute;a en la empresa, dice que la extra&amp;ntilde;ar&amp;aacute;.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;La salida de Schwartz no sorprende ya que el presidente de Oracle, Larry Ellison, ya hab&amp;iacute;a comentado que Schwartz no tendr&amp;iacute;a cabida en la empresa despu&amp;eacute;s de la fusi&amp;oacute;n de Sun con Oracle.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;Jonathan Schwartz abandona la empresa recibiendo una compensaci&amp;oacute;n de 12 millones de d&amp;oacute;lares, adem&amp;aacute;s de 5 millones de d&amp;oacute;lares en acciones.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt; &lt;p&gt;&lt;span&gt;&lt;strong&gt;Fuentes:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;a href="http://www.diarioti.com/gate/n.php?id=25885"&gt;DiarioIT&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;a href="http://twitter.com/OpenJonathan"&gt;twitter&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;a href="http://blogs.sun.com/jonathan/entry/where_life_takes_me_next"&gt;Jonathan&amp;rsquo;s Blog&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Noticia publicada en &lt;a href="http://www.javahispano.org"&gt;www.javahispano.org&lt;/a&gt;. Accede a la p&amp;aacute;gina web y participa&lt;img src="http://feeds.feedburner.com/~r/javahispano_noticias/~4/nHz218MgTYo" height="1" width="1"/&gt;</description>
      <category domain="http://www.javahispano.org/contenidos/tags/NEWS/">Noticias</category>
      <category domain="http://www.javahispano.org/contenidos/tags/otro/">Otro</category>
      <pubDate>Tue, 09 Feb 2010 07:59:41 GMT</pubDate>
      <guid>http://www.javahispano.org/contenidos/es/jonathan_schwartz_de_sun_se_despide_via_twitter/?utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</guid>
      <dc:creator>EFrigerio</dc:creator>
      <dc:date>2010-02-09T07:59:41Z</dc:date>
    </item>
    <item>
      <title>JavaHispano Podcast - 073 - Programación con GWT (Google Web Toolkit)</title>
      <link>http://www.javahispano.org/contenidos/es/javahispano_podcast__073__programacion_con_gwt_google_web_toolkit/?utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
      <description>&lt;p&gt;Publicado un nuevo n&amp;uacute;mero del podcast de javaHispano. En esta ocasi&amp;oacute;n hablaremos de GWT (Google Web Toolkit), un conjunto de herramientas para desarrollo de aplicaciones web RIA. En este podcast participar&amp;aacute;n Alfredo Casado, y nuestro invitado especial Manuel Carrasco. Manuel ha creado herramientas como GWTChismes y GWTUpload, es commiter de la fundaci&amp;oacute;n Apache a trav&amp;eacute;s del proyecto Hupa y es commiter de Hudson.&lt;/p&gt;&lt;p&gt;Durante la charla explicaremos para que sirve GWT y en que ocasiones es recomendable utilizarlo, hablaremos de pr&amp;aacute;cticas interesantes como la depuraci&amp;oacute;n o el testing y, finalmente, hablaremos de los proyectos &amp;quot;open source&amp;quot; en los que Manuel participa. &lt;/p&gt;&lt;p&gt;Links de herramientas y librer&amp;iacute;as.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/intl/es-ES/webtoolkit/"&gt;GWT (Google Web Toolkit)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/intl/es-ES/webtoolkit/examples/"&gt;Ejemplos oficiales de &lt;span class="il"&gt;GWT&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="il"&gt;&lt;a href="http://manolocarrasco.blogspot.com/"&gt;Blog de Manuel Carrasco&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="il"&gt;&lt;a href="http://code.google.com/p/gwtchismes/"&gt;GWTChismes&lt;/a&gt; y &lt;a href="http://code.google.com/p/gwtupload/"&gt;GWTUpload&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/gwt-mosaic/"&gt;Mosaic, Una librer&amp;iacute;a de widgets ricos para &lt;span class="il"&gt;GWT&lt;/span&gt; (licencia Apache)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mosaic.arkasoft.com/gwt-mosaic-current/Showcase.html"&gt;Demo de Mosaic&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://vaadin.com"&gt;Vaadin, Un framework completo para hace RIA basado en &lt;span class="il"&gt;GWT&lt;/span&gt; (licencia Apache) &lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://demo.vaadin.com/sampler"&gt;Demo de Vaadin&lt;/a&gt;&lt;span class="il"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.extjs.com/products/gxt/"&gt;ext-GWT, Una libreria similar a ext, pero hecha en &lt;span class="il"&gt;GWT&lt;/span&gt; (licencia comercial)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.extjs.com/examples/explorer.html#overview"&gt;Demo de ext-GWT&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gwt-ext.com"&gt;GWT-Ext, Una envoltorio GWT para la libreria ext (LGPLv3)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gwt-ext.com/demo/"&gt;Demo de GWT-Ext&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/smartgwt/"&gt;Smart-&lt;span class="il"&gt;GWT&lt;/span&gt;, Un wraper &lt;span class="il"&gt;GWT&lt;/span&gt; para la libreria de widgets smartclient (licencia GLGPL)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.smartclient.com/smartgwt/showcase/"&gt;Demo de Smart-GWT&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://sonar.codehaus.org"&gt;Sonar, Una aplicaci&amp;oacute;n para ver la calidad de c&amp;oacute;digo java, hecha con&lt;span class="il"&gt; GWT&lt;/span&gt; + jRuby/Rails&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://hupa.alcala.org/hupa"&gt;Apache-Hupa Demo, Version BETA desplegada y configurada para utilizar cualquier cuenta Imap en Gmail.&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Links de presentaciones y art&amp;iacute;culos&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/intl/es-ES/events/io/2009/sessions/GoogleWebToolkitBestPractices.html"&gt;Presentaci&amp;oacute;n de Ray Ryan en Google IO donde describe el patron MVP&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/intl/es-ES/events/io/2009/sessions/ProgressivelyEnhanceAjaxApps.html"&gt;Presentaci&amp;oacute;n de Ray Cromwell hablando de GQuery para hacer SEO (Al final agracede a Manuel Carrasco su contribucion a gquery)&lt;/a&gt;, &lt;a href="http://pds12.egloos.com/pds/200906/09/15/Th_0115_ProgressivelyEnhanceAJAXApplicationswithGoogleWebToolkitandGQuery.pdf"&gt;Descarga de PDF&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/gwtchismes/wiki/Tutorial_ExportingGwtLibrariesToJavascript_es"&gt;Art&amp;iacute;culo en espa&amp;ntilde;ol de c&amp;oacute;mo usar &lt;span class="il"&gt;GWT&lt;/span&gt; para generar librerias JS normales (escrito por Manuel Carrasco)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://timepedia.blogspot.com/2009/12/gwt-20-so-good-its-ridiculous.html"&gt;Post de las mejoras que aporta &lt;span class="il"&gt;gwt&lt;/span&gt; 2.0&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;Comentarios: 14 Fecha &amp;uacute;ltimo comentario: 09/02/2010 14:44&lt;br /&gt;&lt;br /&gt;Noticia publicada en &lt;a href="http://www.javahispano.org"&gt;www.javahispano.org&lt;/a&gt;. Accede a la p&amp;aacute;gina web y participa&lt;img src="http://feeds.feedburner.com/~r/javahispano_noticias/~4/jfNoKYRonWU" height="1" width="1"/&gt;</description>
      <category domain="http://www.javahispano.org/contenidos/tags/JH_PODCASTS/">Podcasts javaHispano</category>
      <category domain="http://www.javahispano.org/contenidos/tags/otro/">Otro</category>
      <category domain="http://www.javahispano.org/contenidos/tags/GWT/">GWT</category>
      <category domain="http://www.javahispano.org/contenidos/tags/podcast/">Podcast</category>
      <pubDate>Sun, 07 Feb 2010 22:09:20 GMT</pubDate>
      <guid>http://www.javahispano.org/contenidos/es/javahispano_podcast__073__programacion_con_gwt_google_web_toolkit/?utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</guid>
      <dc:creator>JorgeRubira</dc:creator>
      <dc:date>2010-02-07T22:09:20Z</dc:date>
    </item>
    <item>
      <title>Taller gratuito de Spring + Flex y Air 2.0 en Monterrey, México</title>
      <link>http://www.javahispano.org/contenidos/es/taller_gratuito_de_spring__flex_y_air_2_0_en_monterrey__mexico/?utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
      <description>&lt;p&gt;En&amp;nbsp;&lt;a href="http://www.riahispano.org" target="_blank"&gt;riahispano&lt;/a&gt;&amp;nbsp;hemos organizado un taller gratuito en la ciudad de Monterrey, M&amp;eacute;xico este s&amp;aacute;bado 20 de febrero a partir de las 10 a.m. en las instalaciones de&amp;nbsp;&lt;a href="http://www.turningbc.com" target="_blank"&gt;turningbc&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;El cupo es limitado, as&amp;iacute; que puedes&amp;nbsp;&lt;a href="http://tidyslice.stagehq.com/events/170" target="_blank"&gt;registrarte en este enlace&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;El primer taller es sobre construcci&amp;oacute;n de aplicaciones usando &lt;em&gt;Spring 3, BlazeDS y Flex 4&lt;/em&gt;. En este taller daremos una introducci&amp;oacute;n al mundo Spring, al desarrollo java con esta librer&amp;iacute;a y a la comunicaci&amp;oacute;n con tecnolog&amp;iacute;a Flash usando DataServices de BlazeDS 4 beta.&lt;/p&gt;&lt;p&gt;Adem&amp;aacute;s, construiremos un cliente usando Flex 4 Beta y las nuevas capacidades del Flash Builder 4 para el consumo de dataservices.&lt;/p&gt;&lt;p&gt;Este taller lo impartiremos yo (Erick Camacho&lt;a href="http://www.twitter.com/ecamacho" target="_blank"&gt; @ecamacho&lt;/a&gt;) e Iv&amp;aacute;n &amp;Aacute;lvarez&amp;nbsp;&lt;a href="http://www.twitter.com/ivanhoe"&gt;@ivanhoe&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;En la segunda sesi&amp;oacute;n, &amp;Eacute;lder Valdez (&lt;a href="http://www.twitter.com/eldervaz" target="_blank"&gt;@eldervaz&lt;/a&gt;) dar&amp;aacute; una charla sobre las &lt;em&gt;novedades de Adobe Air 2.0&lt;/em&gt;, como el soporte a HTML5, la nueva integraci&amp;oacute;n con c&amp;oacute;digo nativo, la nueva API para sockets y el nuevo soporte para multitouch.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Recuerda reservar tu lugar y llevar tu laptop con el JDK 5 o superior. Todo el material necesario se te proporcionar&amp;aacute; durante la sesi&amp;oacute;n.&amp;nbsp;&lt;/p&gt;&lt;br /&gt;Comentarios: 8 Fecha &amp;uacute;ltimo comentario: 08/02/2010 22:45&lt;br /&gt;&lt;br /&gt;Noticia publicada en &lt;a href="http://www.javahispano.org"&gt;www.javahispano.org&lt;/a&gt;. Accede a la p&amp;aacute;gina web y participa&lt;img src="http://feeds.feedburner.com/~r/javahispano_noticias/~4/tCAu9qr77WI" height="1" width="1"/&gt;</description>
      <category domain="http://www.javahispano.org/contenidos/tags/ANNOUNCEMENTS/">Anuncios</category>
      <category domain="http://www.javahispano.org/contenidos/tags/otro/">Otro</category>
      <category domain="http://www.javahispano.org/contenidos/tags/spring/">spring</category>
      <category domain="http://www.javahispano.org/contenidos/tags/flex/">flex</category>
      <category domain="http://www.javahispano.org/contenidos/tags/air/">air</category>
      <category domain="http://www.javahispano.org/contenidos/tags/taller/">taller</category>
      <pubDate>Fri, 05 Feb 2010 20:14:41 GMT</pubDate>
      <guid>http://www.javahispano.org/contenidos/es/taller_gratuito_de_spring__flex_y_air_2_0_en_monterrey__mexico/?utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</guid>
      <dc:creator>ecamacho</dc:creator>
      <dc:date>2010-02-05T20:14:41Z</dc:date>
    </item>
    <item>
      <title>La esperada versión 2.1.0 de CryptoApplet ya está disponible</title>
      <link>http://www.javahispano.org/contenidos/es/la_esperada_version_2_1_0_de_cryptoapplet_ya_esta_disponible/?utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
      <description>&lt;a href="http://proyectostic.uji.es/pr/cryptoapplet/"&gt;CryptoApplet&lt;/a&gt; es un applet Java desarrollado por la &lt;a href="http://www.uji.es/"&gt;Universitat Jaume I&lt;/a&gt; de Castell&amp;oacute;n para la realizaci&amp;oacute;n de firma electr&amp;oacute;nica avanzada multiformato.   Alguna mejoras que podremos encontrar en esta versi&amp;oacute;n 2.1.0:  &lt;ul&gt;   &lt;li&gt;Divisi&amp;oacute;n del proyecto en m&amp;oacute;dulos para poder desplegar un perfil m&amp;aacute;s adecuado a las necesidades concretas del proyecto&lt;/li&gt;   &lt;li&gt;Eliminaci&amp;oacute;n de dependencias para conseguir un applet m&amp;aacute;s ligero&lt;/li&gt;   &lt;li&gt;Soporte de firma XAdES-BES y XAdES-EPES con &lt;a href="https://xades.dev.java.net/"&gt;jXAdES&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;Soporte de cofirma para PDF, ODF, XML Signature y &lt;a href="https://xades.dev.java.net/"&gt;jXAdES&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;Correcci&amp;oacute;n de bugs y mejoras en el rendimiento general de la aplicaci&amp;oacute;n&lt;/li&gt; &lt;/ul&gt;&lt;br /&gt;Comentarios: 20 Fecha &amp;uacute;ltimo comentario: 08/02/2010 09:41&lt;br /&gt;&lt;br /&gt;Noticia publicada en &lt;a href="http://www.javahispano.org"&gt;www.javahispano.org&lt;/a&gt;. Accede a la p&amp;aacute;gina web y participa&lt;img src="http://feeds.feedburner.com/~r/javahispano_noticias/~4/HSPHhTbNt1k" height="1" width="1"/&gt;</description>
      <category domain="http://www.javahispano.org/contenidos/tags/ANNOUNCEMENTS/">Anuncios</category>
      <category domain="http://www.javahispano.org/contenidos/tags/NEWS/">Noticias</category>
      <category domain="http://www.javahispano.org/contenidos/tags/j2se/">javaSE</category>
      <category domain="http://www.javahispano.org/contenidos/tags/Seguridad/">Seguridad</category>
      <category domain="http://www.javahispano.org/contenidos/tags/applet/">Applet</category>
      <category domain="http://www.javahispano.org/contenidos/tags/cryptoapplet/">cryptoapplet</category>
      <category domain="http://www.javahispano.org/contenidos/tags/opensource/">opensource</category>
      <pubDate>Thu, 04 Feb 2010 19:05:46 GMT</pubDate>
      <guid>http://www.javahispano.org/contenidos/es/la_esperada_version_2_1_0_de_cryptoapplet_ya_esta_disponible/?utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</guid>
      <dc:creator>anonymous</dc:creator>
      <dc:date>2010-02-04T19:05:46Z</dc:date>
    </item>
    <item>
      <title>Curso de programación Java VII (el último de la serie)- Abraham Otero</title>
      <link>http://www.javahispano.org/contenidos/es/curso_de_programacion_java_vii_el_ultimo_de_la_serie_abraham_otero/?utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
      <description>&lt;h3&gt;Curso de programación Java VII&lt;/h3&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span"&gt;Artículo publicado originalmente en la revista &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://www.revistasprofesionales.com"&gt;Sólo Programadores&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h4&gt;Curso de programación Java VII&lt;/h4&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Hace muchos años que dejó de ser aceptable que el usuario final de una aplicación emplease una consola y el teclado para interaccionar con ella. Ahora, las expectativas de los usuarios han crecido y esperan bonitas interfaces de usuario con botones, menús, barras de tareas, etcétera. El objetivo de este capítulo es enseñar a diseñar interfaces gráficas de usuario empleando para ello la librería Swing. &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Swing es la librería gráfica que en Java 1.2 sustituyó a la vieja AWT. La nueva librería cuenta con más componentes y proporciona una mayor cantidad de opciones sobre ellos (como distintas apariencias, control sobre el focus, mayor control sobre su aspecto, mayor facilidad para pintar al hacer el buffering transparente al usuario....) que su antecesor. Además, se diferencia radicalmente de ésta en su implementación. En AWT cuando añadíamos, por ejemplo, un botón a nuestra interfaz la máquina virtual le pedía al sistema operativo la creación de un botón en un determinado sitio con unas determinadas propiedades; en Swing ya no se pide al sistema operativo nada: se dibuja el botón sobre la ventana en la que lo queríamos. Con esto se eliminaron muchos problemas que existían antes con los códigos de las interfaces gráficas: debido a que dependían del sistema operativo para obtener sus componentes gráficos, era necesario testar los programas en distintos sistemas operativos, pudiendo tener distintos bugs en cada uno de ellos.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Esto, evidentemente, iba en contra de la filosofía de Java, supuestamente un lenguaje que no dependía de la plataforma. Con Swing se mejoró bastante este aspecto: lo único que se pide al sistema operativo es una ventana; una vez que tenemos la ventana dibujamos botones, listas, scroll-bars... y todo lo que necesitemos sobre ella. Evidentemente esta aproximación gana mucho en lo que a independencia de la plataforma se refiere. Además, el hecho de que el botón no sea un botón del sistema operativo sino un botón pintado por Java nos da un mayor control sobre su apariencia.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h4&gt;1&lt;span class="Apple-tab-span"&gt;	&lt;/span&gt;Creando nuestra primera ventana&lt;/h4&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;JFrame es el contenedor que emplearemos para situar en él todos los demás componentes que necesitemos para construir de una interfaz gráfica. Este contenedor es una ventana típica de un sistema operativo. La ventana tendrá un borde, una barra de título y, en Windows, tendrá los tres típicos iconos en su esquina superior derecha para minimizar, maximizar y cerrar la ventana.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;En la figura 1 se muestra la jerarquía de herencia de este componente desde Object que, como ya hemos explicado, es el padre de todas las clases de Java. Los métodos de este componente estarán repartidos a lo largo de todos sus ascendientes, cosa que hemos de tener en cuenta cuando consultemos el javadoc de esta clase. Así, por ejemplo, resulta intuitivo que debiera haber un método para cambiar el color de fondo del frame, pero él no tiene ningún método para ello; lo tiene su tatarabuelo, la clase Component. &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;img src="/contenidos.downloadimg.action?id=3392656" rel="lightbox" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;FIGURA 1: Jerarquía de herencia de JFrame&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;En el listado 1 vemos el código necesario para crear una ventana. La forma más habitual de hacerlo es creando una clase propia que herede de JFrame. En el constructor de esta clase empleamos dos métodos de JFrame para indicar cuál será el título de la ventana y su tamaño. En una clase auxiliar, la que tiene el método main, creamos una instancia de esta clase y la hacemos visible (por defecto los JFrames son invisibles).&lt;/p&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre&gt;//LISTADO 1:&lt;/pre&gt;&lt;pre&gt;import javax.swing.*;&lt;/pre&gt;&lt;pre&gt;class MiFrame extends JFrame {&lt;/pre&gt;&lt;pre&gt;    public MiFrame(){&lt;/pre&gt;&lt;pre&gt;        setTitle("Hola!!!");&lt;/pre&gt;&lt;pre&gt;        setSize(300,200);&lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre&gt;public class Ejemplo1{&lt;/pre&gt;&lt;pre&gt;    public static void main (String[] args){&lt;/pre&gt;&lt;pre&gt;        JFrame frame = new MiFrame();&lt;/pre&gt;&lt;pre&gt;        frame.setVisible(true);&lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;El código del listado 1 tiene un problema: cuando cerremos la ventana la máquina virtual no se detendrá. La única forma de terminarla será pulsando control-C si hemos ejecutado el programa desde una consola, o con Control-Alt-Supr y eliminando su tarea correspondiente si lo ejecutamos desde Windows. En Netbeans, podemos usar el botón rojo de "Stop" de la lengüeta que se muestra en la parte inferior del entorno de desarrollo al ejecutar una aplicación, lengüeta que se corresponde con la salida de consola de la aplicación.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;¿Por qué no se detiene la aplicación una vez que se cierra la ventana? Porque no hemos escrito el código necesario para ello. Para que se detenga la aplicación debemos escribir código que escuche los eventos de ventana, y que ante el evento de intentar cerrar la ventana reaccione terminando la máquina virtual. A continuación, antes de seguir presentando más componentes de la librería Swing, veamos qué es un evento y cómo gestionarlo.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h4&gt;2&lt;span class="Apple-tab-span"&gt;	&lt;/span&gt;El modelo de delegación de eventos&lt;/h4&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;El sistema de gestión de eventos de Java 1.2 es el mismo que el de Java 1.1 y por lo tanto el mismo que para la librería AWT. Aunque los desarrolladores de Java considerasen que para mejorar la plataforma se necesitaba dejar a un lado la librería AWT e introducir Swing no sintieron lo mismo del sistema de gestión de eventos. Este sistema es bastante elegante y sencillo, sobre todo si se compara con el sistema de gestión de eventos de Java 1.0, mucho más engorroso de usar y menos elegante.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;¿Qué es un evento? Todos los sistemas operativos están constantemente atendiendo a los eventos generados por los usuarios. Estos eventos pueden ser pulsar una tecla, mover el ratón, hacer clic con el ratón, pulsar el ratón sobre un botón o menú (Java distingue entre simplemente pulsar el ratón en un sitio cualquiera o hacerlo, por ejemplo, en un botón). El sistema operativo notifica a las aplicaciones que están ocurriendo estos eventos, y ellas deciden si han de responder o no de algún modo a este evento.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;El modelo de gestión de eventos de Java se conoce como el modelo de delegación de eventos. El evento se produce en un determinado componente, por ejemplo un scroll. Donde se produce el evento se denomina fuente del evento. A continuación el evento se transmite a un "manejador de eventos (event listener) que está asociado al componente en el que se produjo el evento. El objeto que escucha los eventos es el que se encargará de responder a ellos. Esta separación de código entre generación del evento y actuación respecto a él facilita la labor del programador y da una mayor claridad a los programas.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Lo que la fuente de eventos le pasa al objeto encargado de escuchar los eventos es, como no, otro objeto cuyo tipo es Event. Este objeto contiene toda la información necesaria para la correcta gestión del evento por parte del objeto que escucha los eventos.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;El objeto que escucha los eventos ha de implementar para ello una interface. El nombre de esta interface es siempre el nombre del evento más Listener: para que un objeto escuche eventos de ratón ha de implementar la interface MouseListener, para que escuche eventos de teclado KeyListener, etcétera.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Para hacer que un objeto escuche los eventos de alguna fuente de eventos se emplea el método dd[NombreEvento]Listener, así si tuviésemos un JFrame llamado frame y quisiésemos que el objeto llamado manejador escuchase los eventos de ratón de frame lo haríamos del siguiente modo:&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;pre&gt;frame.addMouseListener(manejador);&lt;/pre&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;manejador ha de pertenecer a una clase que implemente la interface MouseListener, que tiene un total de 7 métodos que debemos sobrescribir. Al implementar la interfaz tenemos que sobreescribir todos los métodos que se definen en ella, incluso aunque no los usemos,  sino la clase que se encargaría de escuchar los eventos sería abstracta y no podríamos crear ningún objeto de ella. Para resolver este problema, para cada interface que tenga más de un método existe una clase llamada [NombreEvento]Adapter (MouseAdapter, por ejemplo), que implementa todos los métodos de la interface sin hacer nada en ellos. Nosotros lo único que tendremos que hacer es que nuestra clase que escuche eventos extienda esta clase y sobrescriba los métodos que nos interesen.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;La figura 2 muestra cómo funciona el modelo de delegación de eventos. En este caso a la fuente del evento, un botón, le indicamos quién será su manejador de eventos, manejador que ha de extender la clase Adapter correspondiente o implementar la interfaz Listener (interfaz ActionLitener en este caso). Cuando el usuario genere el evento deseado (en este caso pulse el botón), el objeto fuente empaqueta información a cerca del evento generado en un objeto de tipo Event (ActionEvent en este caso) e invoca el método correspondiente del manejador (actionPerformed(actionEvent)) pasándole como información el objeto de tipo Event generado. Es responsabilidad del manejador, y no de la fuente, responder al evento, por ello se dice que la fuente delega la gestión del evento en el manejador.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;img src="/contenidos.downloadimg.action?id=3468467" rel="lightbox" /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;FIGURA 2: Esquema del modelo de gestión de eventos de Swing&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;En el listado 2 podemos ver una nueva versión del programa del listado 1 donde en el constructor del JFrame añadimos un manejador de eventos de ventana. El lector puede consultar los métodos de la interfaz WindowListener, así como qué evento causa la invocación de cada método, en el javadoc de dicha interfaz. Se ha creado una clase adicional que extiende a la clase WindowAdapter y sobreescribe el método que es invocado cuando se cierra la ventana: public void windowClosing(WindowEvent e). Dentro de ese método se imprime un texto por consola, simplemente para que podamos comprobar que efectivamente se ha ejecutado dicho método al cerrar la ventana, y se termina la máquina virtual con la sentencia System.exit(0). Ahora, al cerrar esta ventana se detendrá la máquina virtual, que es el comportamiento que deseábamos en este caso.&lt;/p&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre&gt;//LISTADO 2: Un JFrame que al cerrarse detiene la máquina virtual&lt;/pre&gt;&lt;pre&gt;class Frame extends JFrame {&lt;/pre&gt;&lt;pre&gt;    public Frame(){&lt;/pre&gt;&lt;pre&gt;        setTitle("Hola!!!");&lt;/pre&gt;&lt;pre&gt;        setSize(300,200);&lt;/pre&gt;&lt;pre&gt;        addWindowListener (new manejador());&lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre&gt; class manejador extends WindowAdapter{&lt;/pre&gt;&lt;pre&gt;            public void windowClosing(WindowEvent e){&lt;/pre&gt;&lt;pre&gt;                System.out.println("Saliendo");&lt;/pre&gt;&lt;pre&gt;                System.exit(0);&lt;/pre&gt;&lt;pre&gt;            }&lt;/pre&gt;&lt;pre&gt;        }&lt;/pre&gt;&lt;pre&gt;public class Ejemplo2{...}&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;p&gt; &lt;/p&gt;&lt;h4&gt;3&lt;span class="Apple-tab-span"&gt;	&lt;/span&gt;Contenedores y Layout Managers&lt;/h4&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;No se considera una buena práctica de programación añadir componentes directamente sobre un contenedor de pesado (frames y applets por lo que a nosotros respecta). Lo correcto es añadir al contenedor pesado uno o varios contenedores ligeros (habitualmente paneles) y añadir sobre éstos los componentes que necesitemos. Un contenedor es cualquier clase que derive de java.awt.Container, clase que contiene la funcionalidad genérica de ser un contenedor, es decir, la funcionalidad de poder contener a otros componentes gráficos. Un contenedor "pesado" es un contenedor que se pide directamente al sistema operativo, como es el caso de un JFrame. Un contenedor "ligero" es un contenedor que, al igual que sucede con prácticamente todos los componentes de la librería Swing, se dibuja sobre un contenedor pesado del sistema operativo. Un ejemplo es JPanel.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Para añadir un JPanel a nuestro frame  primero obtenemos uno de los objetos que forman el JFrame: el panel contenedor (content pane). Un JFrame no es como un folio, es decir, no tiene una sola capa. Más bien, es como una pequeña pila de folios: tiene varias capas (cinco), cada una de ellas con distinta funcionalidad. Para un curso básico de programación gráfica como éste, sólo nos interesa una de esas capas: la del panel contenedor. A esta capa es a la que debemos añadir cualquier componente que queramos que se vea en la ventana.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Para obtener el panel contenedor se emplea el método getContentPane. El objeto que devuelve será de tipo Container:&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;pre&gt;Container contentpane = frame.getContentPane();&lt;/pre&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Sobre este contenedor deberemos añadir toda nuestra interface gráfica. Pero ¿Cómo definimos la posición de los distintos componentes en pantalla?. Éste es precisamente el propósito de los Layout Maneger: con ellos se especifican unas posiciones determinadas en un contenedor donde será posible añadir nuestros componentes, así como el comportamiento de dichos componentes cuando la ventana cambie de tamaño.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Dado que cualquier contenedor de swing es también un componente, es posible anidar contenedores, e indicar un Layout Maneger diferente para cada uno de ellos. Esto proporciona una gran flexibilidad a la hora de definir la posición de los componentes en pantalla.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;En Swing existen una gran cantidad de Layout Manegers. Aquí presentaremos el funcionamiento de sólo tres de ellos, para que el lector haga una idea de qué es lo que proporcionan y cómo se pueden emplear para construir interfaces gráficas de usuario. En el video que acompaña a este artículo se muestra el funcionamiento de un cuarto Layout Maneger, más orientado a ser empleado por entornos de desarrollo que por los programadores directamente.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h5&gt;3.1&lt;span class="Apple-tab-span"&gt;	&lt;/span&gt;FlowLayout&lt;/h5&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Es el layout que tienen los JPanel por defecto. Los objetos se van colocando en filas en el mismo orden en que se añadieron al contenedor. Tanto el alto como el ancho de los componentes serán respetados por el layout. Cuando se llena una fila se pasa a la siguiente. Tiene tres posibles constructores:&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;FlowLayout()&lt;/em&gt;: cuando se añadan componentes los bordes de unos estarán pegados a los otros. Los componentes se alinearán a la izquierda del contenedor.&lt;/li&gt;&lt;li&gt;&lt;em&gt;FlowLayout(int alineacion)&lt;/em&gt;: permite indicar la alineación de los componentes: a la izquierda, derecha o centrados. Para ello se emplean las constantes FlowLayout.LEFT[RIGTH][CENTER].&lt;/li&gt;&lt;li&gt;&lt;em&gt;FlowLayout(int alineacion, int gapHorizontal, int gapVertical)&lt;/em&gt;: además de la alineación de los componentes indica un espaciado (gap) entre los distintos componentes, de tal modo que no aparezcan unos pegados a otros. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Una imagen vale más que 1000 palabras, y un programa funcionando vale más que 1000 descripciones de cómo funciona un programa. Recomiendo al lector que ejecute el código FlowLayoutEjemplo.java que puede encontrar en el CD de este número de la revista y que pruebe a cambiarle el tamaño a la ventana que aparecerá, así como que juegue con las distintas opciones del constructor de FlowLayout, para comprender su funcionamiento.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h5&gt;3.2&lt;span class="Apple-tab-span"&gt;	&lt;/span&gt;GridLayout&lt;/h5&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Como su propio nombre indica, crea un grid y va añadiendo los componentes a él de izquierda a derecha y de arriba a abajo. Todas las cuadrículas serán del mismo tamaño y crecerán o se harán más pequeñas hasta ocupar toda el área del contenedor. Los constructores más comunes son:&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;GridLayout(int filas, int columnas)&lt;/em&gt;: crea un layout en forma de grid con un número de columnas y filas igual al especificado.&lt;/li&gt;&lt;li&gt;&lt;em&gt;GridLayout(int columnas, int filas, int gap_horizontal, int gat_vertical)&lt;/em&gt;: además del número de filas y de columnas, permite indicar el espacio vertical y horizontal a dejar entre las cuadrículas. El espaciado se mide en píxeles. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Nuevamente, recomiendo al lector que para comprender el funcionamiento de este layaout ejecute el código GridLayoutEjemplo.java del CD.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h5&gt;3.3&lt;span class="Apple-tab-span"&gt;	&lt;/span&gt;BorderLayout&lt;/h5&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Como se muestra en la figura 3, este layout tiene cinco zonas predeterminadas: son norte, sur, este, oeste y centro. Las zonas norte y sur al cambiar el tamaño del contenedor se estirarán hacia los lados para llegar a ocupar toda el área disponible, pero sin variar su tamaño en la dirección vertical. Las zonas este y oeste presentan el comportamiento contrario: variarán su tamaño en la dirección vertical pero sin nunca variarlo en la dirección horizontal. &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;img height="297" src="/contenidos.downloadimg.action?id=3707313" width="475" rel="lightbox" /&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;FIGURA 3: Distintas posiciones definidas en un BorderLayout&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;En cuanto a la zona central, crecerá o disminuirá en todas las direcciones para rellenar todo el espacio vertical y horizontal que queda entre las zonas norte, sur, este y oeste. Este layout posee dos contructores:&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;BorderLayout()&lt;/em&gt;: crea una instancia del layout. &lt;/li&gt;&lt;li&gt;&lt;em&gt;BordreLayout(int gap_horizontal, int gap_vertical)&lt;/em&gt;: crea una instancia del layout dejando gaps horizontales y verticales entre sus distintas zonas. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;A la hora de añadir más paneles o componentes a este layout hay una pequeña diferencia respecto a los otros dos: en los otros al añadir los componentes se iban situando en un determinado orden, aquí especificamos en el método add la región donde queremos añadir el componente:&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;pre&gt;contenedor.add(componente, BorderLayout.NORTH);&lt;/pre&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Con esta llamada al método add añadiremos el componente en la región norte. Cambiando de NORTH por SOUTH, EAST, WEST, CENTER lo añadiremos en la región correspondiente. El código BorderLayoutEjemplo.java del CD ilustra el funcionamiento de este layaout.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h4&gt;4&lt;span class="Apple-tab-span"&gt;	&lt;/span&gt;Creando nuestra primera aplicación&lt;/h4&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Ha llegado el momento de introducir un componente que no sea un contenedor. Empecemos por un botón. Para crear un botón podemos emplear su constructor por defecto:&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;pre&gt;JButton boton = new JButton();&lt;/pre&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;O también podemos indicar el texto que queremos que se muestre en él:&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;pre&gt;JButton boton = new JButton(texto va aquí);&lt;/pre&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Cada vez que se haga un clic sobre el botón se genera un evento del tipo ActionEvent. Para poder escuchar dichos eventos necesitaremos una clase que implemete la interface ActionListener, interface que tiene un sólo método: actionPerformed (ActionEvent). En nuestro caso, será el propio JFrame el que implemente esta interfaz. Para indicar que va a ser el frame el que escucha los eventos del botón necesitamos el siguiente código:&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;pre&gt;boton.addActionListener(this);&lt;/pre&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Nuestra aplicación, cuyo código se muestra en el listado 3, tendrá un total de cuatro botones. Al pulsar cada uno de ellos, el color de fondo de un panel cambiará al color que indica la etiqueta de cada botón. El problema que se nos plantea ahora es el siguiente: cada vez que un botón sea pulsando se generará un ActionEvent y se invocará al método actionPerformed, pero ¿Cómo sabremos qué botón fue accionado para saber qué color ha de tener el fondo del panel? Esto lo lograremos gracias a que en el objeto evento (ActionEvent) hay información sobre quién produjo dicho evento: invocando al método getSource() de ActionEvent obtenemos una referencia al componente que generó dicho evento. &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Para controlar el tamaño de cada uno de los botones que estarán en las posiciones norte, sur, este y oeste de un BorderLayout, se invoca a un método del botón, setPreferredSize(Dimension). Este método fija un par de constantes del objeto botón a los valores indicados por el objeto dimensión, que no es más que un objeto que contiene dos enteros. Estos valores son el tamaño que preferentemente ha de tener el botón. BorderLayout respetará la altura de los botones si los añadimos en las posiciones sur o norte, o su ancho si los añadimos en las posiciones este u oeste. Si no hubiésemos establecido un tamaño preferido el botón sería muy fino, con lo cual quedaría poco estético y además no se daría leído su etiqueta.&lt;/p&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre&gt;//LISTADO 3: Una pequeña aplicación que cambia el color de un panel &lt;/pre&gt;&lt;pre&gt;...&lt;/pre&gt;&lt;pre&gt;class Frame extends JFrame implements ActionListener{&lt;/pre&gt;&lt;pre&gt;    private JPanel panel = new JPanel();&lt;/pre&gt;&lt;pre&gt;    private JButton azul,rosa,amarillo,verde;&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre&gt;    public Frame(){&lt;/pre&gt;&lt;pre&gt;        setTitle("Hola!!!");&lt;/pre&gt;&lt;pre&gt;        setSize(500,400);&lt;/pre&gt;&lt;pre&gt;        addWindowListener (new manejador());&lt;/pre&gt;&lt;pre&gt;        Container contentpane = getContentPane();&lt;/pre&gt;&lt;pre&gt;        panel.setLayout(new BorderLayout());&lt;/pre&gt;&lt;pre&gt;        azul = new JButton("Azul");&lt;/pre&gt;&lt;pre&gt;        azul.addActionListener(this);&lt;/pre&gt;&lt;pre&gt;        Dimension d = new Dimension(100,40);&lt;/pre&gt;&lt;pre&gt;        azul.setPreferredSize(d);&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre&gt;        verde = new JButton("Verde");&lt;/pre&gt;&lt;pre&gt;        verde.addActionListener(this);&lt;/pre&gt;&lt;pre&gt;        verde.setPreferredSize(d);&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre&gt;        amarillo = new JButton("Amarillo");&lt;/pre&gt;&lt;pre&gt;        amarillo.addActionListener(this);&lt;/pre&gt;&lt;pre&gt;        amarillo.setPreferredSize(d);&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre&gt;        rosa = new JButton("Rosa");&lt;/pre&gt;&lt;pre&gt;        rosa.addActionListener(this);&lt;/pre&gt;&lt;pre&gt;        rosa.setPreferredSize(d);&lt;/pre&gt;&lt;pre&gt;        panel.add(azul,BorderLayout.SOUTH);&lt;/pre&gt;&lt;pre&gt;        panel.add(verde,BorderLayout.NORTH);&lt;/pre&gt;&lt;pre&gt;        panel.add(amarillo,BorderLayout.EAST);&lt;/pre&gt;&lt;pre&gt;        panel.add(rosa,BorderLayout.WEST);&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre&gt;        contentpane.add(panel);&lt;/pre&gt;&lt;pre&gt;        panel.setBackground(Color.red);&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre&gt;    public void actionPerformed (ActionEvent e){&lt;/pre&gt;&lt;pre&gt;        Object source = e.getSource();&lt;/pre&gt;&lt;pre&gt;        if (source ==azul)&lt;/pre&gt;&lt;pre&gt;            panel.setBackground(Color.blue);&lt;/pre&gt;&lt;pre&gt;        if (source ==verde)&lt;/pre&gt;&lt;pre&gt;            panel.setBackground(Color.green);&lt;/pre&gt;&lt;pre&gt;        if (source ==amarillo)&lt;/pre&gt;&lt;pre&gt;            panel.setBackground(Color.yellow);&lt;/pre&gt;&lt;pre&gt;        if (source ==rosa)&lt;/pre&gt;&lt;pre&gt;            panel.setBackground(Color.pink);&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre&gt;...&lt;/pre&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h4&gt;5&lt;span class="Apple-tab-span"&gt;	&lt;/span&gt;Revisión de algunos componentes Swing&lt;/h4&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;En este apartado haremos una rápida revisión de varios de los componentes de la librería Swing más empleados. Consultando su javadoc, pueden encontrase más detalles sobre qué eventos generan, y cómo configurar su apariencia. La gestión de estos eventos es análoga al ejemplo presentado en el listado 3, y siempre sigue el modelo de delegación de eventos.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;JTextField&lt;/em&gt;: campo de texto pensado para obtener texto del usuario, este tecleará en él y cuando pulse intro podremos disponer del texto que tecleó. Únicamente se puede recoger una línea de texto. Tiene métodos para recoger el texto del usuario, poner un texto en él, recoger solo el texto seleccionado, seleccionar una parte del texto, insertar texto, cortar texto, pegar texto, etc. &lt;/li&gt;&lt;li&gt;&lt;em&gt;JTextArea&lt;/em&gt;: todo lo dicho para JTextField es válido aquí también; la diferencia entre ambos es que JTextArea permite al usuario introducir más de una línea de texto.&lt;/li&gt;&lt;li&gt;JPasswordField: campo de en el cual al escribir no se ve lo que se escribe, sino un carácter (*, por ejemplo). Se emplea parta pedirle passwords al usuario y evitar que puedan ser leídos por alguien.&lt;/li&gt;&lt;li&gt;&lt;em&gt;JScrollBar&lt;/em&gt;: es el típico scroll que permite desplazarse a lo largo de un componente demasiado grande para mostrar en pantalla. Puede servir tanto para tomar una entrada numérica del usuario, o para "scrollear" a lo largo de regiones demasiado grandes para ser vistas en la ventana en que representamos la información. Hay un panel de Swing, JScrollPanel, que ya lleva incorporados por defecto dos scrolls, nosotros lo único que tenemos que hacer es introducir en él un componente y él se encargará de gestionar los scrolls horizontales y verticales. JScrollBar posee métodos para fijar el valor numérico correspondiente al mínimo y máximo de las posiciones del scroll, para ver qué valor posee el scroll en un determinado momento, para poner el scroll en un determinado valor, etc.&lt;/li&gt;&lt;li&gt;&lt;em&gt;JLabel&lt;/em&gt;: etiqueta de texto que podemos colocar al lado de cualquier componente para darle una indicación al usuario de cuál es la función de dicho componente. También se puede emplear a modo de título de, por ejemplo, un applet.&lt;/li&gt;&lt;li&gt;&lt;em&gt;JCheckBox&lt;/em&gt;: es un componente empleado para tomar información del usuario sobre cosas del tipo sí, no; se emplea para seleccionar una opción entre un conjunto de opciones. Posee métodos para seleccionar o deseleccionar, o para indicar su estado.&lt;/li&gt;&lt;li&gt;&lt;em&gt;JRadioButton&lt;/em&gt;: debe su nombre a funcionar como los botones de una radio antigua: al seleccionar uno se deselecciona el que antes estaba seleccionado. Cuando añadimos estos componentes a nuestra interfaz se añaden por grupos; de entre todos los JRadioButtons que han sido añadidos a un grupo sólo puede haber uno seleccionado, y la selección de uno distinto dentro del grupo provoca la inmediata deselección del que antes estaba seleccionado. Se emplean para darle a elegir al usuario entre un grupo de opciones mutuamente excluyentes.&lt;/li&gt;&lt;li&gt;&lt;em&gt;JList&lt;/em&gt;: componente que permite al usuario seleccionar una opción de una lista, que normalmente lleva un scroll incorporado; la opción se selecciona haciendo clic directamente sobre ella. Se emplea cuando el número de opciones entre las que ha de escoger el usuario es demasiado grande para presentárselas en forma de radiobuttons o checkboxes. Posee métodos para permitir selección simple o múltiple, seleccionar o deseleccionar una opción, averiguar que opción está seleccionada, etc.&lt;/li&gt;&lt;li&gt;&lt;em&gt;JComboBox&lt;/em&gt;: su filosofía es idéntica a la de JList, pero en esta ocasión las opciones no se ven en un principio. El usuario ha de hacer un clic sobre una pestaña que desplegará una lista de opciones sobre las cuales el usuario escoge una mediante un clic.&lt;/li&gt;&lt;li&gt;&lt;em&gt;JMenu&lt;/em&gt;: es el componente que permite generar los típicos menús a los que todos estamos acostumbrados. En estos menús se pueden añadir JChecBoxes y JRadioButtons.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Esta lista está muy lejos de ser una lista exhaustiva de todos los componentes de la librería Swing. La mejor forma de hacerse una idea de lo que es posible hacer con Swing es ejecutando la demo SwingSet2 que viene con todos los jdk. En Windows, puedes encontrar esa demo en el directorio "C:\Archivos de programa\Java\jdk1.6.0\demo\jfc\SwingSet2"; con hacer doble clic sobre el archivo "SwingSet2.jar" que encontrarás en esa localización se lanzará la demo que se puede ver en la figura 4. En ella se demuestran todos los componentes de swing, y se muestra el código fuente necesario para conseguir cada uno de los efectos.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;img src="/contenidos.downloadimg.action?id=3753246" rel="lightbox" /&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;FIGURA 4: Demo SwingSet2; esta demo que se distribuye con el JDK demuestra todos los componentes de la librería Swing.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Otra recomendación que le doy al lector para trabajar con Swing es que emplee el sentido común. Por ejemplo ¿Habrá algún método dentro de JList se me permita cambiar el tipo de fuente que emplea para mostrar los elementos de la lista? Parece que tiene bastante sentido que exista esta posibilidad es ¿no? Y efectivamente, existe. Si la intuición dice que un determinado método debería existir en un componente, lo más probable es que exista. Y, habitualmente, con echar un vistazo al javadoc y leer los nombres de los métodos es suficiente para localizarlo.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h4&gt;6&lt;span class="Apple-tab-span"&gt;	&lt;/span&gt;Creando un Applet&lt;/h4&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Un applet es un programa Java que puede ser incluido en una página web y que puede ejecutarse dentro de un navegador. Los applets funcionan siempre y cuando el equipo que los ejecuta tenga instalada una máquina virtual Java. &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Para ejecutar una aplicación Java dentro de una página web sin que el visitante de la página web sufra alguna violación de su intimidad o se arriesgue a sufrir daños en su ordenador hay ciertas limitaciones que poseen los applets respecto a las aplicaciones normales; estas son fundamentalmente:&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Un applet nunca podrá ejecutar un programa local de nuestra máquina.&lt;/li&gt;&lt;li&gt;Un applet sólo podrá comunicarse con la máquina servidora de la página web, pero no con ninguna otra máquina.&lt;/li&gt;&lt;li&gt;Un applet no puede nunca acceder a nuestro sistema de ficheros, ni para lectura ni para escritura.&lt;/li&gt;&lt;li&gt;Un applet es incapaz de averiguar información sobre la máquina en la que corre, aparte del sitema operativo, versión de la máquina virtual de Java y algún parámetro del sistema, como la resolución de la pantalla. Un applet nunca podría, por ejemplo, averiguar nuestra dirección de e-mail, el nombre del propietario de la máquina, etc.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Si un applet está firmado es posible, siempre bajo la autorización del usuario, darle a este applet más privilegios y romper las restricciones que hemos indicado sobre estas líneas. En el caso de los applets no firmados, debemos jugar con las reglas expuestas arriba.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Es muy simple convertir cualquier aplicación Swing que respete la lista de restricciones aquí recogida en un applet. Para ello simplemente tenemos que:&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Generar una página HTML con el código adecuado para cargar el applet. Puedes ver una página HTML mínima que incluye un applet en los códigos de descarga de este artículo.&lt;/li&gt;&lt;li&gt;Eliminar el método main. Su contenido habitualmente suele ser el código necesario para crear un objeto del tipo frame. Esto no será necesario, el navegador se encargará de crear nuestro objeto, de tipo applet.&lt;/li&gt;&lt;li&gt;Hacer que nuestra clase extienda a JApplet, en vez de a JFrame. Este es el contenedor del sistema operativo que se encarga de empotrar el applet dentro del navegador web.&lt;/li&gt;&lt;li&gt;Eliminar las llamadas a setSize(), ya que será la página HTML la que determine el tamaño de nuestro applet.&lt;/li&gt;&lt;li&gt;Eliminar las llamadas setTitle(), ya que será también el código HTML el que se encargará de ponerle título al applet.&lt;/li&gt;&lt;li&gt;Eliminar las llamadas a addWindowListener(); un applet no puede ser cerrado, es el navegador el que se encarga de iniciarlo y cerrarlo.&lt;/li&gt;&lt;li&gt;Reemplazar el constructor por un método llamado init(). Éste será el equivalente al constructor de una aplicación. Será automáticamente llamado cuando se cree el applet.&lt;/li&gt;&lt;li&gt;Hacer pública la clase del applet. Sino el navegador no tendrá permisos para crearlo.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Como mostramos en el listado 5, con sólo seguir estos simples pasos podemos transformar el código del listado 3 en un applet. En la figura 5 podemos ver nuestro applet ejecutándose en FireFox.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;img height="555" src="/contenidos.downloadimg.action?id=3791110" width="539" rel="lightbox" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;FIGURA 5: Nuestro applet ejecutándose en FireFox&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre&gt;//LISTADO 5: Nuestra aplicación transformada en un applet&lt;/pre&gt;&lt;pre&gt;... &lt;/pre&gt;&lt;pre&gt;public class Applet extends JApplet implements ActionListener{&lt;/pre&gt;&lt;pre&gt;    private JPanel panel = new JPanel();&lt;/pre&gt;&lt;pre&gt;    private JButton azul,rosa,amarillo,verde;&lt;/pre&gt;&lt;pre&gt;    public void init(){&lt;/pre&gt;&lt;pre&gt;        Container contentpane = getContentPane();&lt;/pre&gt;&lt;pre&gt;        panel.setLayout(new BorderLayout());&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre&gt;        azul = new JButton("Azul");&lt;/pre&gt;&lt;pre&gt;        azul.addActionListener(this);&lt;/pre&gt;&lt;pre&gt;        Dimension d = new Dimension(100,40);&lt;/pre&gt;&lt;pre&gt;        azul.setPreferredSize(d);&lt;/pre&gt;&lt;pre&gt;        //...&lt;/pre&gt;&lt;pre&gt;      //Ídem para los botones verde, amarillo y rosa&lt;/pre&gt;&lt;pre&gt;        panel.add(azul,BorderLayout.SOUTH);&lt;/pre&gt;&lt;pre&gt;        panel.add(verde,BorderLayout.NORTH);&lt;/pre&gt;&lt;pre&gt;        panel.add(amarillo,BorderLayout.EAST);&lt;/pre&gt;&lt;pre&gt;        panel.add(rosa,BorderLayout.WEST);&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre&gt;        contentpane.add(panel);&lt;/pre&gt;&lt;pre&gt;        panel.setBackground(Color.red);&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre&gt;    public void actionPerformed (ActionEvent e){&lt;/pre&gt;&lt;pre&gt;        Object source = e.getSource();&lt;/pre&gt;&lt;pre&gt;        if (source ==azul)&lt;/pre&gt;&lt;pre&gt;            panel.setBackground(Color.blue);&lt;/pre&gt;&lt;pre&gt;        if (source ==verde)&lt;/pre&gt;&lt;pre&gt;            panel.setBackground(Color.green);&lt;/pre&gt;&lt;pre&gt;        if (source ==amarillo)&lt;/pre&gt;&lt;pre&gt;            panel.setBackground(Color.yellow);&lt;/pre&gt;&lt;pre&gt;        if (source ==rosa)&lt;/pre&gt;&lt;pre&gt;            panel.setBackground(Color.pink);&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h4&gt;7&lt;span class="Apple-tab-span"&gt;	&lt;/span&gt;Diseñadores gráficos de interfaces Swing&lt;/h4&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Cualquier entorno de desarrollo Java actual que se precie incluye un diseñador gráfico de aplicaciones Swing. Estos diseñadores son herramientas en las cuales es posible construir una aplicación Swing simplemente seleccionando componentes de una paleta y arrastrándolos a una ventana en la cual vamos construyendo nuestra interfaz de usuario. Los diseñadores también nos permiten generar de modo automático gran parte del código necesario para la gestión de un evento. Lo más habitual cuando desarrollamos una aplicación de escritorio es apoyarnos en una de estas herramientas, y no escribir todo el código a mano cómo hemos hecho en este artículo. No obstante, para aprender programación gráfica lo más recomendable es hacer lo que hemos hecho en este artículo: escribir el código a mano. Si comenzamos a emplear directamente los diseñadores gráficos, no comprenderemos el código que generan y, cuando este código no se ajuste a nuestras necesidades, nos será imposible modificarlo. También nos será imposible retocar ese código sin la ayuda del diseñador.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; En el video del CD de la revista puedes ver cómo usar el diseñador de interfaces gráficas de Netbeans. Empleando ese diseñador, volveremos a recrear el ejemplo del listado 3 de este artículo, y después construiremos una pequeña calculadora (ver figura 6) que permita realizar sumas, restas, multiplicaciones y divisiones sobre números reales.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;img height="321" src="/contenidos.downloadimg.action?id=3829843" width="394" rel="lightbox" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;FIGURA 6: Calculadora construida con el diseñador de interfaces gráficas de usuario de Netbeans&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h4&gt;8&lt;span class="Apple-tab-span"&gt;	&lt;/span&gt;Conclusiones&lt;/h4&gt; &lt;p&gt;Con esto, damos por terminado este curso de programación sobre el lenguaje Java. A lo largo de estos siete capítulos, hemos presentado los fundamentos de la sintaxis del lenguaje, introducido la orientación a objetos y presentado las librerías más importantes: el framework de colecciones, la librería de entrada y salida, y Swing. Con la base que hemos dado hasta este momento el lector puede decidir cuál es el camino que más le interesa seguir dentro de Java: la programación de terminales móviles, la programación de aplicaciones de web o profundizar más en el desarrollo de aplicaciones de escritorio. &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Espero que esta serie de artículos os haya servido para dar nuestros primeros pasos en Java. También espero que sean sólo los primeros y que continuéis profundizando en el lenguaje de programación más usado en el mundo empresarial en la actualidad.&lt;/p&gt;&lt;br /&gt;&lt;p&gt; &lt;/p&gt;&lt;h4&gt;Descargas&lt;/h4&gt;&lt;p&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.javahispano.org/cursojava/CodigosArticulo7.zip"&gt;Códigos del artículo &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javahispano.org/cursojava/NetbeansIII.exe"&gt;Video del artículo (.exe para Windows)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javahispano.org/cursojava/NetbeansIII.vvl"&gt;Video del artículo (.vvl para Linux)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javahispano.org/cursojava/NetbeansIII.hqx"&gt;Video del artículo (.hqx para Mac Os)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javahispano.org/cursojava/NetbeansIII.swf"&gt;Video del artículo (.swf, flash multiplataforma)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h3&gt;Cápitulos anteriores del curso:&lt;/h3&gt;&lt;p&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.javahispano.org/contenidos/es/curso_de_programacion_java__abraham_otero/?menuId=ARTICLES&amp;onlypath=true"&gt;Curso de programación Java I&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javahispano.org/contenidos/es/curso_de_programacion_java_ii__abraham_otero/"&gt;Curso de programación Java II &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javahispano.org/contenidos/es/curso_de_programacion_java_ii__abraham_otero/"&gt;&lt;/a&gt;&lt;a href="http://www.javahispano.org/contenidos/es/curso_de_programacion_java_iii__abraham_otero/"&gt;Curso de programación Java III &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javahispano.org/contenidos/es/curso_de_programacion_java_iii__abraham_otero/"&gt;&lt;/a&gt;&lt;a href="http://www.javahispano.org/contenidos/es/curso_de_programacion_java_iv__abraham_otero/"&gt;Curso de programación Java IV &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javahispano.org/contenidos/es/curso_de_programacion_java_iv__abraham_otero/"&gt;&lt;/a&gt;&lt;a href="http://www.javahispano.org/contenidos/es/curso_de_programacion_java_v__abraham_otero/"&gt;Curso de programación Java V &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javahispano.org/contenidos/es/curso_de_programacion_java_vi__abraham_otero/"&gt;Curso de programación Java VI&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt; &lt;br /&gt;Comentarios: 5 Fecha &amp;uacute;ltimo comentario: 09/02/2010 07:41&lt;br /&gt;&lt;br /&gt;Noticia publicada en &lt;a href="http://www.javahispano.org"&gt;www.javahispano.org&lt;/a&gt;. Accede a la p&amp;aacute;gina web y participa&lt;img src="http://feeds.feedburner.com/~r/javahispano_noticias/~4/CjOSho9_-vg" height="1" width="1"/&gt;</description>
      <category domain="http://www.javahispano.org/contenidos/tags/NEWS/">Noticias</category>
      <category domain="http://www.javahispano.org/contenidos/tags/TUTORIALS/">Tutoriales</category>
      <category domain="http://www.javahispano.org/contenidos/tags/otro/">Otro</category>
      <category domain="http://www.javahispano.org/contenidos/tags/curso/">curso</category>
      <pubDate>Thu, 04 Feb 2010 16:44:43 GMT</pubDate>
      <guid>http://www.javahispano.org/contenidos/es/curso_de_programacion_java_vii_el_ultimo_de_la_serie_abraham_otero/?utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</guid>
      <dc:creator>abraham</dc:creator>
      <dc:date>2010-02-04T16:44:43Z</dc:date>
    </item>
    <item>
      <title>Foursquare migra a Scala/Lift</title>
      <link>http://www.javahispano.org/contenidos/es/foursquare_migra_a_scalalift/?utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
      <description>&lt;p&gt;&lt;a href="http://foursquare.com/" target="_blank"&gt;Foursquare&lt;/a&gt;&amp;nbsp;es un servicio que mezcla un servicio que mezcla una red social con un juego que permite ir &amp;quot;descubriendo&amp;quot; una ciudad. La idea es que los habitantes de una ciudad avisen donde se encuentran (un comercio, un parque, etc) y hagan alguna otra acci&amp;oacute;n, como recomendarlo o dar alg&amp;uacute;n tip sobre dicho lugar. Por cada acci&amp;oacute;n, se van ganando badges. Esta startup ha sido calificada por medios como el diario Washington Post y Mashable como la siguiente killer app en el mundo web y desde su lanzamiento en 2009 ha venido creciendo en su adopci&amp;oacute;n.&lt;/p&gt;&lt;p&gt;Por ello es relevante para la comunidad Scala que se haya&amp;nbsp;&lt;a href="http://www.scala-lang.org/node/5130" target="_blank"&gt;anunciado la completa migraci&amp;oacute;n&lt;/a&gt;&amp;nbsp;de la aplicaci&amp;oacute;n para que usara el lenguaje Scala y el framework web Lift. Scala permite un manejo sencillo de concurrencia, por lo que se adapt&amp;oacute; muy bien a los requerimientos de esta aplicaci&amp;oacute;n.&lt;/p&gt;&lt;p&gt;Harry Heinman es el ingeniero detr&amp;aacute;s de la migraci&amp;oacute;n y ha publicado&amp;nbsp;&lt;a href="http://docs.google.com/present/view?id=0ATHAG0M-0vxXZGNicHozY2tfMjVjemNuczJjMg&amp;amp;hl=en" target="_blank"&gt;una presentaci&amp;oacute;n&lt;/a&gt;&amp;nbsp;al respecto. En ella se puede leer que originalmente Foursquare corr&amp;iacute;a sobre el Stack LAMP usando PHP. &amp;Eacute;l decidi&amp;oacute; usar Scala porque ven&amp;iacute;a de un background Java y Lift se le hizo una buena apuesta. En total, la migraci&amp;oacute;n le tom&amp;oacute; 90 d&amp;iacute;as para el 90% del c&amp;oacute;digo y otros 60 d&amp;iacute;as para el 10% restante (el que atiende a los clientes m&amp;oacute;viles como el iphone).&amp;nbsp;&lt;/p&gt;&lt;p&gt;Ahora tiene alrededor de 14000 l&amp;iacute;neas de c&amp;oacute;digo, lo que es una base de c&amp;oacute;digo menor a la que hab&amp;iacute;a con PHP y de acuerdo a Heinman es m&amp;aacute;s entendible y con menos bugs. El servidor atiende por ahora 1 post por segundo en promedio.&lt;/p&gt;&lt;p&gt;Que un sitio web de alto perfil como Foursquare, ayudar&amp;aacute; a darle visibilidad a Scala y a Lift y es una demostraci&amp;oacute;n que el futuro de Java no pasa tanto por el lenguaje como por la JVM. &amp;nbsp;&lt;/p&gt;&lt;br /&gt;Comentarios: 5 Fecha &amp;uacute;ltimo comentario: 04/02/2010 20:41&lt;br /&gt;&lt;br /&gt;Noticia publicada en &lt;a href="http://www.javahispano.org"&gt;www.javahispano.org&lt;/a&gt;. Accede a la p&amp;aacute;gina web y participa&lt;img src="http://feeds.feedburner.com/~r/javahispano_noticias/~4/SWSOs-8UAIU" height="1" width="1"/&gt;</description>
      <category domain="http://www.javahispano.org/contenidos/tags/NEWS/">Noticias</category>
      <category domain="http://www.javahispano.org/contenidos/tags/otro/">Otro</category>
      <category domain="http://www.javahispano.org/contenidos/tags/foursquare/">foursquare</category>
      <category domain="http://www.javahispano.org/contenidos/tags/scala/">scala</category>
      <category domain="http://www.javahispano.org/contenidos/tags/lift/">lift</category>
      <pubDate>Thu, 04 Feb 2010 08:01:24 GMT</pubDate>
      <guid>http://www.javahispano.org/contenidos/es/foursquare_migra_a_scalalift/?utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</guid>
      <dc:creator>ecamacho</dc:creator>
      <dc:date>2010-02-04T08:01:24Z</dc:date>
    </item>
    <item>
      <title>JavaHispano Podcast - 072 - Spring2GXDay (Entrevista a Sergi Almar)</title>
      <link>http://www.javahispano.org/contenidos/es/javahispano_podcast__072__spring2gxday_entrevista_a_sergi_almar/?utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
      <description>&lt;p&gt;Publicado un nuevo número del podcast de javaHispano. En esta ocasión entrevistaremos a Sergi Almar que nos hablará del evento que se va a organizar el próximo 19 de febrero en Madrid. Durante la entrevista trataremos que temas y ponencias se van a realizar.&lt;/p&gt;&lt;p&gt;Links de interés:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.javahispano.org/spring2gxday/index.html"&gt;Página oficial&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javahispano.org/spring2gxday/agenda.html"&gt;Agenda&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javahispano.org/spring2gxday/registro.html"&gt;Registrarse para asistir&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Comentarios: 3 Fecha &amp;uacute;ltimo comentario: 09/02/2010 11:34&lt;br /&gt;&lt;br /&gt;Noticia publicada en &lt;a href="http://www.javahispano.org"&gt;www.javahispano.org&lt;/a&gt;. Accede a la p&amp;aacute;gina web y participa&lt;img src="http://feeds.feedburner.com/~r/javahispano_noticias/~4/pSuwYnoScNY" height="1" width="1"/&gt;</description>
      <category domain="http://www.javahispano.org/contenidos/tags/JH_PODCASTS/">Podcasts javaHispano</category>
      <category domain="http://www.javahispano.org/contenidos/tags/otro/">Otro</category>
      <category domain="http://www.javahispano.org/contenidos/tags/spring/">spring</category>
      <category domain="http://www.javahispano.org/contenidos/tags/evento/">evento</category>
      <category domain="http://www.javahispano.org/contenidos/tags/grails/">grails</category>
      <category domain="http://www.javahispano.org/contenidos/tags/groovy/">groovy</category>
      <pubDate>Tue, 02 Feb 2010 14:14:20 GMT</pubDate>
      <guid>http://www.javahispano.org/contenidos/es/javahispano_podcast__072__spring2gxday_entrevista_a_sergi_almar/?utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</guid>
      <dc:creator>JorgeRubira</dc:creator>
      <dc:date>2010-02-02T14:14:20Z</dc:date>
    </item>
    <item>
      <title>Steve Jobs critica durísimamente a Adobe</title>
      <link>http://www.javahispano.org/contenidos/es/steve_jobs_critica_durisimamente_a_adobe/?utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
      <description>&lt;p&gt;Durante la presentación de su famoso &lt;a href="http://www.apple.com/es/ipad/"&gt;iPad &lt;/a&gt;Jobs mostró en repetidas ocasiones como el dispositivo no soportaba flash. Cualquier persona que le conozca mínimamente, sabe de sobra que él practica las presentaciones docenas de veces, y que absolutamente nada sucede modo aleatorio en ellas. El hecho de que cuando Steve usaba el navegador varias páginas necesitasen flash y el dispositivo indicase claramente que no estaba soportado no podía ser una coincidencia.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Unos días después de la presentación del iPad Steve por fin ha explicado a que se debió aquel teatro. Según él, Adobe es ""perezoso"". Tienen el potencial para hacer cosas interesantes, pero se niegan a hacerlas. &lt;em&gt;Apple no soporta flash porque está lleno de bugs&lt;/em&gt;. Flash es la mayor causa de problemas en los Mac. Y &lt;em&gt;nadie va a usar Flash en el futuro; todo el mundo se va a mover a HTML 5&lt;/em&gt;.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Durísimas críticas del CEO de Apple a la compañía que probablemente más software vende para Mac OS. Este movimiento podría interpretarse como una llamada a todo el mundo a abandonar flash y a pasarse a HTML 5.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Francamente, estoy de acuerdo con él. El plugin de Flash sin duda es una de las aplicaciones que más a menudo me da problemas en mi equipo (Windows, pero es la misma historia). Su producto Acrobat tiene un problema similar. Personalmente, yo sólo necesitó un visor de PDFs y una impresora que permita generar PDF. No tengo ni idea que son los 1558 megas que el Adobe 8 ha instalado en mi equipo. Y Acrobat sin duda es la única aplicación de mi equipo que me da todavía más problemas que flash (especialmente cuando se ejecuta como un plugin de FireFox).&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;¿Creéis que Adobe ha perdido el norte y está favoreciendo las ""features"" en sus productos a costa de la calidad y la robustez? ¿Pueden estas palabras de Steve realmente acelerar la adopción de HTML 5 y fomentar el abandono de flash? ¿Creéis que puede ser posible una web sin flash dentro de unos pocos años?&lt;/p&gt;&lt;br /&gt;Comentarios: 52 Fecha &amp;uacute;ltimo comentario: 09/02/2010 15:04&lt;br /&gt;&lt;br /&gt;Noticia publicada en &lt;a href="http://www.javahispano.org"&gt;www.javahispano.org&lt;/a&gt;. Accede a la p&amp;aacute;gina web y participa&lt;img src="http://feeds.feedburner.com/~r/javahispano_noticias/~4/QaqpiWmPitk" height="1" width="1"/&gt;</description>
      <category domain="http://www.javahispano.org/contenidos/tags/NEWS/">Noticias</category>
      <category domain="http://www.javahispano.org/contenidos/tags/otro/">Otro</category>
      <category domain="http://www.javahispano.org/contenidos/tags/stevejobs/">SteveJobs</category>
      <category domain="http://www.javahispano.org/contenidos/tags/adobe/">Adobe</category>
      <category domain="http://www.javahispano.org/contenidos/tags/ipad/">ipad</category>
      <pubDate>Tue, 02 Feb 2010 09:44:00 GMT</pubDate>
      <guid>http://www.javahispano.org/contenidos/es/steve_jobs_critica_durisimamente_a_adobe/?utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</guid>
      <dc:creator>abraham</dc:creator>
      <dc:date>2010-02-02T09:44:00Z</dc:date>
    </item>
    <item>
      <title>Apache Jackrabbit 2.0</title>
      <link>http://www.javahispano.org/contenidos/es/apache_jackrabbit_2_0/?utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
      <description>&lt;span class="Apple-style-span"&gt;Apache anunci&amp;oacute; la semana pasada la disponibilidad de&amp;nbsp;&lt;a href="http://www.apache.org/dist/jackrabbit/2.0.0/RELEASE-NOTES.txt"&gt;Jackrabbit 2.0&lt;/a&gt;, una implementaci&amp;oacute;n de la especificaci&amp;oacute;n JCR 2.0 (Java&amp;nbsp;&lt;span class="Apple-style-span"&gt;Content Repository). Esta nueva versi&amp;oacute;n requiere Java 5 o superior para funcionar y permite la indexaci&amp;oacute;n de m&amp;uacute;ltiples tipos de documentos gracias al uso del proyecto&amp;nbsp;&lt;span class="Apple-style-span"&gt;&lt;a href="http://lucene.apache.org/tika/"&gt;Apache Tika&lt;/a&gt;, un sub proyecto de Lucene.&lt;/span&gt;&lt;/span&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;iquest;Hay por aqu&amp;iacute; alg&amp;uacute;n usuario de Jackrabbit?&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;Comentarios: 2 Fecha &amp;uacute;ltimo comentario: 03/02/2010 11:58&lt;br /&gt;&lt;br /&gt;Noticia publicada en &lt;a href="http://www.javahispano.org"&gt;www.javahispano.org&lt;/a&gt;. Accede a la p&amp;aacute;gina web y participa&lt;img src="http://feeds.feedburner.com/~r/javahispano_noticias/~4/ZHW0qNTBhco" height="1" width="1"/&gt;</description>
      <category domain="http://www.javahispano.org/contenidos/tags/NEWS/">Noticias</category>
      <category domain="http://www.javahispano.org/contenidos/tags/j2ee/">JavaEE</category>
      <category domain="http://www.javahispano.org/contenidos/tags/jackrabbit/">Jackrabbit</category>
      <pubDate>Tue, 02 Feb 2010 09:24:26 GMT</pubDate>
      <guid>http://www.javahispano.org/contenidos/es/apache_jackrabbit_2_0/?utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</guid>
      <dc:creator>abraham</dc:creator>
      <dc:date>2010-02-02T09:24:26Z</dc:date>
    </item>
  </channel>
</rss>
