<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Haferson&#039;s blog</title>
	<atom:link href="http://haferson.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://haferson.wordpress.com</link>
	<description>&#34;No temo a los ordenadores; lo que temo es quedarme sin ellos&#34;</description>
	<lastBuildDate>Sun, 27 Feb 2011 22:52:31 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='haferson.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Haferson&#039;s blog</title>
		<link>http://haferson.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://haferson.wordpress.com/osd.xml" title="Haferson&#039;s blog" />
	<atom:link rel='hub' href='http://haferson.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Anotaciones Java</title>
		<link>http://haferson.wordpress.com/2009/06/11/anotaciones-java/</link>
		<comments>http://haferson.wordpress.com/2009/06/11/anotaciones-java/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 19:25:39 +0000</pubDate>
		<dc:creator>Haferson</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Anotaciones]]></category>
		<category><![CDATA[Sun]]></category>

		<guid isPermaLink="false">http://haferson.wordpress.com/?p=118</guid>
		<description><![CDATA[Las últimas versiones de JDK han estado apuntando a la mejora de las facilidades de desarrollo. Una de estas facilidades de desarrollo son las ya conocidas anotaciones. Una anotación es una forma de añadir metadatos al código fuente de Java que están disponibles para la aplicación en tiempo de ejecución. Cuando se compila el código [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=haferson.wordpress.com&amp;blog=5519517&amp;post=118&amp;subd=haferson&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Las últimas versiones de JDK han estado apuntando a la mejora de las facilidades de desarrollo. Una de estas facilidades de desarrollo son las ya conocidas anotaciones.</p>
<p>Una anotación es una forma de añadir metadatos al código fuente de Java que están disponibles para la aplicación en tiempo de ejecución. Cuando se compila el código fuente, el compilador almacena los metadatos de las anotaciones en los ficheros de clases. Posteriormente la JVM (maquina virtual) busca los metadatos para determinar como interactuar con los elementos del programa o cambiar su comportamiento.</p>
<p>Como observan, la ventaja de las anotaciones es que nos permiten declarar en el código fuente como debe comportarse el software. Sin embargo, una de las desventajas mas claras es que añadir metadatos en tiempo de ejecución puede causar sobrecarga adicional de memoria (existen pocos estándares que indiquen como usarlos). A partir de aquí, se hablará sobre las anotaciones de manera mas detallada.<span id="more-118"></span></p>
<p>Cuando se habla de anotaciones hay que considerar lo que es una anotación que es una meta-etiqueta que se usa en el código fuente para darle algo de vida, y un tipo de anotación que es la definición de una anotación. Entonces, a partir de ello afirmamos que el tipo de anotación es el que se usa y la anotación es el uso específico de ese tipo.</p>
<p>Un tipo de anotación esta definido de la siguiente manera:</p>
<p><code>   public @interface MiAnotacion{<br />
      String mensaje();<br />
   }</code></p>
<p>Una anotación esta definida de la siguiente manera:</p>
<p><code>   @MiAnotacion (mensaje=”Anotación en Java”)<br />
   public void MiMetodo(){<br />
      //...<br />
   }</code></p>
<p>Los tipos de anotaciones son básicamente tres:</p>
<p>1. Marcador, que son las que no tienen elementos (llameasen elementos a los que están declarados dentro de los paréntesis en la definición) como por ejemplo:</p>
<p>Definición:</p>
<p><code>   public @interface MiAnotacion{}</code></p>
<p>Uso:</p>
<p><code>   @MiAnotacion<br />
   public void MiMetodo(){<br />
      //...<br />
   }</code></p>
<p>2. Valor único, que son aquellas que tienen un solo elemento. Este elemento puede estar declarado como un par de nombre-valor o solamente el nombre.</p>
<p>Definición:</p>
<p><code>   public @interface MiAnotacion(){<br />
      String mensaje();<br />
   }</code></p>
<p>Nota: Cuando se declara el(los) elemento(s) sin valor, siempre deben de tener al final los paréntesis, caso contrario, cuando se declara el elemento con valor, los paréntesis no van.</p>
<p><code>   public @interface MiAnotacion(){<br />
      String mensaje=”Java”;<br />
   }</code></p>
<p>Uso:</p>
<p><code>   @MiAnotacion(mensaje=”Anotación Java”)<br />
   public void MiMetodo(){<br />
      //...<br />
   }</code></p>
<p>Nota: Por defecto, cuando se trata de un tipo de anotación de valor único, en el uso de la anotación se puede omitir el nombre del elemento.</p>
<p><code>   @MiAnotacion(”Anotación Java”)<br />
   public void MiMetodo(){<br />
      //...<br />
   }</code></p>
<p>3. Valores múltiples, que son aquellos que tienen más de un elemento declarado. Al igual que en los de valor único, pueden estar definido como un par de nombre-valor o solamente nombre.</p>
<p>Definición:</p>
<p><code>   public @interface MiAnotacion(){<br />
      String mensaje();<br />
      int cantidad();<br />
   }</code></p>
<p>Uso:</p>
<p><code>   @MiAnotacion(mensaje=”Anotación Java”,cantidad=1)<br />
   public void MiMetodo(){<br />
      //...<br />
   }</code></p>
<p>Nota: Cuando se trata de un tipo de anotación de valor múltiple, en el uso de la anotación se puede es obligatorio escribir el nombre del elemento.</p>
<p>Las reglas básicas para definir un tipo de anotación son:</p>
<ul>
<li>La declaracion de un tipo de anotacion debe empezar con el signo @, seguido de la palabra interface y el nombre de la anotacion.</li>
<li>Los metodos de las declaraciones (elementos) no deben tener ningun parámetro.</li>
<li>Los metodos de las declaraciones no deben tener las clasulas throw.</li>
<li>El tipo de retorno de los metodos deben ser uno de los siguientes:</li>
</ul>
<p>                    o Primitives (int, double, float, long, bolean, byte, char)<br />
                    o String<br />
                    o Class<br />
                    o Enum<br />
                    o Array de algunos tipos mencionados.</p>
<p>JDK posee dos tipos de anotaciones:</p>
<p>1. Anotaciones simples que son los tipos básicos de anotación. No se pueden utilizar estos tipos de anotaciones para crear a partir de ellos un nuevo tipo de anotación. </p>
<p>2. Meta Anotaciones que son los tipos de anotaciones designados para anotar una anotar un tipo de anotación.  Comúnmente son denominadas como anotaciones de las anotaciones.  </p>
<p>Dentro de las anotaciones simples tenemos tres tipos: </p>
<p>1. Override que indica que el método de la anotación es requerido implementarlo nuevamente para anular al método de la clase superior. Ejemplo:</p>
<p><code>   public class demo{<br />
      @Override<br />
      public String toString(){<br />
         return super.toString() + " usando @Override";<br />
      }</code> <br />
<code>      public static void main(String[] arhs){<br />
         demo d = new demo();<br />
         System.out.println(d.toString());<br />
      }<br />
   }</code></p>
<p>Que pasaría si el método de la anotación se escribiera mal, por ejemplo si se cambia el nombre del método toString a tostring?. Pues sencillamente el compilador nos advertirá de un error:</p>
<p><code>   Error: method does not override or implement a method<br />
          from a supertype<br />
   @Override<br />
   1 error</code></p>
<p>Esto es debido a que no existe un método con el nombre tostring perteneciente a una clase superior (jerárquicamente) para anular y volver a sobrescribirlo.<br />
 </p>
<p>2. Deprecated que indica que cuando se utiliza un elemento (sea atributo, método, etc) obsoleto desde otra clase, el compilador debería advertir sobre ello.</p>
<p>       <code>public class demo{  <br />
     @Deprecated<br />
     public void imprimir(){<br />
        System.out.println("usando @Deprecated");<br />
     }   <br />
   }</code></p>
<p><code>   public class test{       <br />
      public static void main(String[] arhs){<br />
         demo d = new demo();<br />
         d.imprimir();<br />
      }<br />
   }</code></p>
<p>Si compilamos la clase demo, el compilador no debería de mostrarnos ningún mensaje. Pero si compilamos la clase test, el compilador nos mostrara un mensaje (warning) de que el método es obsoleto para su uso.</p>
<p><code>   test.java uses or overrides a deprecated API.<br />
   Note: Recompile with -Xlint:deprecation for details.</code><br />
 </p>
<p>3. Suppresswarnings que indica que las advertencias (warnings), que el compilador  muestra, sean suprimidas. El tipo de warning que se desea suprimir es dado como argumento en la anotacion (“deprecation”, ”all”, ”try”, etc).</p>
<p>        <code>public class demo{  <br />
      @Deprecated<br />
      public void imprimir(){<br />
         System.out.println("usando @Deprecated");<br />
      }   <br />
   }</code><br />
 <br />
<code>   public class test{       <br />
      @SuppressWarnings("deprecation")<br />
      public void star(){<br />
         demo d = new demo();<br />
         d.imprimir();<br />
      }   <br />
      public static void main(String[] arhs){<br />
         new test().star();       <br />
      }<br />
   }</code></p>
<p>Si compilamos la clase test, el compilador no mostrará ningún mensaje de obsolescencia de método (deprecated) debido a que ese warning ha sido suprimido por el método star que es el que tiene la anotación SuppressWarnings. Sin embargo ese warning ha sido de alguna manera resguardado por el compilador.</p>
<p>Las Meta Anotaciones, más conocidas como anotaciones de las anotaciones, tienen 4 tipos: </p>
<p>1. Target que indican los elementos específicos de una clase en la que el tipo de anotación se le aplicará. Entre ellos tenemos: </p>
<ul>
<li><code>@Target(ElementType.TYPE)</code> – aplicable a cualquier elemento de una clase.</li>
<li><code>@Target(ElementType.FIELD)</code> – aplicable a propiedades o atributos de una clase.</li>
<li><code>@Target(ElementType.METHOD)</code> – aplicable a métodos de una clase.</li>
<li><code>@Target(ElementType.PARAMETER)</code> – aplicable a parámetros de un método .</li>
<li><code>@Target(ElementType.CONSTRUCTOR)</code> – aplicable a constructores.</li>
<li><code>@Target(ElementType.LOCAL_VARIABLE)</code> – aplicable a variables locales.</li>
<li>@Target(ElementType.ANNOTATION_TYPE) – indica que la declaración del mismo tipo es un tipo de anotación.</li>
</ul>
<p>En el siguiente ejemplo, primero definimos el tipo de anotación. El código lo guardamos en un archivo llamado anotacion.java</p>
<p><code>   import java.lang.annotation.*;<br />
   @Target(ElementType.METHOD)<br />
   public @interface anotacion{<br />
      public String mensaje();<br />
   }</code><br />
 <br />
Uso del tipo de anotación:</p>
<p><code>   public class test{       <br />
      @anotacion(mensaje="target")<br />
      public void star(){<br />
         System.out.println("usando @Target");<br />
      }   <br />
      public static void main(String[] arhs){<br />
         new test().star();       <br />
      }<br />
   }</code></p>
<p>El tipo de anotación creada indica que solamente puede ser utilizable para métodos. Entonces, si compilamos en código anterior, no habrá mensajes de advertencia. Ahora ¿que pasará si la anotación la usamos para una variable?.</p>
<p><code>   public class test{       <br />
      @anotacion(mensaje="target")<br />
      String variable = "";<br />
      public void star(){<br />
         System.out.println("usando @Target");<br />
      }   <br />
      public static void main(String[] arhs){<br />
         new test().star();       <br />
      }<br />
   }</code></p>
<p>Sencillamente el compilador mostrará un error en el que nos informa que el tipo de anotacion que se esta usando no es valida para el elemento de la clase (variable).</p>
<p><code>   annotation type not applicable to this kind of declaration<br />
   @anotacion(mensaje="target")<br />
   1 error</code></p>
<p>Nota: Si se desea utilizar un tipo de anotación para varios elementos, estos tendrán que ser declarados separados por comas.</p>
<p><code>   //...<br />
   @Target(ElementType.METHOD, ElementType.FIELD)<br />
   //...</code> </p>
<p>2. Retention que indican donde las anotaciones serán tomadas en cuenta. Dentro de estas anotaciones existen tres valores: </p>
<ul>
<li><code>RetentionPolicy.SOURCE</code> – las anotaciones serán tomadas en cuenta a nivel de código fuente y serán ignoradas por el compilador.</li>
<li><code>RetentionPolicy.CLASS</code> – las anotaciones serán tomadas en cuenta por el compilador pero serán ignoradas por la JVM (maquina virtual).</li>
<li><code>RetentionPolicy.RUNTIME</code> – las anotaciones serán tomadas en cuenta por la JVM (maquina virtual) en tiempo de ejecución.</li>
</ul>
<p>En el siguiente código mostramos un tipo de anotación que será tomada en cuenta en tiempo de ejecución.</p>
<p><code>   import java.lang.annotation.*;<br />
   @Retention(RetentionPolicy.RUNTIME)<br />
   public @interface anotacion{<br />
      public String mensaje();<br />
   }</code></p>
<p>3. Documented que indican que las anotaciones debería ser documentada por la herramienta javadoc. Por defecto, las anotaciones no están incluidas en javadoc, sin embargo las anotaciones deberían de estar incluidas en la generación del documento.</p>
<p>En el siguiente código mostramos dos tipos de anotaciones (una retention y otra documented) en donde la notación documented será documentada por la herramienta javadoc.</p>
<p><code>   import java.lang.annotation.*;<br />
   @Retention(RetentionPolicy.RUNTIME)<br />
   public @interface retention{<br />
      public String mensaje();<br />
   }</code></p>
<p><code>   import java.lang.annotation.*;<br />
   @Documented<br />
   public @interface documented{<br />
      public String mensaje();<br />
   }</code></p>
<p><code>   public class test{<br />
      @retention(mensaje="anotacion java")<br />
      public void imprime_retention(){<br />
         System.out.println("usando @Retention");<br />
      }<br />
      @documented(mensaje="anotacion java")<br />
      public void imprime_documented(){<br />
         System.out.println("usando @Documented");<br />
     }<br />
     public static void main(String[] arhs){<br />
         new test().imprime_retention();<br />
         new test().imprime_documented();<br />
     }<br />
   }</code></p>
<p>Luego de ello procederemos a documentar las clases antes descritas utilizando la herramienta javadoc. En linea de comando se logra con el comando:</p>
<p><code>   #javadoc test.java</code>           </p>
<p>Y lo que obtendremos es un archivo html en donde se puede observar que el método imprime_retention no tiene información sobre el tipo de anotación que se la ha asignado, sin embargo para el método imprimir_documented si lo tiene por el mismo hecho de haberle colocado una anotación de tipo documented.</p>
<p><img class="size-full wp-image-119 alignnone" src="http://haferson.files.wordpress.com/2009/06/anotacj.jpg?w=700" alt="anotacj"   /></p>
<p> 4. Inherited que indica que la clase de la anotación pueden ser heredada por cualquier otra subclase. Más detalladamente, si se define una anotación inherited las subclases descendientes obtienen todas las propiedades de la clase madre, al mismo estilo que la herencia tradicional de Java.</p>
<p> Vamos a ver en el siguiente código como una anotación es heredada de otra anotación.</p>
<p>Anotación padre:</p>
<p><code>   import java.lang.annotation.*;<br />
   @Inherited<br />
   public @interface padre{<br />
      public boolean esHeredada() default true;<br />
       public String mensaje() default "Anotacion";<br />
   }</code></p>
<p>Anotación hijo:</p>
<p><code>   @padre<br />
   public class hijo{<br />
                  //...      <br />
   }</code></p>
<p>Como se puede observar, no se tiene que definir los métodos de la interfaz dentro de la clase, pues éstos son heredados automáticamente al utilizar la etiqueta @Inherited.</p>
<p>Ahora se tendra en la cabeza: que pasaria si se define la clase hijo al estico clasico de Java, es decir, hacer descender de la clase padre con “implements”?. En este caso si tendra que redefinir todos los metodos pertenecientes a la interfaz (clase padre) ademas de redefinir los metodos equals(), toString(), y hasCode() de la clase java.lang.Object y annotationType () de la clase java.lang. annotation.Annotation.</p>
<p>Entonces nuestra clase hijo seria algo así:</p>
<p><code>   import java.lang.annotation.*;<br />
   public class hijo implements padre{<br />
      public boolean esHeredada(){<br />
         return false;<br />
      }                      <br />
      public String mensaje(){<br />
         return "";<br />
      }                      <br />
      public boolean equals(Object obj){<br />
         return false;<br />
     }   <br />
     public int hasCode(){<br />
        return 0;<br />
     }   <br />
     public String toString(){<br />
        return "";<br />
     }<br />
     public Class annotationType(){<br />
        return null;<br />
     }<br />
   }</code></p>
<p>Conclusión<br />
El objetivo es pasar más tiempo en el análisis e implementación de las reglas de negocio (lógica de negocio) y no en el código fuente (la forma como se implementa).<br />
 <br />
Bibliografía<br />
<a href="http://www.developer.com/java/other/article.php/10936_3556176_1">http://www.developer.com/java/other/article.php/10936_3556176_1</a></p>
<p>Referencia<br />
<a href="http://tirandolineas.wordpress.com/2007/10/23/anotacionesjava/">http://tirandolineas.wordpress.com/2007/10/23/anotacionesjava/</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/haferson.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/haferson.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/haferson.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/haferson.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/haferson.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/haferson.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/haferson.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/haferson.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/haferson.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/haferson.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/haferson.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/haferson.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/haferson.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/haferson.wordpress.com/118/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=haferson.wordpress.com&amp;blog=5519517&amp;post=118&amp;subd=haferson&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://haferson.wordpress.com/2009/06/11/anotaciones-java/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a61d8e3fcfe6d140984cbbc10f1f675d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Haferson</media:title>
		</media:content>

		<media:content url="http://haferson.files.wordpress.com/2009/06/anotacj.jpg" medium="image">
			<media:title type="html">anotacj</media:title>
		</media:content>
	</item>
		<item>
		<title>Programando con SWT &amp; Java</title>
		<link>http://haferson.wordpress.com/2009/05/15/programando-con-swt-java/</link>
		<comments>http://haferson.wordpress.com/2009/05/15/programando-con-swt-java/#comments</comments>
		<pubDate>Fri, 15 May 2009 18:25:55 +0000</pubDate>
		<dc:creator>Haferson</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[SWT]]></category>

		<guid isPermaLink="false">http://haferson.wordpress.com/?p=20</guid>
		<description><![CDATA[En esta ocasión, les voy a mostrar como desarrollar una pequeña aplicación haciendo uso de SWT &#38; Java, pero primero tengo que explicar en forma muy resumida que es SWT. SWT (Standard Widget Toolkit) es una plataforma de desarrollo de Interfaz gráfica de usuario que no tiene nada que envidiar a Swing y AWT (plataformas [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=haferson.wordpress.com&amp;blog=5519517&amp;post=20&amp;subd=haferson&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>En esta ocasión, les voy a mostrar como desarrollar una pequeña aplicación haciendo uso de SWT &amp; Java, pero primero tengo que explicar en forma muy resumida que es SWT.</p>
<p>SWT (Standard Widget Toolkit) es una plataforma de desarrollo de Interfaz gráfica de usuario que no tiene nada que envidiar a Swing y AWT (plataformas GUI actuales de Java).  Fue creada por IBM para facilitar el desarrollo del IDE Eclipse y actualmente es mantenida por esta ultima (Eclipse).</p>
<p>Una de las ventajas de SWT es que utilizan menos memoria que Swing, razón por la cual es una buena opción para el desarrollo de aplicaciones clientes. Pero bueno, comencemos de una vez…</p>
<p>Primero tenemos que descargar la libreria SWT desde <a href="http://www.eclipse.org/swt/">http://www.eclipse.org/swt/</a>.  Una vez descargado, descomprimimos el .zip e importamos los .jar como librerías externas. Con ello ya estamos listos para programar la aplicación.</p>
<p>Entonces vamos a crear una ventana con una caja de texto y un botón, La idea es que ingresaremos nuestro nombre a la caja de texto y al presionar el botón nos mostrara un mensaje personalizado (con el nombre incluido).</p>
<p><span id="more-20"></span></p>
<p>Primero importamos las librerías a utilizar:</p>
<p><code>  import org.eclipse.swt.SWT;</code><br />
<code>  import org.eclipse.swt.graphics.*;</code><br />
<code>  import org.eclipse.swt.events.*;</code><br />
<code>  import org.eclipse.swt.widgets.*;</code></p>
<p>En la primera línea importamos una clase denominada SWT. Esta clase vendría a ser muy importante en cuanto a su importación, debido a que dentro de ella se encuentran declaradas la mayor parte (por no decir todo) de constantes de todo tipo, como por ejemplo constantes de iconos de imágenes, de nombres de teclas de keyboard, de colores, de tipos de formato de texto, etc.</p>
<p>Luego importamos la  librería graphics porque utilizaremos la clase Rectangle para la ubicación de la ventana principal. El conjunto de clases que conforman esta librería están dirigidas para el tratamiento de gráficos, dentro de ella podemos encontrar clases como Image, Point,  Font entre otras (clases que tambien las tiene Java en AWT).</p>
<p>Tambien importamos la librería events, que contiene todos los tipos de eventos de los controles a utilizar. En esta ocasión haremos uso del evento clic cuando se presione el botón.</p>
<p>Por ultimo, importamos la librería widgets, que es en donde se encuentran todos los controles gráficos que permitirán al usuario interactuar con la aplicación.</p>
<p>Como es normal, declaramos nuestra clase, la cual la he denominado Application:</p>
<p><code>  class Application{</code></p>
<p>Escribimos el tradicional método main, punto de entrada de la aplicación. Dentro de este método es donde construiremos la interfaz de usuario, para posteriormente mostrarla.</p>
<p><code>    public static void main(String[] args){</code></p>
<p>En SWT una ventana normal es referenciada por un objeto Shell. Para cualquier aplicación SWT es necesario utilizar un objeto display, debido a que éste objeto constituye la pantalla actual en la que se creara la ventana.</p>
<p><code>      Display display = new Display();</code><br />
<code>      final Shell shell = new Shell(display);</code></p>
<p>Vamos con el primer control a utilizar, llamado Group, que es una especie de panel encerrado por un borde. Si observan en la creación del control, tiene como primer parámetro el contenedor donde va a estar situado éste control (en este caso shell que es la ventana principal) y como segundo parámetro una constante tomada de la clase SWT…. Se explica el contructor de este objeto, porque los demás objetos que conforman la librería widget tiene la misma forma (todos tiene la misma forma de constructor).</p>
<p><code>      Group group = new Group(shell,SWT.NULL);</code></p>
<p>Utilizamos el método setText(…) para colocar una etiqueta en el borde.</p>
<p><code>      group.setText("Demo Java &amp; SWT");</code></p>
<p>Situamos el control dandole las coordenadas dentro del formulario a través del método setBounds(….)</p>
<p><code>       group.setBounds(20,20,300,100);</code></p>
<p>Hasta allí se ha visto un primer control de SWT. Ahora pasaremos a ver los demás controles a utilizar en nuestra aplicación. La creación y construcción de estos controles se realiza de la misma forma como se hizo con el control Group.<br />
Label que representa a una etiqueta. SWT.LEFT para que el texto se ubique a la izquierda.</p>
<p><code>      Label label = new Label(group,SWT.LEFT);</code><br />
<code>      label.setText("Ingrese su nombre :");</code><br />
<code>      label.setBounds(30,25,100,25);</code></p>
<p>Text que representa a una caja de entrada de texto. En este caso la declaramos como final debido a que se va a utilizar dentro de una redefinición de una interfaz (la interfaz de evento clic de boton). Hay que notar que en su constructor, el segundo parámetro lo constituye un conjunto de constantes separada por el carácter “|” … esto es válido para todos los controles.  SWT.SINGLE para que no sea multilínea y  SWT.BORDER para que este contenido dentro de un borde</p>
<p><code>      final Text text = new Text(group,SWT.SINGLE | SWT.BORDER);</code><br />
<code>      text.setBounds(150,25,120,20);</code></p>
<p>Button que representa a un botón. En su segundo parámetro declaramos SWT.PUSH ya que hace referencia a un botón normal. (Existen otros tipos de botones que son identificados con otras constantes)</p>
<p><code>      Button button = new Button(group,SWT.PUSH);</code><br />
<code>      button.setText("Click me !");</code><br />
<code>      button.setBounds(170,65,100,25);</code></p>
<p>Ahora asociaremos el escuchador de evento clic que en SWT esta dado por un objeto SelectionListener.</p>
<p><code>      button.addSelectionListener(new SelectionListener(){</code></p>
<p>Dentro de ello re-definimeros dos metodos importantes que administra el escuchador de evento SelectionListener.<br />
Primero widgetDefaultSelected(…) no relevante es nuestra aplicación.</p>
<p><code>      public void widgetDefaultSelected(SelectionEvent event) {}</code></p>
<p>Y segundo widgetSelected (…) que tiene como parámetro un objeto SelectioEvent que es el que registra información sobre el evento de selección(clic).</p>
<p><code>      public void widgetSelected(SelectionEvent event) {</code></p>
<p>Este método se ejecuta cuando el boton es presionado. Entonces aquí se definira el control para mostrar el mensaje personalizado.</p>
<p>Para mostrar el mensaje utilizaremos el control MessageBox.<br />
           <br />
<code>        MessageBox messageBox = new MessageBox(shell, SWT.OK | SWT.ICON_INFORMATION);</code><br />
<code>        messageBox.setText("Mensage desde SWT");</code><br />
<code>        messageBox.setMessage("Bienvenido "+text.getText() + " a conocer SWT !!!");</code></p>
<p>Para lanzarlo, es decir, mostrarlo, utilizaremos el metodo open()</p>
<p><code>         messageBox.open();</code><br />
<code>      }</code><br />
<code>      });</code></p>
<p>Bueno… hasta aquí esta el 95% de la aplicación. Lo que resta son lineas de codigo que personalizan nuestra ventana principal.</p>
<p>Un título</p>
<p><code>      shell.setText("Mi primera aplicacion con SWT");</code></p>
<p>Un tamaño</p>
<p><code>      shell.setSize(340,150);</code></p>
<p>La situamos en el centro de la pantalla, para lo cual tendremos que hacer uso de un objeto Monitor para poder obtener sus dimensiones atravez de un objeto Rectangle.</p>
<p><code>      Monitor primary = display.getPrimaryMonitor();</code><br />
<code>      Rectangle bounds = primary.getBounds();</code><br />
<code>      Rectangle rect = shell.getBounds();</code><br />
<code>      int x = bounds.x + (bounds.width - rect.width) / 2;</code><br />
<code>      int y = bounds.y + (bounds.height - rect.height) / 2;</code></p>
<p>Ubicamos la venta de la aplicacion</p>
<p><code>      shell.setLocation(x, y);</code></p>
<p>Mostramos la ventana de la aplicación al usuario a travez del metodo open()</p>
<p><code>      shell.open();</code></p>
<p>El siguiente segmento de codigo es para controlar que la ventana siga mostrandose hasta que sea cerrada o destruida. En tal caso, la pantalla sera liberada del formulario.</p>
<p><code>        while (!shell.isDisposed()) {</code><br />
<code>          if (!display.readAndDispatch())</code><br />
<code>            display.sleep();</code><br />
<code>        }</code><br />
<code>        display.dispose();</code><br />
<code>     }</code><br />
<code>  }</code></p>
<p>Aquí se tiene todo el codigo:</p>
<p><code>import org.eclipse.swt.SWT;</code><br />
<code>import org.eclipse.swt.graphics.*;</code><br />
<code>import org.eclipse.swt.events.*;</code><br />
<code>import org.eclipse.swt.widgets.*;</code> </p>
<p><code>class Application{</code><br />
<code>   public static void main(String[] args){</code><br />
<code>      Display display = new Display();</code><br />
<code>      final Shell shell = new Shell(display);</code></p>
<p><code>      Group group = new Group(shell,SWT.NULL);</code><br />
<code>      group.setText("Demo Java &amp; SWT");</code><br />
<code>      group.setBounds(20,20,300,100);</code></p>
<p><code>      Label label = new Label(group,SWT.LEFT);</code><br />
<code>      label.setText("Ingrese su nombre :");</code><br />
<code>      label.setBounds(30,25,100,25);</code></p>
<p><code>      final Text text = new Text(group,SWT.SINGLE | SWT.BORDER);</code><br />
<code>      text.setBounds(150,25,120,20);</code><br />
<code>               </code><br />
<code>      Button button = new Button(group,SWT.PUSH);</code><br />
<code>      button.setText("Click me !");</code><br />
<code>      button.setBounds(170,65,100,25);</code><br />
<code>      button.addSelectionListener(new SelectionListener(){</code><br />
<code>         public void widgetDefaultSelected(SelectionEvent event) {}</code></p>
<p><code>         public void widgetSelected(SelectionEvent event) {</code>          <br />
<code>            MessageBox messageBox = new MessageBox(shell, SWT.OK | SWT.ICON_INFORMATION); </code><br />
<code>            messageBox.setText("Mensage desde SWT");</code><br />
<code>            messageBox.setMessage("Bienvenido "+text.getText() + " a conocer SWT !!!");</code><br />
<code>            messageBox.open(); </code><br />
<code>         }</code><br />
<code>});</code><br />
<code>      shell.setText("Mi primera aplicacion con SWT");</code><br />
<code>      shell.setSize(340,150);</code></p>
<p><code>      Monitor primary = display.getPrimaryMonitor();</code><br />
<code>      Rectangle bounds = primary.getBounds();</code><br />
<code>      Rectangle rect = shell.getBounds();</code><br />
<code>      int x = bounds.x + (bounds.width - rect.width) / 2;</code><br />
<code>      int y = bounds.y + (bounds.height - rect.height) / 2;</code><br />
<code>      shell.setLocation(x, y);</code><br />
<code>      shell.open();</code><br />
<code>      while (!shell.isDisposed()) {</code><br />
<code>         if (!display.readAndDispatch())</code><br />
<code>            display.sleep();</code><br />
<code>      }</code><br />
<code>      display.dispose();</code><br />
<code>   }</code><br />
<code>}</code></p>
<p>Se ejectua, y obtendremos el siguiente resultado:</p>
<p><img class="aligncenter size-full wp-image-51" title="Dibujo" src="http://haferson.files.wordpress.com/2009/05/dibujo3.jpg?w=700" alt="Dibujo"   /></p>
<p><img class="aligncenter size-full wp-image-52" title="Dibujo2" src="http://haferson.files.wordpress.com/2009/05/dibujo21.jpg?w=700" alt="Dibujo2"   /></p>
<p>Esto ha sido todo por hoy, alguna crítica, aporte, opinión u otra cosa será bien recibida en este blog.</p>
<p>Para los más interesados, aquí les dejo algunos links para mayor información:</p>
<p> <a href="http://es.wikipedia.org/wiki/SWT">http://es.wikipedia.org/wiki/SWT</a><br />
<a href="http://www.chuidiang.com/chuwiki/index.php?title=SWT-JFace">http://www.chuidiang.com/chuwiki/index.php?title=SWT-JFace</a><br />
<a href="http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/CatalogSWT-JFace-Eclipse.htm">http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/CatalogSWT-JFace-Eclipse.htm</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/haferson.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/haferson.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/haferson.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/haferson.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/haferson.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/haferson.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/haferson.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/haferson.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/haferson.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/haferson.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/haferson.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/haferson.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/haferson.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/haferson.wordpress.com/20/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=haferson.wordpress.com&amp;blog=5519517&amp;post=20&amp;subd=haferson&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://haferson.wordpress.com/2009/05/15/programando-con-swt-java/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a61d8e3fcfe6d140984cbbc10f1f675d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Haferson</media:title>
		</media:content>

		<media:content url="http://haferson.files.wordpress.com/2009/05/dibujo3.jpg" medium="image">
			<media:title type="html">Dibujo</media:title>
		</media:content>

		<media:content url="http://haferson.files.wordpress.com/2009/05/dibujo21.jpg" medium="image">
			<media:title type="html">Dibujo2</media:title>
		</media:content>
	</item>
	</channel>
</rss>
