<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9134030404464162547</id><updated>2012-02-17T00:06:41.427-03:00</updated><category term='javafx UI'/><category term='best practices'/><category term='javafx'/><category term='osgi'/><category term='marshalling'/><category term='jasperreports'/><category term='java'/><category term='semaphores'/><category term='jaxb'/><category term='unmarshalling'/><title type='text'>Java Curiosities</title><subtitle type='html'>Este es un blog en donde iremos explorando y experimentando con distintas herramientas del lenguaje Java.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://javacuriosities.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://javacuriosities.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Luis De Bello</name><uri>http://www.blogger.com/profile/04336187134558663051</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9134030404464162547.post-619570825783344146</id><published>2011-03-06T20:21:00.000-03:00</published><updated>2011-03-06T20:21:10.214-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='marshalling'/><category scheme='http://www.blogger.com/atom/ns#' term='unmarshalling'/><category scheme='http://www.blogger.com/atom/ns#' term='jaxb'/><title type='text'>Marshalling and Unmarshalling</title><content type='html'>Hola primero que nada vamos a explicar que significan estas dos palabras y una breve introduccion de porque surgio el post.&lt;br /&gt;Marshalling: Significa crear un documento XML de un árbol de contenido(En nuestro caso el arbol del contenido seria un Objeto Java).&lt;br /&gt;Unmarshalling: Significa crear un árbol de contenido de un documento XML.&lt;br /&gt;Basicamente esto seria serialization y deserialization.&lt;br /&gt;Este post surgió porque hace un tiempo tuve que hacer un desarrollo donde venia la información en un XML y yo debía parsear el XML aplicar cierta lógica de negocio y devolver un XML como respuesta. Para esto lo único que me brindaron fueron un XML llamado request y otro response.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt; &lt;br /&gt;La verdad es que no tenia muchas ganas de hacer las cosas a mano así que me puse a investigar y encontré algunas cosas bastante interesante, como por ejemplo la API JAXB que es la tecnología de java que provee un API y una herramienta para ligar el esquema XML a una representación en código java.&lt;br /&gt;Básicamente esta API nos provee un conjunto de Annotations y clases para hacer el bindeo entre nuestra estructura en los objetos Java y el XML, o mejor aun si nosotros poseemos el XSD del XML podes utilizar la herramienta xjc (Viene por defecto en la distrubución del jdk) para que nos genere la clases del dominio.&lt;br /&gt;&lt;br /&gt;XMLs:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;request.xml&lt;br /&gt;&lt;br /&gt;&amp;lt;?xml version='1.0' encoding='utf-8' ?&amp;gt;&lt;br /&gt;&amp;lt;Parameters&amp;gt;&lt;br /&gt;  &amp;lt;UserId&amp;gt;AH875&amp;lt;/UserId&amp;gt;&lt;br /&gt;  &amp;lt;SystemId&amp;gt;Test&amp;lt;/SystemId&amp;gt;&lt;br /&gt;&amp;lt;/Parameters&amp;gt; &lt;br /&gt;&lt;br /&gt;response.xml&lt;br /&gt;&lt;br /&gt;&amp;lt;?xml version='1.0' encoding='utf-8' ?&amp;gt;&lt;br /&gt;&amp;lt;Response&amp;gt;&lt;br /&gt;  &amp;lt;Status&amp;gt;Ok&amp;lt;/Status&amp;gt;&lt;br /&gt;  &amp;lt;Data&amp;gt;&lt;br /&gt;   &amp;lt;SubSystem&amp;gt;&lt;br /&gt;    &amp;lt;SubSystemId&amp;gt;1&amp;lt;/SubSystemId&amp;gt;&lt;br /&gt;    &amp;lt;Name&amp;gt;SubSystem1&amp;lt;/Name&amp;gt;&lt;br /&gt;   &amp;lt;/SubSystem&amp;gt;&lt;br /&gt;   &amp;lt;SubSystem&amp;gt;&lt;br /&gt;    &amp;lt;SubSystemId&amp;gt;2&amp;lt;/SubSystemId&amp;gt;&lt;br /&gt;    &amp;lt;Name&amp;gt;SubSystem2&amp;lt;/Name&amp;gt;&lt;br /&gt;   &amp;lt;/SubSystem&amp;gt;&lt;br /&gt;  &amp;lt;/Data&amp;gt;&lt;br /&gt;&amp;lt;/Response&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Como les dije antes la verdad no tenia muchas ganas de hacerlo a mano así que empece a buscar una herramienta que genere el XSD en base al XML y encontré una muy buena, les dejo el link &lt;br /&gt;&lt;a href="http://www.thaiopensource.com/download/" title="trang XML2XSD"&gt;Trang(trang20030619.zip)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Si la bajan y la utilizan lograran obtener los XSD de sus XML aquí les dejo los míos&lt;br /&gt;&lt;br /&gt;XSDs:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;request.xsd&lt;br /&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"&amp;gt;&lt;br /&gt;  &amp;lt;xs:element name="Parameters"&amp;gt;&lt;br /&gt;    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;        &amp;lt;xs:element ref="UserId"/&amp;gt;&lt;br /&gt;        &amp;lt;xs:element ref="SystemId"/&amp;gt;&lt;br /&gt;      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;  &amp;lt;xs:element name="UserId" type="xs:NCName"/&amp;gt;&lt;br /&gt;  &amp;lt;xs:element name="SystemId" type="xs:NCName"/&amp;gt;&lt;br /&gt;&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;&lt;br /&gt;response.xsd&lt;br /&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"&amp;gt;&lt;br /&gt;  &amp;lt;xs:element name="Response"&amp;gt;&lt;br /&gt;    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;        &amp;lt;xs:element ref="Status"/&amp;gt;&lt;br /&gt;        &amp;lt;xs:element ref="Data"/&amp;gt;&lt;br /&gt;      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;  &amp;lt;xs:element name="Status" type="xs:NCName"/&amp;gt;&lt;br /&gt;  &amp;lt;xs:element name="Data"&amp;gt;&lt;br /&gt;    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;        &amp;lt;xs:element maxOccurs="unbounded" ref="SubSystem"/&amp;gt;&lt;br /&gt;      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;  &amp;lt;xs:element name="SubSystem"&amp;gt;&lt;br /&gt;    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;        &amp;lt;xs:element ref="SubSystemId"/&amp;gt;&lt;br /&gt;        &amp;lt;xs:element ref="Name"/&amp;gt;&lt;br /&gt;      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;  &amp;lt;xs:element name="SubSystemId" type="xs:integer"/&amp;gt;&lt;br /&gt;  &amp;lt;xs:element name="Name" type="xs:NCName"/&amp;gt;&lt;br /&gt;&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Ahora que tenemos nuestros xsd podemos utilizar xjc para obtener nuestras clases java con sus respectivas annotations.&lt;br /&gt;&lt;br /&gt;Les dejo el ejemplo completo para que puedan descargarlo y probarlo. La verdad hay muchas cosas ya resueltas de manera elegante y eficiente solo hace falta conocerlas.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mediafire.com/?t0bz7m77blld5x9/" title="Example"&gt;Example&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Saludos,&lt;br /&gt;Luis&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9134030404464162547-619570825783344146?l=javacuriosities.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacuriosities.blogspot.com/feeds/619570825783344146/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://javacuriosities.blogspot.com/2011/03/marshalling-and-unmarshalling.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/619570825783344146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/619570825783344146'/><link rel='alternate' type='text/html' href='http://javacuriosities.blogspot.com/2011/03/marshalling-and-unmarshalling.html' title='Marshalling and Unmarshalling'/><author><name>Luis De Bello</name><uri>http://www.blogger.com/profile/04336187134558663051</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9134030404464162547.post-7359122440326630633</id><published>2011-01-02T17:32:00.001-03:00</published><updated>2011-01-02T17:32:43.273-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jasperreports'/><title type='text'>Jasper Reports -Virtualizar-</title><content type='html'>Hoy les contare sobre un problema que tuve durante estos días, estoy en el desarrollo de una aplicación constituida con Java para el lado servidor y Flex para el lado cliente, últimamente la aplicación había tenido unos problemas con el consumo de memoria luego de analizarla descubrí que esto era básicamente por dos motivos uno de ellos relacionados con Hibernate y el levantamiento de 60000 objetos en memoria lo cual al fin de cuentas lo termine resolviendo con NameQuery, pero aun tenía problemas cuando se ejecutaban varios reportes ya que la memoria del servidor subía inmesuradamente, a continuación les dejo la solución que encontré.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt; &lt;br /&gt;Antes que nada quiero recomendarles que cuando tengan un problema de memoria utilicen jVisualVM es un programa que te deja conectarte al servidor y ver la cantidad de instancias en memoria y así analizar cuál es la que se queda alocada o cuales consumen mucho, como primer paso use el programa y me conecte al servidor (Tomcat) y comencé a arrojar reportes al parecer el GC (Garbage Collector) corría de forma normal pero cuando había muchos reportes al mismo tiempo veía que la cantidad de instancia de JRTemplatePrintText crecía drásticamente.&lt;br /&gt;Luego de investigar un poco encontré que Jasper Report durante su proceso de fill (Obtener los datos y rellenar la plantilla del informe con estos) levantaba los objetos en memoria, entonces la forma de abordar este problema es de dos maneras: &lt;br /&gt;La paginación y la virtualización.&lt;br /&gt;&lt;b&gt;Paginación&lt;/b&gt; se refiere a obtener el informe en trozos, en lugar de recoger toda la información de golpe, pero como al final los datos se tienen que mostrar juntos en un único informe, nos introducen la &lt;b&gt;virtualización&lt;/b&gt;. La virtualización es una técnica que consiste en serializar los datos, para no saturar la memoria heap.&lt;br /&gt;Cabe aclarar que incluir virtualización conlleva la pérdida de rendimiento.&lt;br /&gt;&lt;br /&gt;Aquí un ejemplo de cómo tendríamos que usar la virtualizacion:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;JasperPrint jasperprint = null;&lt;br /&gt;JRFileVirtualizer virtualizer = new JRFileVirtualizer(10, "tmp");&lt;br /&gt;&lt;br /&gt;long start = System.currentTimeMillis();  &lt;br /&gt;&lt;br /&gt;filterParameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);&lt;br /&gt;&lt;br /&gt;jasperprint = JasperFillManager.fillReport(this.reportFile,this.filterParameters, this.databaseConnection);&lt;br /&gt;&lt;br /&gt;virtualizer.setReadOnly(true);&lt;br /&gt;logger.info("Filling time : " + (System.currentTimeMillis() - start));&lt;br /&gt;&lt;br /&gt;// Usamos los exportadores para generar el reporte en lo que nosotros queramos.&lt;br /&gt;&lt;br /&gt;virtualizer.cleanup();&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Se vemos el ejemplo veremos que básicamente creamos un JasperPrint como lo haríamos normalmente pero al momento de generar este JasperPrint  por medio del método fillReport de la clase JasperFillManager notamos que en los parámetros le pasamos un Virtualizer esto básicamente quiere decir que Jasper ira creando archivos temporales en la carpeta que le pasamos como segundo parámetro y el primer parámetro es usado para saber el tamaño máximo de los archivos, como ultima línea no debemos olvidar hacer un cleanup del virtualizer para borrar los archivos creados.&lt;br /&gt;&lt;br /&gt;Bueno espero que este simple post les sirva como me sirvió a mí encontrar esta técnica para no malgastar memoria durante la generación de reportes ya sean medianos o grandes&lt;br /&gt;Vale recordarles que deben tener en cuenta el balance entre performance y gasto de memoria esto lo pueden manejar con el tamaño máximo de los archivos.&lt;br /&gt;&lt;br /&gt;Saludos,&lt;br /&gt;Luis&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9134030404464162547-7359122440326630633?l=javacuriosities.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacuriosities.blogspot.com/feeds/7359122440326630633/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://javacuriosities.blogspot.com/2011/01/jasper-reports-virtualizar.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/7359122440326630633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/7359122440326630633'/><link rel='alternate' type='text/html' href='http://javacuriosities.blogspot.com/2011/01/jasper-reports-virtualizar.html' title='Jasper Reports -Virtualizar-'/><author><name>Luis De Bello</name><uri>http://www.blogger.com/profile/04336187134558663051</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9134030404464162547.post-4728544653656051825</id><published>2010-08-28T14:03:00.002-03:00</published><updated>2010-08-29T11:24:32.398-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='semaphores'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Semaphores</title><content type='html'>Hola como están, hoy estaremos viendo un ejemplo de cómo usar Semaphores en Java, a partir de la versión de 1.5 se hicieron unas extensiones importantes al paquete java.util.concurrent la cual vino acompañada de la clase Semaphore la cual brinda la funcionalidad que necesitaremos.&lt;br /&gt;&lt;span class="fullpost"&gt; &lt;br /&gt;Para entender su uso lo haremos en base a un ejemplo real, en mi trabajo hace unos días surgió el siguiente issue, tenemos algunas clases singleton que funcionan como Providers, el problema es que a su vez tenemos procesos concurrentes que usan este Provider y cada uno hace un refresh de los datos para tener la ultima versión de los datos. Durante esta semana sucedió que N procesos (Fijaremos N=5) corrieron casi al mismo tiempo por ende cada uno de ellos intento refrescar el singleton todos a la vez como el método que hace el refresh esta sincronizado sucedía que actualizaba los datos para 1 Thread y los otros 4 Thread esperaban, después volvía a refrescar para el siguiente Thread y los restantes esperaban y  así sucesivamente, les adjunto una imagen para entender mejor el problema.&lt;br /&gt;&lt;img src="http://www.softdesigner.com.ar/java/Semaphores/semaphore.png" alt="Problem Image" /&gt;&lt;br /&gt;Para evitar que los 5 Thread realicen el refresh se decidió ejecutar solo un refresh y encolar los otros 4 esperando que el que está realizando el refresh termine, para esto tuvimos que modificar nuestro singleton y utilizar Semaphores y syncronized por medio de un mutex. Aqui está la clase singleton modificada y ahora explicaremos cada paso.&lt;br /&gt;&lt;pre&gt;&lt;code&gt; &lt;br /&gt;package com.javacuriosities.examples;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.concurrent.Semaphore;&lt;br /&gt;&lt;br /&gt;public class Singleton {&lt;br /&gt;&lt;br /&gt; private static Singleton instance;&lt;br /&gt;&lt;br /&gt; private volatile boolean refreshing = false;&lt;br /&gt;&lt;br /&gt; private Object mutex = new Object();&lt;br /&gt;&lt;br /&gt; private List&amp;lt;Semaphore&amp;gt; pendings = new ArrayList&amp;lt;Semaphore&amp;gt;();&lt;br /&gt;&lt;br /&gt; public synchronized static Singleton getSingleInstance() {&lt;br /&gt;  if (instance == null) {&lt;br /&gt;   instance = new Singleton();&lt;br /&gt;  }&lt;br /&gt;  return instance;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void refreshAll(String threadName) {&lt;br /&gt;  if (!checkRefreshingStatus()) {&lt;br /&gt;   refresh(threadName);&lt;br /&gt;  } else {&lt;br /&gt;   Semaphore markPending = addSemaphore(threadName);&lt;br /&gt;   acquireSemaphore(markPending, threadName);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private void refresh(String threadName) {&lt;br /&gt;  try {&lt;br /&gt;   refreshInfo(threadName);&lt;br /&gt;  } catch (Exception e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  } finally {&lt;br /&gt;   releasePending();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private void acquireSemaphore(Semaphore markPending, String threadName) {&lt;br /&gt;  try {&lt;br /&gt;   if (markPending != null) {&lt;br /&gt;    System.out.println("Acquire semaphore: " + threadName);&lt;br /&gt;    markPending.acquire();&lt;br /&gt;   } else {&lt;br /&gt;    System.out.println("Avoid semaphore: " + threadName);&lt;br /&gt;   }&lt;br /&gt;  } catch (InterruptedException e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private Semaphore addSemaphore(String threadName) {&lt;br /&gt;  Semaphore markPending = null;&lt;br /&gt;  synchronized (mutex) {&lt;br /&gt;   if (isRefreshing()) {&lt;br /&gt;    markPending = new Semaphore(0, true);&lt;br /&gt;    pendings.add(markPending);&lt;br /&gt;    System.out.println("Add semaphore to: " + threadName);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  return markPending;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private void releasePending() {&lt;br /&gt;  synchronized (mutex) {&lt;br /&gt;   System.out.println("Release semaphores");&lt;br /&gt;   for (Semaphore semaphore : pendings) {&lt;br /&gt;    semaphore.release();&lt;br /&gt;   }&lt;br /&gt;   pendings.clear();&lt;br /&gt;   refreshing = false;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private synchronized boolean checkRefreshingStatus() {&lt;br /&gt;  boolean previousState = refreshing;&lt;br /&gt;  if (!refreshing) {&lt;br /&gt;   refreshing = true;&lt;br /&gt;  }&lt;br /&gt;  return previousState;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private void refreshInfo(String threadName) {&lt;br /&gt;  for (int i = 0; i &lt; 1000; i++) {&lt;br /&gt;   System.out.println("Executing refresh: " + threadName);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public boolean isRefreshing() {&lt;br /&gt;  return refreshing;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Iré explicando todos los cambios que hemos efectuado para conseguir lo que esperábamos a su vez iremos viendo como seria el flujo de ejecución. Nota: La clase ha sido modifica para que sirva para las pruebas y el ejemplo.&lt;br /&gt;1) El método refreshAll dejo de ser synchronized.&lt;br /&gt;2) Apenas comienza este método tenemos un IF el cual llama a un método synchronized donde se pregunta si se está refrescando y se cambia el estado del flag refreshing.&lt;br /&gt;3) El primer Thread que llegue a esta parte entrara por el IF los demás se irán por el ELSE.&lt;br /&gt;4) El Thread 1 comienza a refrescar la información, los otros van por el lado del ELSE y entran en el método addSemaphore como vemos este método usa sincronización por mutex esto es para asegurarnos que no se agregan semaphores a la lista mientras la estamos liberando por otro lado, si la lista no se esta liberando y además aun está corriendo el refresh creamos un semaphore y lo retornamos.&lt;br /&gt;5) Si se pudo crear el semaphore se intentan hacer acquire del mismo, si no se logro crear significa que el refresh termino y no era necesaria la espera. Usamos el método acquire para decirle a un semaphore que se quede esperando hasta que sea liberado esto sería el equivalente a hacer this.wait() y esperar que por otra parte del código se haga un this.notify().&lt;br /&gt;6) Otro tema importante es que si la lógica del refresh falla igual debemos liberar los semaphores pendientes sino estaremos lockeando el proceso., por eso el releasePending se encuentra en un bloque finally.&lt;br /&gt;&lt;br /&gt;Notar que los semaphore son creados con 0 permits lo que signica que al hacer acquire quedaran esperando que la cantidad de permits este en 1, esto se logra por medio del método release que incrementa en 1 los permits del semaphore.&lt;br /&gt;&lt;br /&gt;Les adjunto un zip con la clase singleton mas una clase de test que dispara 20 Threads. Espero que este post les sea de ayuda para ver algún ejemplo de concurrencia y threading en Java, cualquier cosa que no se entienda del post todas las preguntas son bienvenidas al igual que las criticas.&lt;br /&gt;&lt;br /&gt;Este post es en honor a tuky que últimamente está muy curioso sobre temas varios de programación.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.softdesigner.com.ar/java/Semaphores/Semaphores.zip"&gt;Example&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Saludos,&lt;br /&gt;Luis&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9134030404464162547-4728544653656051825?l=javacuriosities.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacuriosities.blogspot.com/feeds/4728544653656051825/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://javacuriosities.blogspot.com/2010/08/semaphores.html#comment-form' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/4728544653656051825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/4728544653656051825'/><link rel='alternate' type='text/html' href='http://javacuriosities.blogspot.com/2010/08/semaphores.html' title='Semaphores'/><author><name>Luis De Bello</name><uri>http://www.blogger.com/profile/04336187134558663051</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9134030404464162547.post-7762854640049091183</id><published>2010-05-09T09:28:00.059-03:00</published><updated>2010-05-10T08:03:25.040-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='osgi'/><title type='text'>OSGi (First Steps)</title><content type='html'>Decidí hacer este post porque no encontré ningun tutorial que nos explique OSGi desde cero, aclaro que en este post haremos una introducción para que después podamos continuar con algo más avanzado.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;¿Que es OSGi?&lt;/span&gt;&lt;br /&gt;OSGI (Open Services Gateway Initiative), podríamos definirlo como un sistema (o framework) modular para Java que establece las formas de crear módulos y la manera en que estos interactuaran entre sí en tiempo de ejecución. OSGi intenta solventar los problemas del tradicional "classloader" de la máquina virtual y de los servidores de aplicaciones Java. En OSGI, cada módulo tiene su propio classpath separado del resto de classpath de los demás módulos.&lt;br /&gt;&lt;br /&gt;Este framework proporciona a los desarrolladores un entorno orientado a servicios y basado en componentes, ofreciendo estándares para manejar los ciclos de vida del software.&lt;br /&gt;OSGi esta divido en capas que en proximo post iremos cubriendo por ahora se mencionan para que se conozca la existencia de ellas.&lt;br /&gt;&lt;br /&gt;Security Layer.&lt;br /&gt;Module Layer.&lt;br /&gt;Life Cycle Layer.&lt;br /&gt;Service Layer.&lt;br /&gt;Execution Environment.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;OSGi Alliance&lt;/span&gt;&lt;br /&gt;La OSGi Alliance es un consorcio de empresas tecnológicas a nivel mundial que trata de asegurar la interoperabilidad de las aplicaciones y servicios basados en esta plataforma entre las empresas que componen este consorcio, podemos encontrar compañías de diversa índole: automoción, aeronáutica, fabricantes de electrodomésticos, telecomunicaciones, fabricantes de teléfonos... Algunos ejemplos de miembros: Motorola, Nokia, Mitsubishi Electric Corporation, Vodafone Group Services, LinkedIn, LG Electronics...&lt;br /&gt;La alianza proporciona las especificaciones, las implementaciones de referencia, las suites de prueba y la certificación.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Especificacion OSGi&lt;/span&gt;&lt;br /&gt;OSGI proporciona un marco de trabajo java de uso general, seguro y administrado que&lt;br /&gt;soporta el despliegue dinámico de aplicaciones conocidas como "Bundles" o módulos.&lt;br /&gt;Algunas de las características que componen este marco de trabajo:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Es un sistema de módulos para la plataforma java.&lt;/li&gt;&lt;li&gt;Incluye reglas de visibilidad, gestión de dependencias y versionado de los bundles.&lt;/li&gt;&lt;li&gt;Es dinámico.&lt;/li&gt;&lt;li&gt;La instalación, arranque, parada, actualización y desinstalación de bundles se realiza dinámicamente en tiempo de ejecución sin tener que detener por completo la&lt;br /&gt;plataforma.&lt;/li&gt;&lt;li&gt;Se trata de una arquitectura orientada a servicios.&lt;/li&gt;&lt;li&gt;Los servicios pueden ser registrados y consumidos dentro de la VM.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Implementacones OSGi&lt;/span&gt;&lt;br /&gt;Lo bueno de tener una aplicación modular es que a diferencia de una aplicación web nosotros vamos deployando unidades independientes las cuales se pueden cambiar con gran facilidad, esto quiere decir que si necesitáramos reemplazar un modulo por otro muchas veces no sería necesario detener toda la aplicación sino ciertos módulos y todo seguiría andando, además tenemos versionado de Bundles (Módulos) lo cual es muy útil para poder ir haciendo que nuestros módulos usen otros pero de alguna versión especifica.&lt;br /&gt;Podemos encontrar varias plataformas certificadas en OSGi las cuales cumplen con la especificación de modo que si nosotros desarrolláramos nuestros módulos ellos podrían correr en cualquiera de estas implementaciones, algunas de ellas son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Apache Felix.&lt;/li&gt;&lt;li&gt;Eclipse Equinox.&lt;/li&gt;&lt;li&gt;Knopflerfish.&lt;/li&gt;&lt;li&gt;Newton Project.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Preparando mi entorno OSGi&lt;/span&gt;&lt;br /&gt;Para este post utilizaremos la implementación de Eclipse Equinox para nuestros ejemplos, nos dirigimos a &lt;a href="http://download.eclipse.org/equinox/"&gt;Eclipse Equinox&lt;/a&gt; desde aquí podremos realizar la descarga del entorno de trabajo, tenemos varias opciones:&lt;br /&gt;&lt;br /&gt;Descarga de la implementación OSGI base: Se trata de un fichero .jar (bundle),&lt;br /&gt;que contiene los elementos básicos para poder ejecutar nuestro entorno.&lt;br /&gt;&lt;br /&gt;Descarga completa de equinox: Se trata de un fichero .zip que contiene el bundle&lt;br /&gt;base comentado anteriormente, más todas las configuraciones e implementaciones&lt;br /&gt;de los servicios OSGI.&lt;br /&gt;&lt;br /&gt;Descarga de los bundles opcionales: Mediante esta opción podremos descargar&lt;br /&gt;uno a uno los bundles de equinox que implementan los diferentes servicios de&lt;br /&gt;OSGI.&lt;br /&gt;&lt;br /&gt;Para este ejemplo bajaremos la descarga completa para facilitar las cosas, luego podremos descomprimir este zip en nuestro disco. Dentro de la carpeta plugins del zip que descargamos encontraremos un jar llamado org.eclipse.osgi_3.x.x_xxx.jar el cual es util para dos cosas la primera levanta el entorno OSGi y desde aqui podremos instalar, iniciar, detener, desinstalar nuestros módulos, y además podremos usar este jar para desarrollar en el eclipse ya que contiene las clases/interfaces de la implementación OSGi. Les dejo un print screen de mi eclipse con el desarrollo del ejemplo que sigue.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.softdesigner.com.ar/java/OSGi/OSGiEclipse.png"&gt;OSGiEclipse.png&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ejemplo Basico&lt;/span&gt;&lt;br /&gt;Como es típico empezaremos con un Hello World, ósea aquí no estaríamos construyendo una aplicación que nos diga Hello World sino que estaríamos creando un modulo el cual por vivir en un contender OSGi tiene un ciclo de vida completo. Básicamente crear un modulo sería crear un jar con nuestras clases y un archivo MANIFEST.MF&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Entendiendo el MANIFEST.MF&lt;/span&gt;&lt;br /&gt;El Manifesft.mf no es más que un archivo de texto en el cual se agregan directivas del tipo clave: valor, las cuales juegan un papel muy importante ya que son las que irán diciéndole al marco de trabajo OSGi algunas de las cosas importante sobre nuestro modulo a continuación muestro un Manifest de ejemplo y explico sus directivas.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;Manifest-Version: 1.0&lt;br /&gt;Bundle-ManifestVersion: 2&lt;br /&gt;Bundle-Name: HelloWorld&lt;br /&gt;Bundle-SymbolicName: com.javacuriosities.osgi.helloworld&lt;br /&gt;Bundle-Version: 1.0.0&lt;br /&gt;Bundle-Activator: com.javacuriosities.osgi.helloworld.Activator&lt;br /&gt;Import-Package: org.osgi.framework;specification-version="1.4.0"&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Manifest-Version&lt;/span&gt;&lt;br /&gt;Define la versión del archivo MANIFEST.MF.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bundle-ManifestVersion&lt;/span&gt;&lt;br /&gt;Indica la especificación de OSGi sobre la que está basada el bundle. Por defecto, si no se indica nada, el valor es 1. Este valor indica que el bundle se basa en las reglas de la especificación OSGI 3. Si tiene valor 2, se tratará de la especificación de OSGI 4.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bundle-Name&lt;/span&gt;&lt;br /&gt;Indica el nombre corto del Bundle debe ser human-readable.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bundle-SymbolicName&lt;/span&gt;&lt;br /&gt;Esta etiqueta define un nombre único para el bundle. Con este nombre es con el que trabajaremos en el entorno de ejecución.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bundle-Version&lt;/span&gt;&lt;br /&gt;Indica la versión de nuestro bundle, dentro de nuestro entorno podríamos tener diferentes versiones de un mismo bundle.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bundle-Activator&lt;/span&gt;&lt;br /&gt;Indica que clase funcionara como Activator, la cual es una clase que debe implementar la interfaz BundleActivator de modo que podamos entrar dentro del ciclo de vida de nuestro Bundle.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Import-Package&lt;/span&gt;&lt;br /&gt;Por medio de esta directiva le decimos que paquetes queremos importar, si nos ponemos a pensar esta línea es muy importante porque nuestro jar solamente tendra nuestras clases pero por ejemplo la interfaz BundleActivator ya es parte del modulo core de OSGi asi no estaría dentro de nuestro jar así que por medio de esta directiva la importamos para que todo funcione.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Implementando nuestro Activator&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;package com.javacuriosities.osgi.helloworld;&lt;br /&gt;&lt;br /&gt;import org.osgi.framework.BundleActivator;&lt;br /&gt;import org.osgi.framework.BundleContext;&lt;br /&gt;&lt;br /&gt;public class Activator implements BundleActivator{&lt;br /&gt;@Override&lt;br /&gt;public void start(BundleContext arg0) throws Exception {&lt;br /&gt; System.out.println("Hello World"); &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void stop(BundleContext arg0) throws Exception {&lt;br /&gt; System.out.println("Bye Bye"); &lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Empaquetando e instalando&lt;/span&gt;&lt;br /&gt;Luego de poder crear nuestro modulo deberemos empaquetarlo como un jar podríamos usar el eclipse o el comando jar que viene con java, el jar nos debería quedar de la siguiente forma&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;com.javacuriosities.osgi.helloworld_1.0.0.jar&lt;br /&gt;    com\javacuriosities\osgi\helloworld\Activar.class&lt;br /&gt;    META-INF\MANIFEST.MF&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Debemos iniciar nuestro entorno OSGi para esto haremos lo siguiente iremos al directorio donde descomprimimos el entorno Eclipse Equinox y dentro de la carpeta plugins ejecutaremos la siguiente línea de comando, luego veremos que el prompt cambia a osgi&gt; y ahí pondremos ss para ver nuestros bundles instalados.&lt;br /&gt;&lt;br /&gt;java -jar org.eclipse.osgi_3.x.x_xxx.jar -console&lt;br /&gt;&lt;br /&gt;Ahora instalaremos nuestro bundle(.jar) copiaremos nuestro bundle al Disco C:\ y ejecutaremos el comando&lt;br /&gt;&lt;br /&gt;install file:c:\com.javacuriosities.osgi.helloworld_1.0.0.jar&lt;br /&gt;&lt;br /&gt;si todo va bien aparecerá un mensaje del tipo Bundle id is XX, ahora con este id ya podremos iniciar, detener y desinstalar nuestro modulo. Para probar ejecutaremos estos dos comandos.&lt;br /&gt;&lt;br /&gt;start XX --&gt; Ahi veremos nuestro mensaje del método start de la clase Activator.&lt;br /&gt;stop XX --&gt; Ahi veremos nuestro mensaje del método stop de la clase Activator.&lt;br /&gt;&lt;br /&gt;Adjunto un screen de la consola con los comandos.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.softdesigner.com.ar/java/OSGi/OSGiConsole.png"&gt;OSGiConsole.png&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bueno esto ha sido por este post, espero haber sido lo suficientemente claro para que se entienda el ejemplo y los conceptos básicos de OSGi, cualquier pregunta o sugerencia es bien recibida.&lt;br /&gt;&lt;br /&gt;Saludos y hasta pronto.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9134030404464162547-7762854640049091183?l=javacuriosities.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacuriosities.blogspot.com/feeds/7762854640049091183/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://javacuriosities.blogspot.com/2010/05/osgi-first-step.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/7762854640049091183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/7762854640049091183'/><link rel='alternate' type='text/html' href='http://javacuriosities.blogspot.com/2010/05/osgi-first-step.html' title='OSGi (First Steps)'/><author><name>Luis De Bello</name><uri>http://www.blogger.com/profile/04336187134558663051</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9134030404464162547.post-6835525060077387343</id><published>2010-03-13T16:22:00.007-03:00</published><updated>2010-03-14T23:40:03.401-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best practices'/><title type='text'>Java Best Practices</title><content type='html'>Después de mucho tiempo de no realizar ningún post vuelvo para compartir una presentación que estoy realizando sobre buenas prácticas de programación espero les sea útil.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;La idea de estar presentación es ir actualizándola lo más que se pueda,  así queda como un documento de referencia para las personas que estén interesadas en ir programando cada día mejor.&lt;br /&gt;Aclaro que no soy ningún experto acepto cualquier comentario que puede ir mejorando la presentación ya que esto está pensado para todos y la idea es que si alguien tiene alguna idea que agregar me avise y la agregamos.&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_3424120"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/luisdebello/best-practices-3424120" title="Best Practices"&gt;Best Practices&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=bestpractices-100313181446-phpapp02&amp;stripped_title=best-practices-3424120" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=bestpractices-100313181446-phpapp02&amp;stripped_title=best-practices-3424120" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/luisdebello"&gt;Luis De Bello&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.softdesigner.com.ar/java/BestPractices.rar"&gt;Download Best Practices&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Saludos&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9134030404464162547-6835525060077387343?l=javacuriosities.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacuriosities.blogspot.com/feeds/6835525060077387343/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://javacuriosities.blogspot.com/2010/03/java-best-practices.html#comment-form' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/6835525060077387343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/6835525060077387343'/><link rel='alternate' type='text/html' href='http://javacuriosities.blogspot.com/2010/03/java-best-practices.html' title='Java Best Practices'/><author><name>Luis De Bello</name><uri>http://www.blogger.com/profile/04336187134558663051</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9134030404464162547.post-1137587505219010701</id><published>2009-08-04T15:26:00.167-03:00</published><updated>2009-10-19T23:43:21.839-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javafx UI'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>JavaFX Sintaxis Declarativa</title><content type='html'>En el post anterior hemos visto un ejemplo sobre cómo realizar un Hello World con JavaFX pero sin entrar en mucho detalle sobre algunas líneas del código, ahora seguiremos con algunos ejemplos más y explicando un poco sobre esto de Sintaxis Declarativa, por ejemplo un objeto puede ser creado con un Objeto Literal. Lo que significa una sintaxis declarativa concisa parecida a javascript, en lugar de explicar "como" realizar algo (el algoritmo, en los lenguajes imperativos), deberemos describir "que" es ese algo. Por ejemplo, en HTML, se declara el contenido de la página, pero no se explica cómo este será mostrado en la pantalla. Ahora veremos algunos ejemplos para aclarar esto.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Iremos desarrollando un ejemplos casi línea por línea para ir notando la simpleza del lenguaje e ir viendo algunos efectos, para este ejemplo usaremos una imagen que la pueden encontrar en el siguiente &lt;a href="http://www.softdesigner.com.ar/blogger/examples/JavaFX.png"&gt;link&lt;/a&gt; ,comencemos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Paso 1:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;&lt;br /&gt;Stage {&lt;br /&gt;    width: 400&lt;br /&gt;    height: 400 &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;con las pocas líneas de arriba ya hemos definido una instancia de un objeto Stage, el cual es necesario para renderizar una ventana.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Paso 2:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;import javafx.scene.Scene;&lt;br /&gt;import javafx.scene.image.ImageView;&lt;br /&gt;import javafx.scene.image.Image;&lt;br /&gt;&lt;br /&gt;var image = Image {&lt;br /&gt;    url: "{__DIR__}JavaFX.png"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Stage {&lt;br /&gt;    width: 400&lt;br /&gt;    height: 400 &lt;br /&gt;    scene: Scene {&lt;br /&gt;        content: [&lt;br /&gt;            ImageView {&lt;br /&gt;                x: 75&lt;br /&gt;                y: 60&lt;br /&gt;                image: image&lt;br /&gt;            }&lt;br /&gt;        ]&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;aquí hemos complicado un poco la cosa, pero veremos cada detalles, los primeros import de Scene, Image e ImageView son necesarios por los siguiente motivos.&lt;br /&gt;Scene es el objeto el cual nos permite renderizar elementos gráficos dentro de el, el ImageView es el contenedor para una determinada imagen, y por último el Image es la imagen en sí. Si notamos la definición de Scene, vemos que a su propiedad content(Aquí dibujamos los elementos gráficos), hemos agregado una instancia de ImageView y a esta le hemos asignado la imagen previamente cargada en la variable image. Como podrán notar toda la sintaxis es muy simple y siempre nos preocupamos en la declaración de lo que deseamos y no en como generar todo esto.&lt;br /&gt;El código hasta ahora nos generaría una ventana, con la imagen posicionada en el centro, pero nuestra Scene por defecto tiene un color blanco de fondo, si vemos en posts anteriores veremos que podíamos asignar colores en forma de gradientes, pues bueno eso haremos como siguiente paso.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Paso 3:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;import javafx.scene.Scene;&lt;br /&gt;import javafx.scene.image.ImageView;&lt;br /&gt;import javafx.scene.image.Image;&lt;br /&gt;import javafx.scene.paint.LinearGradient;&lt;br /&gt;import javafx.scene.paint.Stop;&lt;br /&gt;import javafx.scene.paint.Color;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author softdesigner&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;var image = Image {&lt;br /&gt;    url: "{__DIR__}JavaFX.png"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Stage {&lt;br /&gt;    width: 400&lt;br /&gt;    height: 400 &lt;br /&gt;    scene: Scene {&lt;br /&gt;        content: [&lt;br /&gt;            ImageView {&lt;br /&gt;                x: 75&lt;br /&gt;                y: 60&lt;br /&gt;                image: image&lt;br /&gt;            }&lt;br /&gt;        ]&lt;br /&gt;        fill: LinearGradient {&lt;br /&gt;            startX : 0.0&lt;br /&gt;            startY : 0.0&lt;br /&gt;            endX : 0.0&lt;br /&gt;            endY : 1.0&lt;br /&gt;            stops: [&lt;br /&gt;                Stop {&lt;br /&gt;                    color : Color.WHITE&lt;br /&gt;                    offset: 0.0&lt;br /&gt;                },&lt;br /&gt;                Stop {&lt;br /&gt;                    color : Color.BLACK&lt;br /&gt;                    offset: 1.0&lt;br /&gt;                }&lt;br /&gt;            ]&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Si vemos la propiedad fill del objeto Scene, nos damos cuenta que estamos asignando un LinearGradient a esta propiedad, como podemos deducir esto generara un Gradiente linear por medios de las propiedades &lt;span style="font-weight:bold;"&gt;startX, startY, endX, endY&lt;/span&gt; definimos la dirección lineal y por medio de los &lt;span style="font-weight:bold;"&gt;stops&lt;/span&gt; definimos que distintos Stop usar, cada Stop define necesita su propiedad color y su propiedad offset la cual indicada cuando se detendrá ese gradiente.&lt;br /&gt;&lt;br /&gt;Muchas veces cuando estamos retocando imágenes o logrando algún efecto se nos plantea la necesidad de lograr un efecto de reflejo sobre el agua o algún material, JavaFX viene con muchas de estas dificultades resueltas ya que brinda diversos efectos para ser aplicados a nuestras imágenes, para ver esto usaremos un efecto de Reflection para lograr reflejar nuestra imagen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Paso 4:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;import javafx.scene.Scene;&lt;br /&gt;import javafx.scene.image.ImageView;&lt;br /&gt;import javafx.scene.image.Image;&lt;br /&gt;import javafx.scene.paint.LinearGradient;&lt;br /&gt;import javafx.scene.paint.Stop;&lt;br /&gt;import javafx.scene.paint.Color;&lt;br /&gt;import javafx.scene.effect.Reflection;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author softdesigner&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;var image = Image {&lt;br /&gt;    url: "{__DIR__}JavaFX.png"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Stage {&lt;br /&gt;    width: 400&lt;br /&gt;    height: 600&lt;br /&gt;    scene: Scene {&lt;br /&gt;        content: [&lt;br /&gt;            ImageView {&lt;br /&gt;                x: 75&lt;br /&gt;                y: 60&lt;br /&gt;                image: image&lt;br /&gt;                effect: Reflection {&lt;br /&gt;                        fraction: 0.75&lt;br /&gt;                        topOffset: 0.0&lt;br /&gt;                        topOpacity: 0.5&lt;br /&gt;                        bottomOpacity: 0.0&lt;br /&gt;                    }&lt;br /&gt;            }&lt;br /&gt;        ]&lt;br /&gt;        fill: LinearGradient {&lt;br /&gt;            startX : 0.0&lt;br /&gt;            startY : 0.0&lt;br /&gt;            endX : 0.0&lt;br /&gt;            endY : 1.0&lt;br /&gt;            stops: [&lt;br /&gt;                Stop {&lt;br /&gt;                    color : Color.WHITE&lt;br /&gt;                    offset: 0.0&lt;br /&gt;                },&lt;br /&gt;                Stop {&lt;br /&gt;                    color : Color.BLACK&lt;br /&gt;                    offset: 1.0&lt;br /&gt;                }&lt;br /&gt;            ]&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Ahora tenemos nuestra imagen con un efecto de Reflection, este es asignado al ImageView ya que es el contenedor de la imagen y ahora explicaremos cada propiedad de este efecto.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;fraction:&lt;/span&gt; Es la fracción que se muestra reflejada en base a la imagen original(Valor porcentual).&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;topOffset:&lt;/span&gt; Es la distancia entre la imagen y el comienzo de su reflejo(Valor libre).&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;topOpacity:&lt;/span&gt; Es la opacidad del comienzo del reflejo(Valor porcentual).&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;bottomOpacity:&lt;/span&gt; Es la opacidad del final del reflejo(Valor porcentual).&lt;br /&gt;&lt;br /&gt;Para ir terminando el ejemplo como último detalle, queremos mostrar dos efectos al mismo tiempo, los cuales serán una DropShadow y un efecto Reflection.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Paso 5:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;import javafx.scene.Scene;&lt;br /&gt;import javafx.scene.image.ImageView;&lt;br /&gt;import javafx.scene.image.Image;&lt;br /&gt;import javafx.scene.paint.LinearGradient;&lt;br /&gt;import javafx.scene.paint.Stop;&lt;br /&gt;import javafx.scene.paint.Color;&lt;br /&gt;import javafx.scene.effect.Reflection;&lt;br /&gt;import javafx.scene.effect.DropShadow;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author softdesigner&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;var image = Image {&lt;br /&gt;    url: "{__DIR__}JavaFX.png"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Stage {&lt;br /&gt;    width: 400&lt;br /&gt;    height: 600&lt;br /&gt;    scene: Scene {&lt;br /&gt;        content: [&lt;br /&gt;            ImageView {&lt;br /&gt;                x: 75&lt;br /&gt;                y: 60&lt;br /&gt;                image: image&lt;br /&gt;                effect: Reflection {&lt;br /&gt;                        fraction: 0.75&lt;br /&gt;                        topOffset: 0.0&lt;br /&gt;                        topOpacity: 0.5&lt;br /&gt;                        bottomOpacity: 0.0&lt;br /&gt;                        input: DropShadow {&lt;br /&gt;                                offsetX: 10&lt;br /&gt;                                offsetY: 10&lt;br /&gt;                                color: Color.BLACK&lt;br /&gt;                                radius: 10&lt;br /&gt;                            }&lt;br /&gt;                    }&lt;br /&gt;            }&lt;br /&gt;        ]&lt;br /&gt;        fill: LinearGradient {&lt;br /&gt;            startX : 0.0&lt;br /&gt;            startY : 0.0&lt;br /&gt;            endX : 0.0&lt;br /&gt;            endY : 1.0&lt;br /&gt;            stops: [&lt;br /&gt;                Stop {&lt;br /&gt;                    color : Color.WHITE&lt;br /&gt;                    offset: 0.0&lt;br /&gt;                },&lt;br /&gt;                Stop {&lt;br /&gt;                    color : Color.BLACK&lt;br /&gt;                    offset: 1.0&lt;br /&gt;                }&lt;br /&gt;            ]&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Si leemos acerca de la propiedad effect del ImageView descubriremos que solo acepta un objeto effect, y aquí nos entra la duda de cómo haremos mas agregar dos efectos al mismo tiempo, para esto casi todos los efectos tiene una propiedad &lt;span style="font-weight:bold;"&gt;input&lt;/span&gt; la cual recibe un effect, así que si nosotros quisiéramos ir encadenando efectos deberíamos hacerlo por medio de esta propiedad, en la parte superior del código se nota que el efecto Reflection recibe un input de un DropShadow, las propiedades del DrowShadow son las siguientes:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;offsetX:&lt;/span&gt; Cantidad de pixeles sobre el eje x.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;offsetY:&lt;/span&gt; Cantidad de pixeles sobre el eje y.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;color:&lt;/span&gt; Color de relleno de la sombra.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;radius:&lt;/span&gt; Radio del difuminado para la sombra.&lt;br /&gt;&lt;br /&gt;Con esto daremos por finalizada esta mínima explicación y demostración sobre la Sintaxis declarativa que ofrece JavaFX y la simplicidad y poder de este lenguaje.&lt;br /&gt;Les dejo un link al ejemplo del proyecto netbeans, luego intentare dejar el jnlp para que lo puedan descargar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Proyecto&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.softdesigner.com.ar/blogger/DeclarativeSyntax.rar"&gt;DeclarativeSyntax.rar&lt;/a&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br /&gt;Saludos&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9134030404464162547-1137587505219010701?l=javacuriosities.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacuriosities.blogspot.com/feeds/1137587505219010701/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://javacuriosities.blogspot.com/2009/08/javafx-sintaxis-declarativa.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/1137587505219010701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/1137587505219010701'/><link rel='alternate' type='text/html' href='http://javacuriosities.blogspot.com/2009/08/javafx-sintaxis-declarativa.html' title='JavaFX Sintaxis Declarativa'/><author><name>Luis De Bello</name><uri>http://www.blogger.com/profile/04336187134558663051</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9134030404464162547.post-2510770207133083151</id><published>2009-08-02T20:19:00.034-03:00</published><updated>2009-08-04T15:25:32.752-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javafx UI'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>JavaFX GUI</title><content type='html'>El Api de JavaFX brinda a los desarrolladores la posibilidad de crear interfaces UI que seran independientes del dispositivo, podemos definir una division entre lo que seria un Common profile y un Desktop profile. El Common profile puede ser usado en aplicaciones de escritorio asi como en aplicaciones para mobiles. En cambio el Desktop profile es espefico de aplicaciones de escritorio.El SDK de JavaFX posee un JavaFX Mobile Emulator en el cual podemos ver como quedan nuestras aplicaciones sobre telefonos mobiles, en algun post veremos como usar esto. Daremos una breve explicacion sobre la separacion de categorias y que paquetes entran en juego, y dejaremos un link a los archivos de ejemplo de Sun.Este post sera una presentacion sobre el mundo JavaFX y dejaremos un videotutorial sobre como crear el indispensable HelloWorld para no fracasar en un nuevo lenguaje.&lt;br /&gt;&lt;br /&gt;Contenidos&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Common Profile:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;User Interface Elements&lt;/li&gt;&lt;li&gt;Charts&lt;/li&gt;&lt;li&gt;Colors&lt;/li&gt;&lt;li&gt;Shapes&lt;/li&gt;&lt;li&gt;Fill Styles&lt;/li&gt;&lt;li&gt;Line Cap and Join Style&lt;/li&gt;&lt;li&gt;Text&lt;/li&gt;&lt;li&gt;Transformations&lt;/li&gt;&lt;li&gt;Layout&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Desktop Profile:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Effects&lt;/li&gt;&lt;li&gt;Cursors&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="fullpost"&gt;&lt;span style="font-weight: bold;"&gt;Common Profile:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;User Interface Elements&lt;/span&gt;&lt;br /&gt;Aqui encontraremos todos los componentes para poder crear interfaces de usuario,todos estos componentes se hayan en el paquete &lt;span style="font-weight: bold;"&gt;javafx.scene.control&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Archivo de ejemplo:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javafx/1/tutorials/ui/overview/UIControls.fx"&gt;UIControls.fx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Charts&lt;/span&gt;&lt;br /&gt;JavaFX ya provee muchos tipos de graficas prefabricadas, estas las podemos encontrar en el paquete &lt;span style="font-weight: bold;"&gt;javafx.scene.chart&lt;/span&gt; veremos una lista de las graficas disponibles:&lt;br /&gt;&lt;a href="http://java.sun.com/javafx/1/tutorials/ui/overview/areaChart.fx"&gt;Graficas de Area&lt;/a&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javafx/1/tutorials/ui/overview/barChart.fx"&gt;Graficas de Barras&lt;/a&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javafx/1/tutorials/ui/overview/bubbleChart.fx"&gt;Graficas de Burbujas&lt;/a&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javafx/1/tutorials/ui/overview/lineChart.fx"&gt;Graficas de Lineas&lt;/a&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javafx/1/tutorials/ui/overview/pieChart.fx"&gt;Graficas de Pastel&lt;/a&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javafx/1/tutorials/ui/overview/scatterChart.fx"&gt;Graficas de Dispersion&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Colors&lt;/span&gt;&lt;br /&gt;JavaFX nos provee una clase que se haya en el paquete &lt;span style="font-weight: bold;"&gt;javafx.scene.paint.Color&lt;/span&gt; la cual posee constantes de los colores predefinidos y a su vez metodos especificos para trabajar con ellos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Archivo de ejemplo:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javafx/1/tutorials/ui/overview/colors.fx"&gt;Colores&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Shapes&lt;/span&gt;&lt;br /&gt;Los Shapes son las formas basicas que podemos realizar obviamente que mezclandolas entre si podremos obtener otras figuras mas complejas. Esta se encuentra en el paquete &lt;span style="font-weight: bold;"&gt;javafx.scene.shape&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Archivo de ejemplo:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javafx/1/tutorials/ui/overview/shapes.fx"&gt;Shapes&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fill Styles&lt;/span&gt;&lt;br /&gt;Los Fill son los tipos de relleno que podemos aplicar cuando pintamos ciertos elementos, a estos le podemos agregar patrones para lograr efecto de pintado ya sea degrade ya sea del tipo radial o lineal, y tambien colores solidos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Archivo de ejemplo:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javafx/1/tutorials/ui/overview/fill.fx"&gt;Fill Styles&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Line Cap and Join Styles&lt;/span&gt;&lt;br /&gt;Cuando construimos figuras geometricas muchas veces juntamos lineas y distinos estilos, esto es posible en base a las clases del paquete &lt;span style="font-weight: bold;"&gt;javafx.scene.shape&lt;/span&gt; el cual provee las herramientas necesarias para esto.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Archivo de ejemplo:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javafx/1/tutorials/ui/overview/line.fx"&gt;Line Cap and Join Styles&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Text&lt;/span&gt;&lt;br /&gt;Cuando escribimos texto, podemos asignar distintos formatos, estas caracteristicas estan englobadas en el paquete &lt;span style="font-weight: bold;"&gt;javafx.scene.text&lt;/span&gt;, podremos rotar las letras, moverlas de posicion, asignar distinas tipografias, etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Archivo de ejemplo:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javafx/1/tutorials/ui/overview/text.fx"&gt;Text&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Transformations&lt;/span&gt;&lt;br /&gt;Podemos aplicar diversas transformaciones por ejemplo rotaciones, translaccion de coordenadas, escalado de imagenes, etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Archivo de ejemplo:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javafx/1/tutorials/ui/overview/transform.fx"&gt;Transformations&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Layout&lt;/span&gt;&lt;br /&gt;Los layout nos marcan la distribuccion de los elementos por la ventana, hay diversos tipos y estan almacenados en el paquete &lt;span style="font-weight: bold;"&gt;javafx.scene.layout&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Archivo de ejemplo:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javafx/1/tutorials/ui/overview/hbox.fx"&gt;HBox&lt;/a&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javafx/1/tutorials/ui/overview/vbox.fx"&gt;VBox&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Desktop Profile:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Effects&lt;/span&gt;&lt;br /&gt;Podemos aplicar distintos efectos que ya vienen incorporados con JavaFX, estos efectos pueden ser aplicados a los elementos JavaFX UI.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Archivo de ejemplo:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javafx/1/tutorials/ui/overview/effects.fx"&gt;Effects&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cursors&lt;/span&gt;&lt;br /&gt;Podemos asignar distintos cursores sobre los elementos de JavaFX.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Archivo de ejemplo:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javafx/1/tutorials/ui/overview/cursor.fx"&gt;Cursors&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Link General&lt;/span&gt;&lt;br /&gt;Les dejo un link con un rar que posee todos los ejemplos de la pagina de Sun, por si el link de algun ejemplo no anda aca estan todos juntos.&lt;br /&gt;&lt;a href="http://www.softdesigner.com.ar/blogger/NetBeansProjects.rar"&gt;Ejemplos&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Después de esta pequeña introducción sobre los elementos gráficos y distintas caracterizas incluidas en JavaFX procederemos a hacer el primer ejemplo de nuestro largo camino de aprendizaje, sin más palabras el Hello World!!!&lt;br /&gt;Espero el video tutorial sea entendible ya que este es el primero que hago y hay demasiados errores, espero pueda serle de utilidad y les sirva.&lt;br /&gt;&lt;br /&gt;Saludos&lt;br /&gt;&lt;br /&gt;&lt;object      width ="536"      height ="348"      classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"      codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,115,0"     id="objid" name="obj_name"&gt;     &lt;param name="movie" value="http://www.vxv.com/e/oRGQphcxqDtX" /&gt;     &lt;param name="allowFullScreen" value="true" /&gt;     &lt;param name="allowScriptAccess" value="sameDomain" /&gt;     &lt;param name="bgcolor" value="#000000" /&gt;     &lt;embed         src="http://www.vxv.com/e/oRGQphcxqDtX"          type="application/x-shockwave-flash"          width="536"          height="348"          bgcolor="#000000"          allowFullScreen="true"          allowScriptAccess="sameDomain"&gt;     &lt;/embed&gt; &lt;/object&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9134030404464162547-2510770207133083151?l=javacuriosities.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacuriosities.blogspot.com/feeds/2510770207133083151/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://javacuriosities.blogspot.com/2009/08/javafx-gui_02.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/2510770207133083151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/2510770207133083151'/><link rel='alternate' type='text/html' href='http://javacuriosities.blogspot.com/2009/08/javafx-gui_02.html' title='JavaFX GUI'/><author><name>Luis De Bello</name><uri>http://www.blogger.com/profile/04336187134558663051</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9134030404464162547.post-2446799183642390363</id><published>2009-07-31T23:09:00.073-03:00</published><updated>2009-08-01T16:31:02.081-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>Binding And Triggers</title><content type='html'>Hoy hablaremos de una de las características más poderosas de JavaFX la cual consiste en el binding entre datos, esto nos brinda la posibilidad de vincular dos variables entre si ya sea por el cambio de valor de una, o por la evaluación de una expresión. Además tenemos la posibilidad de asignar triggers que son bloques de códigos los cuales se ejecutan al cambiar el valor de una variable.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Contenidos&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Binding Overview&lt;/li&gt;&lt;li&gt;Binding and Objects&lt;/li&gt;&lt;li&gt;Binding and Functions&lt;/li&gt;&lt;li&gt;Binding with Sequences&lt;/li&gt;&lt;li&gt;Replace Triggers&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Binding Overview&lt;/span&gt;&lt;br /&gt;Empezaremos diciendo que para poder realizar el binding entre variables debemos usar la keyword bind, también existe una expresión bound que ahora veremos la cual crea una relación más amplia.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Binding and Objects&lt;/span&gt;&lt;br /&gt;Veamos un ejemplo donde creamos un binding entre dos variables.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;var x = 0;&lt;br /&gt;def y = bind x;&lt;br /&gt;x = 1;&lt;br /&gt;println(y); // y ahora vale 1&lt;br /&gt;x = 50;&lt;br /&gt;println(y); // y ahora vale 50&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Aquí se nota como nosotros solo modificamos los valores de la variable x esto automáticamente se ve reflejado en la variable y.&lt;br /&gt;Ahora veremos un binding parecido pero cuando queremos hacer binding entre objetos.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;var myStreet = "1 Main Street";&lt;br /&gt;var myCity = "Santa Clara";&lt;br /&gt;var myState = "CA";&lt;br /&gt;var myZip = "95050";&lt;br /&gt;&lt;br /&gt;class Address{&lt;br /&gt;var street;&lt;br /&gt;var city;&lt;br /&gt;var state;&lt;br /&gt;var zip;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;def address = bind Address {&lt;br /&gt;street: myStreet;&lt;br /&gt;city: myCity;&lt;br /&gt;state: myState;&lt;br /&gt;zip: myZip;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;println("address.street == {address.street}");&lt;br /&gt;myStreet = "100 Maple Street";&lt;br /&gt;println("address.street == {address.street}");&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Aquí definimos la clase Address y luego definimos, 4 variables para iniciar este objeto, al crear nuestro objeto lo hacemos con la palabra bind, esto quiere decir que nuestra variable address siempre tendrá sus atributos actualizado en base a los valores de las variables con cuales fue iniciado.&lt;br /&gt;Si ejecutamos el ejemplo veremos que el resultado es&lt;br /&gt;address.street == 1 Main Street&lt;br /&gt;address.street == 100 Maple Street&lt;br /&gt;Un dato importante que debemos considerar es que con este tipo de binding por cada modificación, se genera un nuevo objeto Address y se asigna nuevamente a la variable.&lt;br /&gt;Otra forma de realizar este binding sin generar un nuevo objeto es de la siguiente manera&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;var myStreet = "1 Main Street";&lt;br /&gt;var myCity = "Santa Clara";&lt;br /&gt;var myState = "CA";&lt;br /&gt;var myZip = "95050";&lt;br /&gt;&lt;br /&gt;class Address{&lt;br /&gt;var street;&lt;br /&gt;var city;&lt;br /&gt;var state;&lt;br /&gt;var zip;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;def address = Address {&lt;br /&gt;street: bind myStreet;&lt;br /&gt;city: bind myCity;&lt;br /&gt;state: bind myState;&lt;br /&gt;zip: bind myZip;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;println("address.street == {address.street}");&lt;br /&gt;myStreet = "100 Maple Street";&lt;br /&gt;println("address.street == {address.street}");&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;La única diferencia es que acá no se hace el bind sobre el objeto sino sobre cada atributo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Binding and Functions&lt;/span&gt;&lt;br /&gt;Aquí es donde entra en juego la keyword bound, no debemos confundir esto con el bind son dos cosas distintas que en combinación nos ofrecen alguna funcionalidad especifica.&lt;br /&gt;Veamos un ejemplo de bind y bound para entender cómo funciona y como usarlo&lt;br /&gt;&lt;pre&gt;&lt;code&gt;// Paso 1&lt;br /&gt;var scale = 1.0;&lt;br /&gt;&lt;br /&gt;// Paso 2&lt;br /&gt;class Point {&lt;br /&gt; var x : Number;&lt;br /&gt; var y : Number;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Paso 3&lt;br /&gt;bound function makePoint(xPos : Number, yPos : Number) : Point {&lt;br /&gt; Point {&lt;br /&gt;      x: xPos * scale&lt;br /&gt;      y: yPos * scale&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Paso 4&lt;br /&gt;var myX = 3.0;&lt;br /&gt;var myY = 3.0;&lt;br /&gt;def pt = bind makePoint(myX, myY);&lt;br /&gt;println(pt.x);&lt;br /&gt;&lt;br /&gt;// Paso 5&lt;br /&gt;myX = 10.0;&lt;br /&gt;println(pt.x);&lt;br /&gt;&lt;br /&gt;// Paso 6&lt;br /&gt;scale = 2.0;&lt;br /&gt;println(pt.x);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Entendamos este ejemplo paso por paso.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 1&lt;/span&gt;:&lt;br /&gt;Aquí definimos una variable del tipo Number y la inicializamos en 1.0&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 2&lt;/span&gt;:&lt;br /&gt;Definimos la clase Point&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 3&lt;/span&gt;:&lt;br /&gt;Creamos una función la cual la marcamos con el atributo bound, aquí debemos saber que hay dos tipos de funciones las bound y las not-bound que se comportan de manera distinta si tan con binding sobre una variable.&lt;br /&gt;Las funciones not-bound solo se ejecutan si sus parámetro cambian, en caso contrario las funciones bound siempre se ejecutan&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 4&lt;/span&gt;:&lt;br /&gt;Creamos las variables las inicializamos y hacemos un bind entre la función y una variable del tipo Point.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 5&lt;/span&gt;:&lt;br /&gt;Cambiamos el valor de myX como esta variable fue usada como parámetro de la función con bind se dispara la función y cambia los valores del Point&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 6&lt;/span&gt;:&lt;br /&gt;Cambiamos el valor de la scale y como esta es una función bound también se vuelve a ejecutar la función y nos cambia los valores de Point&lt;br /&gt;Si ejecutamos el ejemplo el resultado será:&lt;br /&gt;3.0&lt;br /&gt;10.0&lt;br /&gt;20.0&lt;br /&gt;Si sacáramos el bound de la función el resultado sería:&lt;br /&gt;3.0&lt;br /&gt;10.0&lt;br /&gt;10.0&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Binding with Sequences&lt;/span&gt;&lt;br /&gt;Aquí usaremos un bind entre secuencias pero además usando la expresión for. Tranquilamente podríamos hacer un bind común entre dos secuencias como si fueran variables, pero para ver el poder de esto usaremos una expresión for de la siguiente manera&lt;br /&gt;&lt;pre&gt;&lt;code&gt;// Definimos la secuencia 1&lt;br /&gt;var seq1 = [1..10];&lt;br /&gt;&lt;br /&gt;// Definimos la secuencia 2, pero con la diferencia que cada ítem será multiplicado por dos&lt;br /&gt;def seq2 = bind for (ítem in seq1) ítem*2;&lt;br /&gt;printSeqs();&lt;br /&gt;&lt;br /&gt;function printSeqs() {&lt;br /&gt; println("First Sequence:");&lt;br /&gt; for (i in seq1){println(i);}&lt;br /&gt; println("Second Sequence:");&lt;br /&gt; for (i in seq2){println(i);}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Si ejecutamos el ejemplo el resultado será el siguiente:&lt;br /&gt;First Sequence:&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;Second Sequence:&lt;br /&gt;2&lt;br /&gt;4&lt;br /&gt;6&lt;br /&gt;8&lt;br /&gt;10&lt;br /&gt;12&lt;br /&gt;14&lt;br /&gt;16&lt;br /&gt;18&lt;br /&gt;20&lt;br /&gt;&lt;br /&gt;Se nota claramente como la secuencia 2 está relacionada con la secuencia 1,pero además aplica una multiplicación sobre cada ítem, para confirmar el bind vamos a insertar un elemento en la secuencia 1 y este debería estar presente en la secuencia 2&lt;br /&gt;&lt;pre&gt;&lt;code&gt;// Definimos la secuencia 1&lt;br /&gt;var seq1 = [1..10];&lt;br /&gt;&lt;br /&gt;// Definimos la secuencia 2, pero con la diferencia que cada ítem será multiplicado por dos&lt;br /&gt;def seq2 = bind for (ítem in seq1) ítem*2;&lt;br /&gt;insert 11 into seq1;&lt;br /&gt;printSeqs();&lt;br /&gt;&lt;br /&gt;function printSeqs() {&lt;br /&gt; println("First Sequence:");&lt;br /&gt; for (i in seq1){println(i);}&lt;br /&gt; println("Second Sequence:");&lt;br /&gt; for (i in seq2){println(i);}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Si volvemos a correr el ejemplo veremos que ahora la secuencia 1 tiene el ítem 1 y la secuencia 2 tiene el ítem 22.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Replace Triggers&lt;/span&gt;&lt;br /&gt;Se le llama Replace Triggers a bloques de códigos que podemos asignar a las variables para que se ejecuten cuando sus valores cambien. Aquí debemos usar la sentencia on replace para poder definir el bloque de código que queremos ejecutar&lt;br /&gt;&lt;pre&gt;&lt;code&gt;var password = "foo" on replace oldValue {&lt;br /&gt; println("\nALERT! Password has changed!");&lt;br /&gt; println("Old Value: {oldValue}");&lt;br /&gt; println("New Value: {password}");&lt;br /&gt;};&lt;br /&gt;password = "bar";&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Primero creas la variables password donde la inicializamos con el valor "foo"(Supuestamente -Ahora explicare porque pongo esto-) y usamos la sentencia on replace seguido de un nombre a elección del valor anterior y luego definimos el código a ejecutar. al correr el ejemplo veremos lo siguiente&lt;br /&gt;&lt;br /&gt;ALERT! Password has changed!&lt;br /&gt;Old Value:&lt;br /&gt;New Value: foo&lt;br /&gt;&lt;br /&gt;ALERT! Password has changed!&lt;br /&gt;Old Value: foo&lt;br /&gt;New Value: bar&lt;br /&gt;&lt;br /&gt;Vemos que se ejecuta dos veces ya que la variable en un comienzo esta inicializa en Null por eso nuestra inicialización en "foo" es supuesta.&lt;br /&gt;&lt;br /&gt;Bueno con esto daremos por finalizada la introducción a las características de JavaFX en lo que sería la parte de scripting, ahora nos dedicaremos a la parte más visual donde empezaremos a usar todos estos conocimientos.&lt;br /&gt;&lt;br /&gt;Saludos&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9134030404464162547-2446799183642390363?l=javacuriosities.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacuriosities.blogspot.com/feeds/2446799183642390363/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://javacuriosities.blogspot.com/2009/07/binding-and-triggers.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/2446799183642390363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/2446799183642390363'/><link rel='alternate' type='text/html' href='http://javacuriosities.blogspot.com/2009/07/binding-and-triggers.html' title='Binding And Triggers'/><author><name>Luis De Bello</name><uri>http://www.blogger.com/profile/04336187134558663051</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9134030404464162547.post-78639931344960000</id><published>2009-07-27T23:41:00.163-03:00</published><updated>2009-08-01T14:19:32.458-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>Secuencias JavaFX</title><content type='html'>En esta ocasión hablaremos de las secuencias, estas son una adicción a los tipos básicos de JavaFX, el lenguaje nos provee de una estructura llamada secuencias la cual representa una lista ordenada de objetos (Aunque no sean solamente objetos), cada objeto dentro de la secuencia es llamado ítem. Para declarar una secuencia debemos usar [] y dentro introducir cada ítem separado por comas.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Contenido&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Creating Sequences&lt;/li&gt;&lt;li&gt;Using Predicates&lt;/li&gt;&lt;li&gt;Accessing Sequence Items&lt;/li&gt;&lt;li&gt;Inserting Items into a Sequence&lt;/li&gt;&lt;li&gt;Deleting Items from a Sequence&lt;/li&gt;&lt;li&gt;Reversing the Items in a Sequence&lt;/li&gt;&lt;li&gt;Comparing Sequences&lt;/li&gt;&lt;li&gt;Using Sequences Slices&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Creating Sequences&lt;/span&gt;&lt;br /&gt;Tenemos varias formas de declarar una secuencia por ejemplo podríamos encerrar los ítem entre [] separados por coma.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;def weekDays1 = ["Lunes","Martes"];    // Aquí no definimos el tipo de Dato&lt;br /&gt;def weekDays2: String[] = ["Miercoles","Jueves","Viernes"];   // Aquí informamos el tipo de los Items&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Una cualidad importante de las secuencias es que pueden ser construidas en base a otras secuencias, para el ejemplo anterior podríamos hacer realizado la siguiente combinación&lt;br /&gt;&lt;pre&gt;&lt;code&gt;// Aquí obtendríamos una secuencia con todos los días&lt;br /&gt;def days = [weekDays1, weekDays2, ["Sabado", "Domingo"]];&lt;br /&gt;println(days) // Print [ Lunes, Martes, Miercoles, Jueves, Viernes, Sabado, Domingo ]&lt;br /&gt;tipo de los Items&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Aquí en realidad el compilador aplana las secuencias anteriores para generar la nueva secuencia. JavaFX script también nos provee una forma más simple de trabajar con secuencias aritméticas.&lt;br /&gt;Ejemplo&lt;br /&gt;&lt;pre&gt;&lt;code&gt;def nums = [1..100];&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Esto crearía una secuencia la cual poseería los números del 1 al 100&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Using Predicates&lt;/span&gt;&lt;br /&gt;Nos referimos a predicados cuando usamos una expresión booleana para generar una nueva secuencia que sea formada por un sub conjunto de la secuencia original.&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;def nums = [1,2,3,4,5];&lt;br /&gt;def numsGreater = nums[n | n &gt; 2];&lt;br /&gt;println(numsGreater); // Esto imprimiría [3, 4, 5]&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Aquí estamos creando una nueva secuencia en base a una existente y un predicado, analicemos mejor este ejemplo, para esto desglosáremos la siguiente sentencia&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;nums[n | n &gt; 2]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;nums   // Selecciono la secuencia previa&lt;br /&gt;[   // Abro [ para marcar mi predicado&lt;br /&gt;n   // Defino la variable n&lt;br /&gt;|   // Se encarga de separar la variable del predicado&lt;br /&gt;n   // Indico un criterio de filtrado, que sería propiamente el predicado&lt;br /&gt;]   // Cierro el predicado&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Accessing Sequence Items&lt;/span&gt;&lt;br /&gt;Muchas veces nos vemos en la necesidad de acceder a los ítem que están almacenados en nuestras secuencias y para esto podemos usar los indexes de la secuencia.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;def days = ["Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo"];&lt;br /&gt;println(days[0]);&lt;br /&gt;println(days[1]);&lt;br /&gt;println(days[2]);&lt;br /&gt;println(days[3]);&lt;br /&gt;println(days[4]);&lt;br /&gt;println(days[5]);&lt;br /&gt;println(days[6]);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;En este caso no habría problemas porque nosotros conocemos la cantidad de ítems, que hay en nuestra secuencia si nosotros quisiéramos conocer la cantidad de ítems que hay deberíamos usar la palabra reservada sizeof&lt;br /&gt;&lt;pre&gt;&lt;code&gt;def days = ["Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo"];&lt;br /&gt;println(sizeof days);  // Esto imprimiría el numero 7&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Inserting Items into a Sequence&lt;/span&gt;&lt;br /&gt;Otra palabra reservada del lenguaje es la palabra insert, esta es usada para lograr insertar elemento en una secuencia. Aquí debemos tener en cuenta un dato que no es menor y es que las secuencias realmente son inmutables(Inmutables quiere decir que después de estar creadas nunca se modifican), entonces nosotros en realidad al insertar un ítem en una secuencia en verdad por debajo se crea una nueva secuencia y se reasigna automáticamente, dando la impresión que modificamos la secuencia existente.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;// Inicializamos la secuencia con un solo ítem&lt;br /&gt;var days = ["Lunes"];&lt;br /&gt;// Insertamos dos ítem al final de la secuencia&lt;br /&gt;insert "Martes" into days;&lt;br /&gt;insert "Jueves" into days;&lt;br /&gt;// Insertamos un ítem antes que el ítem de la posición 2&lt;br /&gt;insert "Miercoles" before days[2];&lt;br /&gt;// Insertamos un ítem después que el ítem de la posición 3&lt;br /&gt;insert "Viernes" after days[3];&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Si usamos posiciones invalidas no sucede nada y los ítem son insertado al final o al comienzo dependiendo el caso, por ejemplo si insertáramos un ítem after days[24] veríamos que realmente se inserta al final de la secuencia o un ítem before days[-1]&lt;br /&gt;este se inserta al comienzo.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Deleting Items from a Sequence&lt;/span&gt;&lt;br /&gt;Como ya hemos insertado ítem también debe existir la posibilidad de borrarlos y esto se puede realizar por medio del keyword delete usando en distintas formas&lt;br /&gt;&lt;pre&gt;&lt;code&gt;def days = ["Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo"];&lt;br /&gt;// Borramos el ítem "Lunes"&lt;br /&gt;delete "Lunes" from days;&lt;br /&gt;// Borramos el ítem de la posición 0&lt;br /&gt;delete days[0];&lt;br /&gt;// Borramos todos los ítem, pero la secuencia sigue siendo útil&lt;br /&gt;delete days;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Esto es muy similar a lo anterior, cabe destacar que si elemento marcado o la posición seleccionada para borrar no existen, no se realiza ninguna acción de borrado.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Reversing the Items in a Sequence&lt;/span&gt;&lt;br /&gt;Esta técnica nos permite invertir una secuencia en su totalidad usando tan solo la keyword reverse. Veamos un ejemplo para aclarar esto&lt;br /&gt;&lt;pre&gt;&lt;code&gt;// Iniciamos la secuencia con los números del 1 al 5&lt;br /&gt;var nums = [1..5];&lt;br /&gt;// Damos vuelta la secuencia&lt;br /&gt;reverse nums;&lt;br /&gt;// Esto imprime [ 1, 2, 3, 4, 5 ]&lt;br /&gt;println(nums);&lt;br /&gt;// Invertimos la secuencia pero ahora si asignamos su resultado&lt;br /&gt;nums = reverse nums;&lt;br /&gt;// Esto imprime [ 5, 4, 3, 2, 1 ]&lt;br /&gt;println(nums);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;El ejemplo de arriba nos muestra como las secuencia no se auto asignan su reverse y en este caso debe ser explicito por el programador, no funciona como los delete o insert donde se hace automáticamente.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Comparing Sequences&lt;/span&gt;&lt;br /&gt;Para comparar las secuencias se tienen en cuenta dos puntos, el primero su longitud y el segundo la correspondencia entre sus ítem. Al cumplirse estos dos hitos podemos asegurar que las secuencias son iguales.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;// Creamos dos secuencias iguales&lt;br /&gt;def seq1 = [1,2,3,4,5];&lt;br /&gt;def seq2 = [1,2,3,4,5];&lt;br /&gt;// Comparamos y esta comparación retorna true&lt;br /&gt;println (seq1 == seq2);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Ahora insertaremos un ítem a la seq2 para lograr que sea diferente que la otra y poder volver a ejecutar la comparación.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;// Creamos dos secuencias iguales&lt;br /&gt;var seq1 = [1,2,3,4,5];&lt;br /&gt;var seq2 = [1,2,3,4,5];&lt;br /&gt;// Insertamos un elemento en la seq&lt;br /&gt;insert 6 into seq2;&lt;br /&gt;// Imprimimos la seq2 para comprobar que cambio&lt;br /&gt;println(seq2);&lt;br /&gt;// Comparamos y esta comparación retorna false&lt;br /&gt;println (seq1 == seq2);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Hasta aquí vimos el caso de igualdad y el caso donde la longitud es mayor, ahora nos queda pendiente ver cuando sus ítems tienen otra posición y esto también genera una desigualdad entre secuencias.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;// Creamos dos secuencias iguales&lt;br /&gt;var seq1 = [1,2,3,4,5];&lt;br /&gt;var seq2 = [1,2,3,4,5];&lt;br /&gt;// Insertamos un elemento en la seq&lt;br /&gt;seq2 = reverse seq2;&lt;br /&gt;// Imprimimos la seq2 para comprobar que cambio su orden&lt;br /&gt;println(seq2);&lt;br /&gt;// Comparamos y esta comparación retorna false&lt;br /&gt;println (seq1 == seq2);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Aquí cubrimos los 3 casos de comparación entre secuencias, ahora vallamos al último punto&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Using Sequences Slices&lt;/span&gt;&lt;br /&gt;Antes proceder a explicar las distintas formas de conseguir un slice, deberíamos entender que es un slice, un slice básicamente consiste en una porción de alguna secuencia en base a un criterio o selección, se podría definir un slice como un subconjunto de la secuencia, un slice es una secuencia.&lt;br /&gt;Podemos definir slice de las siguientes maneras&lt;br /&gt;seq[a..b]&lt;br /&gt;seq[a..&amp;lt;b]&lt;br /&gt;seq[a..]&lt;br /&gt;seq[a..&amp;lt;]&lt;br /&gt;&lt;br /&gt;En las definiciones de arriba seq seria la secuencia que queremos obtener un slice y a y b los indexes de comienzo y fin, expliquemos cada uno  &lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;seq[a..b]&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;def days = ["Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo"];&lt;br /&gt;// La nueva secuencia tendría los ítem "Sabado" y "Domingo"&lt;br /&gt;def weekend = days[5..6];&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Esta forma de crear un slice incluye ambos indexes&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;seq[a..&amp;lt;b]&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;def days = ["Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo"];&lt;br /&gt;// La nueva secuencia tendría todos los ítem menos "Sabado" y "Domingo"&lt;br /&gt;def weekdays = days[0..&amp;lt;5];&lt;/code&gt;&lt;/pre&gt;En este caso solo la primer posición es incluida y el otro no.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;seq[a..]&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;def days = ["Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo"];&lt;br /&gt;// La nueva secuencia tendría los ítem "Sabado" y "Domingo"&lt;br /&gt;def weekend = days[5..];&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Aquí estamos definiendo un slice que comience en la posición 5 y que incluya dicha posición hasta el final de la secuencia inclusive.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;seq[a..&lt;]&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;def days = ["Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo"];&lt;br /&gt;// La nueva secuencia tendría todos los ítem menos el "Domingo"&lt;br /&gt;def days2 = days[0..&amp;lt;]; &lt;/code&gt;&lt;/pre&gt;Este tipo de slice es similar al anterior ya que comienza en la primera posición inclusive y va hasta el final de la secuencia pero sin incluir el último elemento&lt;br /&gt;&lt;br /&gt;Hasta aquí hemos analizados las distintas acciones y tipos referido a las secuencias ya en el próximo post estaremos analizando el binding y los trigger en JavaFX, me voy despidiendo y espero el post les sea de utilidad&lt;br /&gt;&lt;br /&gt;Saludos&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9134030404464162547-78639931344960000?l=javacuriosities.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacuriosities.blogspot.com/feeds/78639931344960000/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://javacuriosities.blogspot.com/2009/07/secuencias-javafx.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/78639931344960000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/78639931344960000'/><link rel='alternate' type='text/html' href='http://javacuriosities.blogspot.com/2009/07/secuencias-javafx.html' title='Secuencias JavaFX'/><author><name>Luis De Bello</name><uri>http://www.blogger.com/profile/04336187134558663051</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9134030404464162547.post-5520789794561405300</id><published>2009-07-25T13:39:00.062-03:00</published><updated>2009-07-27T23:56:05.418-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>Operadores</title><content type='html'>Los operadores son símbolos especiales que nos brindan los lenguajes para interactuar con uno o dos operando y devolver un resultado, en base al tipo de operador que usemos, veremos si funciona con un solo operando o son ambos requeridos.&lt;br /&gt;Como venimos haciendo hasta ahora presentaremos una lista con los distintos tipos de operadores y luego entraremos en los detalles de cada uno.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Operadores:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Assignment Operators&lt;/li&gt;&lt;li&gt;Arithmetic Operators&lt;/li&gt;&lt;li&gt;Unary Operators&lt;/li&gt;&lt;li&gt;Equality and Relational Operators&lt;/li&gt;&lt;li&gt;Conditional Operators&lt;/li&gt;&lt;li&gt;Type Comparison Operator&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;span style="font-weight: bold;"&gt;Assignment Operators&lt;/span&gt;&lt;br /&gt;Este es uno de los operadores más comunes que podremos encontrar, básicamente se usa para asignación entre las variables y lo datos que queremos almacenar en ella. Este operador está representado con el símbolo "=".&lt;br /&gt;&lt;pre&gt;&lt;code&gt;var example1 = 2;&lt;br /&gt;var example2 = "Test";&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;En este caso vemos dos asignaciones en el ejemplo 1 guardamos el valor 2 en la variable example1, y en el segundo caso guardamos la cadena de caracteres example2 (En realidad hablamos que guardamos las referencias ya que son objetos, pero no me parece importante para este tema igual quería dejarlo aclarado).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Arithmetic Operators&lt;/span&gt;&lt;br /&gt;Los operadores aritméticos son utilizados para los cálculos entre las variables.&lt;br /&gt;+ (additive operator)&lt;br /&gt;- (subtraction operator)&lt;br /&gt;* (multiplication operator)&lt;br /&gt;/ (division operator)&lt;br /&gt;mod (remainder operator)&lt;br /&gt;Estos operadores cubren las 4 operaciones básicas y la operación del resto por medio del modificador mod&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ejemplo&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;var example = 1 + 2;&lt;br /&gt;println(example);      // example vale 3&lt;br /&gt;&lt;br /&gt;example = example - 1;&lt;br /&gt;println(example);      // example vale 2&lt;br /&gt;&lt;br /&gt;example = example * 2;&lt;br /&gt;println(example);      // example vale 4&lt;br /&gt;&lt;br /&gt;example = example / 2;&lt;br /&gt;println(example);      // example vale 2&lt;br /&gt;&lt;br /&gt;example = example + 8;&lt;br /&gt;println(example);      // example vale 10&lt;br /&gt;&lt;br /&gt;example = example mod 7;&lt;br /&gt;println(example);      // example vale 3&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Unary Operators&lt;/span&gt;&lt;br /&gt;Los operadores unarios son aquellos que se puede usar teniendo un solo operando.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;example = 0;&lt;br /&gt;example += 1;&lt;br /&gt;println(example); // result vale 1&lt;br /&gt;&lt;br /&gt;example -= 1;&lt;br /&gt;println(example); // result vale 0&lt;br /&gt;&lt;br /&gt;example = 2;&lt;br /&gt;example *= 5;&lt;br /&gt;println(example); // result vale 10&lt;br /&gt;&lt;br /&gt;example /= 2;&lt;br /&gt;println(example); // result vale 5&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Equality and Relational Operators&lt;/span&gt;&lt;br /&gt;Aquí están los operadores que usamos para las comparaciones y relaciones del tipo, es más grande que, es distinto que, etc.&lt;br /&gt;&lt;br /&gt;== // Igual que&lt;br /&gt;!= // Distinto que&lt;br /&gt;&gt; // Mayor que&lt;br /&gt;&gt;= // Mayor o igual que&lt;br /&gt;&amp;lt // Menor que   &lt;br /&gt;&amp;lt= // Menor o igual que    &lt;br /&gt;&lt;pre&gt;&lt;code&gt;def num1 = 1;&lt;br /&gt;def num2 = 2; &lt;br /&gt;println(num1 == num2); // False&lt;br /&gt;println(num1 != num2); // True&lt;br /&gt;println(num1 &gt; num2);  // False&lt;br /&gt;println(num1 &gt;= num2); // False&lt;br /&gt;println(num1 &amp;lt num2);  // True&lt;br /&gt;println(num1 &amp;lt= num2); // True&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Conditional Operators&lt;/span&gt;&lt;br /&gt;En esta sección contamos con dos operadores para las condiciones estos son el operador AND y el operador OR, estos tiene un comportamiento denominado "short-circuiting" lo cual quiere decir que si en una expresión que utilizamos el operador AND y el primer termino es false ya se deja de evaluar el resto, y si usamos un operador OR si el primero termino es verdadero tampoco se evalúa el resto.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;def username = "foo";&lt;br /&gt;def password = "bar";&lt;br /&gt;&lt;br /&gt;if ((username == "foo") and (password == "bar")) {&lt;br /&gt;println("Test 1: username AND password are correct"); // Test 1: username AND password are correct&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if ((username == "") and (password == "bar")) {&lt;br /&gt;println("Test 2: username AND password is correct"); // No se ejecuta este código&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if ((username == "foo") or (password == "bar")) {&lt;br /&gt;println("Test 3: username OR password is correct"); // Test 3: username OR password is correct&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if ((username == "") or (password == "bar")) {&lt;br /&gt;println("Test 4: username OR password is correct"); // Test 4: username OR password is correct&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Type Comparison Operator&lt;/span&gt;&lt;br /&gt;Este operador es usado para comprobar si un object es instancia de una clase o una subclase en particular. El operador instanceof devuelve true si el objeto es una instancia de la clase especificada. Devuelve false si el objeto no es una instancia de la clase especificada, o si objeto es null.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;def str1="Hello";&lt;br /&gt;println(str1 instanceof String); // True&lt;br /&gt;&lt;br /&gt;def num = 1031;&lt;br /&gt;println(num instanceof Integer); // False&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Bueno esto fue una rápida revisión sobre los operadores en JavaFX, ahora seguiremos viendo secuencias y luego binding y triggers entre funciones para poder irnos introduciendo en la parte grafica de este poderoso lenguaje de scripting.&lt;br /&gt;&lt;br /&gt;Saludos hasta la próxima&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9134030404464162547-5520789794561405300?l=javacuriosities.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacuriosities.blogspot.com/feeds/5520789794561405300/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://javacuriosities.blogspot.com/2009/07/operadores.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/5520789794561405300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/5520789794561405300'/><link rel='alternate' type='text/html' href='http://javacuriosities.blogspot.com/2009/07/operadores.html' title='Operadores'/><author><name>Luis De Bello</name><uri>http://www.blogger.com/profile/04336187134558663051</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9134030404464162547.post-7210495113913823847</id><published>2009-07-23T16:59:00.071-03:00</published><updated>2009-07-25T12:35:50.464-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>Modificadores de visibilidad</title><content type='html'>&lt;span style="font-size:100%;"&gt;&lt;br /&gt;En este post veremos los distintos tipos de visibilidad que podemos usar para las clases, variables y métodos explicaremos que modificadores aplican a cada uno y sus diferencias, como primer paso comenzaremos nombrando cuales están presente en JavaFX.&lt;br /&gt;&lt;br /&gt;Modificadores:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Default Access&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The package Access Modifier&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The protected Access Modifier&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The public Access Modifier&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The public-read Access Modifier&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The public-init Access Modifier&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="fullpost"  style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Default Access&lt;/span&gt;&lt;br /&gt;Este modificador es uno que sin saberlo lo usamos en todos los ejemplos anteriores e hicimos mención a él cuando dijimos que se lo conoce como el modificador "script-only", esto quiere decir que cualquier &lt;span style="font-weight: bold;"&gt;clase, variable o función&lt;/span&gt; que no le definamos una visibilidad por defecto podrá ser vista desde cualquier parte del mismo script y de ningún otro lado&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Package Access Modifier&lt;/span&gt;&lt;br /&gt;El modificador por package nos permite definir visibilidad de paquete en &lt;span style="font-weight: bold;"&gt;clases, variables o funciones&lt;/span&gt; , ósea nosotros podríamos tener dos archivos .fx los cuales estén el mismo paquete así que podríamos usar las cosas de uno en el otro siempre y cuando hayamos definido su visibilidad en package&lt;br /&gt;&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;script1.fx&lt;/span&gt;&lt;pre&gt;&lt;code&gt;// Aquí definimos el paquete de este script&lt;br /&gt;package tutorial;&lt;br /&gt;&lt;br /&gt;// Definimos la var message con visibilidad de paquete&lt;br /&gt;package var message = "Hello from script1.fx!";&lt;br /&gt;&lt;br /&gt;// Definimos la función también con visibilidad de paquete&lt;br /&gt;package function printMessage() {&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp println("{message} (in function printMessage)");&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;script2.fx&lt;/span&gt;&lt;pre&gt;&lt;code&gt;// Aquí definimos el paquete de este script&lt;br /&gt;package tutorial;&lt;br /&gt;&lt;br /&gt;// acedemos a la var message del script1&lt;br /&gt;println(script1.message);&lt;br /&gt;&lt;br /&gt;// Llamamos a la función del script1&lt;br /&gt;script1.printMessage();&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;En el ejemplo se ve como desde un script podemos acceder a las variables o funciones de otro script si están definidos en el mismo paquete y si esas variables o funciones tienen definida una visibilidad de paquete.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Protected Access Modifier&lt;/span&gt;&lt;br /&gt;Con este modificador podremos definir visibilidad en &lt;span style="font-weight: bold;"&gt;variables y funciones&lt;/span&gt; entre el mismo paquete y entre subclases.&lt;br /&gt;&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;one.fx&lt;/span&gt;&lt;pre&gt;&lt;code&gt;// Aquí definimos el paquete de este script&lt;br /&gt;package tutorial;&lt;br /&gt;&lt;br /&gt;public class one {&lt;br /&gt;protected var message = "Hello!";&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;two.fx&lt;/span&gt;&lt;pre&gt;&lt;code&gt;style="font-size:100%;"&gt;// Importamos el script one&lt;br /&gt;import tutorial.one;&lt;br /&gt;&lt;br /&gt;// Como two hereda de one y message esta&lt;br /&gt;// definida como protected puede hacer a su valor&lt;br /&gt;class two extends one {&lt;br /&gt;function printMessage() {&lt;br /&gt;println("Class two says {message}");&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;var t = two{};&lt;br /&gt;t.printMessage();&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;The public Access Modifier&lt;/span&gt;&lt;br /&gt;Al usar este modificador estamos dando la posibilidad de acceder ya sea desde cualquier clase o paquete a las &lt;span style="font-weight: bold;"&gt;clases, variables y funciones&lt;/span&gt; que hayan sido expuestas como públicas.&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;One.fx&lt;/span&gt;&lt;pre&gt;&lt;code&gt;package tutorial;&lt;br /&gt;public def someMessage = "This is a public script variable, in one.fx";&lt;br /&gt;public class one {&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp public var message = "Hello from class one!";&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp public function printMessage() {&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp println("{message} (in function printMessage)");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Two.fx&lt;/span&gt;&lt;pre&gt;&lt;code&gt;import tutorial.one;&lt;br /&gt;println(one.someMessage);&lt;br /&gt;var o = one{};&lt;br /&gt;println(o.message);&lt;br /&gt;o.printMessage();&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;The public-read Access Modifier&lt;/span&gt;&lt;br /&gt;Bueno los dos últimos modificadores son los más complicados a mi parecer así que prestemos atención como funciona.&lt;br /&gt;Public read nos da la posibilidad que a las variables les digamos que son de solo lectura desde cualquier lado pero funciona para la escritura desde el mismo paquete, pero acá es donde está la trampa nosotros también podríamos definir que sea de solo lectura pública y definir otro scope para la escritura, esto lo logramos de tres maneras.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;// Aquí estamos en el caso donde la variable&lt;br /&gt;// es de solo lectura, excepto en el mismo script&lt;br /&gt;public-read var example1 = 'Test';&lt;br /&gt;&lt;br /&gt;// Aquí estamos en el caso donde la variable&lt;br /&gt;// es de solo lectura, excepto para los script del mismo paquete&lt;br /&gt;package public-read var example2 = 'Test';&lt;br /&gt;&lt;br /&gt;// Aquí estamos en el caso donde la variable&lt;br /&gt;// es de solo lectura, excepto para los script&lt;br /&gt;// del mismo paquete o de subclases&lt;br /&gt;protected public-read var example3 = 'Test';&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Me parece que viendo las tres variantes de arriba nos debería quedar una idea clara de cómo funciona este modificador pero si surge alguna duda, no duden en comentar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The public-init Access Modifier&lt;/span&gt;&lt;br /&gt;Este es muy parecido al modificador anterior con la diferencia que este lo usamos para definir donde podemos iniciar nuestra variable.&lt;br /&gt;&lt;br /&gt;Ejemplo&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Two.fx&lt;/span&gt;&lt;pre&gt;&lt;code&gt;import tutorial.one;&lt;br /&gt;var o = one {&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp message: "Initialized this variable from a different package!"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// No compila, ya que no se definió su escritura&lt;br /&gt;// así que por defecto es el mismo script&lt;br /&gt;o.message = "Changing the message...";&lt;br /&gt;println(o.message);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Bueno con esto hemos echado un vistazo a cada uno, en esta parte no dimos una gran explicación teórica porque creo que los ejemplos reflejan bien los conceptos y además no hay mucho más que decir acerca de estos modificadores.&lt;br /&gt;&lt;br /&gt;En el próximo post nos concentraremos en los operadores del lenguaje veremos que son muy similares a Java, pero conviene explicarlo aunque sea brevemente y marcar las diferencias.&lt;br /&gt;&lt;br /&gt;Saludos&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9134030404464162547-7210495113913823847?l=javacuriosities.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacuriosities.blogspot.com/feeds/7210495113913823847/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://javacuriosities.blogspot.com/2009/07/modificadores-de-visibilidad.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/7210495113913823847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/7210495113913823847'/><link rel='alternate' type='text/html' href='http://javacuriosities.blogspot.com/2009/07/modificadores-de-visibilidad.html' title='Modificadores de visibilidad'/><author><name>Luis De Bello</name><uri>http://www.blogger.com/profile/04336187134558663051</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9134030404464162547.post-7949905757597417518</id><published>2009-07-21T20:13:00.047-03:00</published><updated>2009-07-27T14:59:35.548-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>Clases JavaFX</title><content type='html'>El API de JavaFX ya nos provee de un gran número de clases que podemos usar en nuestras aplicaciones, sin embargo además podemos definir nuestras propias clases, en esta parte nos concentraremos en definir algunas clases y ver que nuevas variantes nos provee este lenguaje.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Una clase se declara usando la keyword class y el nombre de la clase&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;strong&gt;class&lt;/strong&gt; Address {&lt;br /&gt;var street: String;&lt;br /&gt;var city: String;&lt;br /&gt;var state: String;&lt;br /&gt;var zip: String;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Como podemos observar aquí estamos definiendo la clase Address la cual consta de 4 variables que por ahora al no definir ningún&lt;span style="font-weight: bold;"&gt; modificador de visibilidad (Próximo tema ;))&lt;/span&gt; tendrá la visibilidad default que se conoce como "script-only". Esto también aplica para la clase ya que no definimos su modificador de visibilidad y solo podrá ser usada desde el mismo script. Un detalle muy importante es que las clases no poseen constructores la manera de crear una instancia de alguna clase es por medio del nombre de la clase y abrir " { ... } " e inicializar las propiedades que nosotros queramos, podemos imaginar esto como que dentro del closure poseemos un Map de propiedades y ahí asignamos sus valores&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;code&gt;def address = Address {&lt;br /&gt;street: "1 Main Street";&lt;br /&gt;city: "Santa Clara";&lt;br /&gt;state: "CA";&lt;br /&gt;zip: "95050";&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Arriba esta la creación de una instancia de la clase Address, en la cual inicializamos sus distintas propiedades.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Clases abstractas&lt;/span&gt;&lt;br /&gt;Al igual que en el lenguaje Java podemos definir una clase como abstracta, recordemos que una clase es abstracta si está definida como &lt;span style="font-weight: bold;"&gt;abstract class&lt;/span&gt; ya sea porque tiene uno o mas métodos(Funciones si nos referimos a JavaFX) , así como si no los tuviera y solo marcara la clase como abstracta.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;strong&gt;abstract&lt;/strong&gt; class Account {&lt;br /&gt;var accountNum: Integer;&lt;br /&gt;var balance: Number;&lt;br /&gt;&lt;br /&gt;function getBalance(): Number {&lt;br /&gt;   return balance;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function deposit(amount: Number): Void {&lt;br /&gt;   balance += amount;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function withdraw(amount: Number): Void {&lt;br /&gt;   balance -= amount;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Aquí acabamos de definir nuestra clase abstracta que provee toda la funcionalidad necesaria pero por algún motivo hemos decidido marcarla como abstracta, igual eso no nos interesa para el ejemplo, pero es bueno aclarar que esta clase podría ser concreta. Para lograr que una clase herede de otra debemos usar la palabra extends&lt;br /&gt;y luego de esto ya podremos agregar más propiedades o sobre escritura de funciones o lo que necesitemos hacer.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;class SimpleAccount extends Account {&lt;br /&gt;   var hasOverDraftProtection: Boolean;&lt;br /&gt;&lt;br /&gt;   override function withdraw(amount: Number) : Void {&lt;br /&gt;     if(balance-amount &amp;lt 0 and hasOverDraftProtection){&lt;br /&gt;         balance = 0;&lt;br /&gt;     } else {&lt;br /&gt;         balance -= amount; // may result in negative account balance!&lt;br /&gt;     }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;En el ejemplo de SimpleAccount vemos como aplicar herencia, además podemos ver el modificador &lt;span style="font-weight: bold;"&gt;override&lt;/span&gt; que es el encargado de sobrescribir una función, dentro de la misma función que estamos sobrescribiendo vemos como usamos a super para poder acceder a la implementación de la clase padre.&lt;br /&gt;&lt;br /&gt;Hasta aquí no hemos encontrado muchas diferencias con Java pero ha llegado el momento de hablar de las clases Mixin.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Clases Mixin&lt;/span&gt;&lt;br /&gt;Las clases mixin serian una mezcla de las interfaces Java junto con las clases abstracta ya que están dejan implementar y definir la implementación de las funciones, pero no podemos instanciar clases mixin.&lt;br /&gt;&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;package classpkg;&lt;br /&gt;&lt;br /&gt;mixin class MyNameMixin {&lt;br /&gt;var firstName = "John";&lt;br /&gt;var lastName = "Doe";&lt;br /&gt;function printName(){&lt;br /&gt;    println("My name is: {firstName} {lastName}");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;mixin class MyAddressMixin {&lt;br /&gt;var address = "1 Main Street, Anytown USA";&lt;br /&gt;function printAddress(){&lt;br /&gt;    println("My address is: {address}");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class MyContact extends MyNameMixin, MyAddressMixin { }&lt;br /&gt;&lt;br /&gt;def myContact = MyContact{};&lt;br /&gt;myContact.printName();&lt;br /&gt;myContact.printAddress();&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;En este ejemplo estamos definiendo dos clases mixin las cuales tiene propiedades y funciones propias y aunque no se puede crear nuevas instancias de ellas podemos usarla para lograr una herencia múltiple.&lt;br /&gt;&lt;br /&gt;Les dejo una lista de reglas sobre las clases:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Las clases Mixin no pueden ser instanciadas&lt;/li&gt;&lt;li&gt;Las clases Mixin solo pueden heredar de clases Mixin o interfaces&lt;/li&gt;&lt;li&gt;Las clases Mixin permiten extender cualquier numero de interfaces o clases Mixin&lt;/li&gt;&lt;li&gt;Las clases JavaFX solo pueden heredar de una clase JavaFX ya que está basado en Java&lt;/li&gt;&lt;/ol&gt;Bueno con esto terminamos este post, el proximo tema sera sobre los modificadores de visibilidad, espero se haya entendido todo y no hayan quedados dudas, cualquier cosa comenten&lt;br /&gt;&lt;br /&gt;Saludos&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9134030404464162547-7949905757597417518?l=javacuriosities.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacuriosities.blogspot.com/feeds/7949905757597417518/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://javacuriosities.blogspot.com/2009/07/clases-javafx.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/7949905757597417518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/7949905757597417518'/><link rel='alternate' type='text/html' href='http://javacuriosities.blogspot.com/2009/07/clases-javafx.html' title='Clases JavaFX'/><author><name>Luis De Bello</name><uri>http://www.blogger.com/profile/04336187134558663051</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9134030404464162547.post-8581160735037815023</id><published>2009-07-19T12:10:00.047-03:00</published><updated>2009-07-21T09:30:03.195-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>Tipos de datos</title><content type='html'>&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Hola como están, seguimos acá investigando JavaFX y empezaremos a ver sus tipos de datos y aprenderemos como trabajar con ellos.&lt;br /&gt;Bien, comencemos&lt;br /&gt;&lt;br /&gt;Tipos de datos:&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;String&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Number and Integer&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Boolean&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Duration&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Void&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Null&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span class="fullpost"&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;String:&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Es el tipo de dato que debemos usar para guardar representación de caracteres, prácticamente funcionan igual que en java pero aquí encontraremos algunas diferencias.&lt;br /&gt;&lt;br /&gt;Declaración e inicialización&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="font-size:100%;"&gt;var cadena1 = 'Cadena 1';&lt;br /&gt;var cadena2 = "Cadena 1";&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-size:100%;"&gt;Como podemos notar aquí esta permitido inicializar o asignar un String ya sea con comillas dobles o comillas simples en cambio en Java solo podíamos hacerlo con comillas dobles. Además si notamos no es necesario decirle que es del tipo String y este tipo ya se asigna automáticamente.&lt;br /&gt;&lt;br /&gt;Muchas veces deseamos concatenar distintas variables del tipo String, en JavaFX esto se puede&lt;br /&gt;resolver usando dentro de los &lt;span style="font-weight: bold;"&gt;" " &lt;/span&gt;un closure en el cual se evalúa el String y este es concatenado&lt;br /&gt;en la nuevo String, veamos un ejemplo para aclarar esto&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;def nombre = 'Joe';&lt;br /&gt;var resultado = "Hello {nombre}";&lt;br /&gt;println(resultado);&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-size:100%;"&gt;Si ejecutamos este código veremos que aparece por consola la frase &lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;"Hello Joe&lt;/span&gt;&lt;span style="font-size:100%;"&gt;" ya que la variable resultado es una referencia al nuevo String que se genera&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Nota: &lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Se le llama closure al hecho de que se creen referencias de las variables locales de donde se definió el closure, en el propio closure -Mínima explicación-&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;def valor = true;&lt;br /&gt;var respuesta = "The answer is {if (valor) "Yes" else "No"}";&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-size:100%;"&gt;Como vemos aquí estamos definiendo un closure con un if que devuelve "Yes" or "No" podríamos pensar esto como una función que recibe como parámetro la variable valor, en cambio aquí simplemente el closure tiene acceso a las referencias desde donde el ha sido definido.&lt;br /&gt;&lt;br /&gt;Para no hacerla largo con los String mostraremos el último ejemplo donde veremos como se concatenan dos referencias a String&lt;br /&gt;&lt;pre&gt;&lt;code&gt;def frase1 = "This example ";&lt;br /&gt;def frase2 = "joins two strings.";&lt;br /&gt;def fraseFinal = "{frase1}{frase2}";&lt;br /&gt;println(fraseFinal);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;&lt;br /&gt;Number and Integer:&lt;/span&gt;&lt;br /&gt;Estos tipos de datos son los referidos a los tipos numéricos y vamos a distinguir dos tipos los números enteros y los de punto flotante.&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;def numeroUno = 1.0; // Aquí el compilador infiere el tipo de dato Number&lt;br /&gt;def numeroDos = 1;   // Aquí el compilador infiere el tipo de dato Integer&lt;br /&gt;&lt;br /&gt;// Aquí hacemos una declaración explicita&lt;br /&gt;def numeroTres : Number = 1.0;&lt;br /&gt;def numeroCuatro : Integer = 1;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-size:100%;"&gt;Usualmente se recomienda usar el tipo Integer y dejar el tipo Number solo para&lt;br /&gt;los casos realmente necesarios.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Boolean:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Este valor es igual al tipo Boolean de Java y acepta los valores true/false.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;if (isAsleep) {&lt;br /&gt;  wakeUp();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;El código que ingresemos dentro de "( )" será evaluado en cambio el código ingresado dentro de "{ }" será ejecutado&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Duration:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Este es un tipo especial de JavaFX que se encarga de representar una unidad de tiempo&lt;br /&gt;&lt;pre&gt;&lt;code&gt;5ms; // 5 milliseconds&lt;br /&gt;10s; // 10 seconds&lt;br /&gt;30m; // 30 minutes&lt;br /&gt;1h;  // 1 hour&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Veremos con mayor detenimiento este tipo cuando empecemos a usar Animaciones ya que ahí queremos que en distintos momentos de un Time Line se ejecuten diversas acciones.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Void:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Creo que este ya es conocido por todos, pero diremos que es el tipo que usamos para indicar que una función no retorna ningún valor.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;function imprimir() : Void {&lt;br /&gt;  println("Esta funcion no retorna nada!");&lt;br /&gt;}&lt;br /&gt;function imprimir() {&lt;br /&gt;  println("Esta funcion no retorna nada!");&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Como podemos notar tenemos dos formas que son validas para indicar que la función no retorna ningún valor, ya sea explícitamente con el : Void o implícitamente sin indicar su tipo de retorno&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Null:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Este tipo es especial ya que nos permite indicar la falta de un valor normal, cuando declaramos variables están podrían estar referenciando datos no validos.&lt;br /&gt;&lt;br /&gt;Estos serian los 6 tipos de datos que se encuentran dentro de JavaFX, ahora solo nos queda empezar a trabajar mas con ellos e ir conociéndolos, ya veremos como son declarados dentro de clases y sus formas de acceso.&lt;br /&gt;&lt;br /&gt;Saludos&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9134030404464162547-8581160735037815023?l=javacuriosities.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacuriosities.blogspot.com/feeds/8581160735037815023/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://javacuriosities.blogspot.com/2009/07/tipos-de-datos.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/8581160735037815023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/8581160735037815023'/><link rel='alternate' type='text/html' href='http://javacuriosities.blogspot.com/2009/07/tipos-de-datos.html' title='Tipos de datos'/><author><name>Luis De Bello</name><uri>http://www.blogger.com/profile/04336187134558663051</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9134030404464162547.post-2911691548081486203</id><published>2009-07-18T15:56:00.051-03:00</published><updated>2009-07-23T16:15:39.823-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>Comenzando con JavaFX en Windows</title><content type='html'>&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Bueno empezaremos con una serie de post acerca de JavaFX. Esta tecnologia sale al mercado para competir contra Flex y Silverlight, todavía está en duda si esta tecnología lograra el lugar que busca, pero me parece un buen momento para empezar a descubrirla.&lt;br /&gt;&lt;br /&gt;Partiremos desde lo mas básico, instalando las librerías y buscando que IDE usar hasta que podamos hacer ejemplos donde podamos ir viendo el poder que nos ofrece este nuevo lenguaje de scripting. Para no hacer más largo este primer post paso a comentarles los pasos necesarios para preparar nuestras maquinas para trabajar&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Pasos:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Entraremos al sitio oficial para ver las versiones y hacer las descargas correspondientes&lt;br /&gt;&lt;a href="http://www.javafx.com/"&gt;http://www.javafx.com/&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;En la página de JavaFX encontraremos diversas cosas que podremos bajarnos, daremos una breve explicación de cada una (JavaFX versión 1.2 al momento de escribir esta nota)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;JavaFX 1.2 SDK: Al bajar esto estamos bajando el Software Development Kit el cual es un instalador parecido al que ejecutamos al instalar el JDK en nuestras maquinas donde se copiaran las librerías necesarias para desarrollo y además podremos ejecutar los comandos de JavaFX desde la consola de Windows&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;JavaFX 1.2 Production Suite: Esto es un conjunto de herramientas para los diseñadores que facilita el proceso de incorporación de imágenes en aplicaciones JavaFX&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;NetBeans IDE 6.5.1 for JavaFX 1.2: Bueno como ya sabrán unos de los IDE más populares para Java en su versión 6.5.1 trae incorporado JavaFX con algunas facilidades para el desarrollo, también hay un plugin para el eclipse pero ciertamente no lo he probado.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:100%;"&gt;Haremos un ejemplo básico para mostrar algunas características básicas y usaremos la consola para compilar y ejecutar nuestro ejemplo, veremos que los archivos no tienen una extensión java sino que poseen su propia extensión .fx igual estos son compilados a bytecode que quedan en archivos .class y luego serán ejecutados por la JVM.&lt;br /&gt;Como primer paso debemos instalar el SDK y probar que la consola nos reconoce lo comandos javafxc y javafx, no debería haber problema alguno con esto pero si alguien tiene algún problema que comente y buscamos el porqué.&lt;br /&gt;&lt;br /&gt;Para el ejemplo yo eh creado una carpeta llamada JavaFX donde dejare la siguiente estructura de directorios&lt;br /&gt;&lt;br /&gt;C:\JavaFX\maintest\Main.fx&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Archivo Main.fx:&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;package maintest;&lt;br /&gt;// Define Address class.&lt;br /&gt;class Address {&lt;br /&gt;var street: String;&lt;br /&gt;var city: String;&lt;br /&gt;var state: String;&lt;br /&gt;var zip: String;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Create the first Address object instance.&lt;br /&gt;var addressOne = Address {&lt;br /&gt;street: "1 Main Street";&lt;br /&gt;city: "Santa Clara";&lt;br /&gt;state: "CA";&lt;br /&gt;zip: "95050";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Create the second Address object instance.&lt;br /&gt;def addressTwo = Address {&lt;br /&gt;street: "200 Pine Street";&lt;br /&gt;city: "San Francisco";&lt;br /&gt;state: "CA";&lt;br /&gt;zip: "94101";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function run(args : String[]) {&lt;br /&gt;for (arg in args) {&lt;br /&gt;  println("Parameters = {arg}");&lt;br /&gt;}&lt;br /&gt;println("Street One = {addressOne.street}");&lt;br /&gt;println("Street Two = {addressTwo.street}");&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ahora más adelante explicaremos cada parte del código, este sería nuestro archivo Main.fx ahora lo compilaremos por medio de la consola, abrimos una consola de comandos y nos situaremos en C:\JavaFX.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;Compilar paso 1:&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Situados en el directorio anteriormente dicho escribimos lo siguiente&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;javafxc "maintest/Main.fx"&lt;/span&gt;&lt;span style="font-size:100%;"&gt; esto nos genera los .class necesarios para poder ejecutar el ejemplo&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;Ejecutar paso 2&lt;/span&gt;&lt;span style="font-size:100%;"&gt;:&lt;br /&gt;Situados en el mismo directorio anterior escribimos&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;javafx maintest.Main 9 2&lt;/span&gt;&lt;span style="font-size:100%;"&gt; de esta forma estaremos ejecutando nuestro ejemplo pasándole dos parámetros el primero un String que contiene 9 y el segundo un String que contiene el 2.&lt;br /&gt;&lt;br /&gt;Explicación básica del código:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Parte 1:&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;class Address {&lt;br /&gt;var street: String;&lt;br /&gt;var city: String;&lt;br /&gt;var state: String;&lt;br /&gt;var zip: String;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Aquí estamos definiendo la clase Address la cual tendrá 4 variables que se indican con la palabra reservada var &lt;span style="font-weight: bold;"&gt;"elNombreDeLaVariable" &lt;/span&gt;: &lt;span style="font-weight: bold;"&gt;"suTipoDeDato"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Parte 2 y 3:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;// Create the first Address object instance.&lt;br /&gt;var addressOne = Address {&lt;br /&gt;street: "1 Main Street";&lt;br /&gt;city: "Santa Clara";&lt;br /&gt;state: "CA";&lt;br /&gt;zip: "95050";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Create the second Address object instance.&lt;br /&gt;def addressTwo = Address {&lt;br /&gt;street: "200 Pine Street";&lt;br /&gt;city: "San Francisco";&lt;br /&gt;state: "CA";&lt;br /&gt;zip: "94101";&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;En ambos casos estamos declarando referencias a objetos del Tipo Address donde usamos { ... } como se usaría un constructor donde inicializamos los distintos valores de la clase, la diferencia importante entre estas dos referencias son que una se declaro con la palabra reservada var y la otra con def. Esto quiero decir que la que se declaro con def seria una referencia del tipo final y no puede cambiar durante la ejecución del script.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Parte 4:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;function run(args : String[]) {&lt;br /&gt;for (arg in args) {&lt;br /&gt;  println("Parameters = {arg}");&lt;br /&gt;}&lt;br /&gt;println("Street One = {addressOne.street}");&lt;br /&gt;println("Street Two = {addressTwo.street}");&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Aquí estamos definiendo la función run que sería el equivalente al main de una clase Java y recibe un array de argumento de longitud variable, en la primer línea iteramos sobre los argumentos y mostramos sus valores en las otras dos imprimimos los valores de las distintas direcciones para lograr imprimirlo se usa {addressOne.street} de manera que fuera un closure.&lt;br /&gt;&lt;br /&gt;Bueno esto fue todo por este post por cualquier duda que posiblemente haya espero los comentarios y en qué forma se podría mejorar el post.&lt;br /&gt;En próximas entradas veremos los tipos de datos de JavaFX así como en más detalles sus distintas características.&lt;br /&gt;&lt;br /&gt;Saludos&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9134030404464162547-2911691548081486203?l=javacuriosities.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacuriosities.blogspot.com/feeds/2911691548081486203/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://javacuriosities.blogspot.com/2009/07/comenzando-con-javafx-en-windows.html#comment-form' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/2911691548081486203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9134030404464162547/posts/default/2911691548081486203'/><link rel='alternate' type='text/html' href='http://javacuriosities.blogspot.com/2009/07/comenzando-con-javafx-en-windows.html' title='Comenzando con JavaFX en Windows'/><author><name>Luis De Bello</name><uri>http://www.blogger.com/profile/04336187134558663051</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry></feed>
