<?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-114930265400628746</id><updated>2011-07-07T16:38:33.225-07:00</updated><category term='flash'/><category term='improve'/><category term='mejora'/><category term='control'/><category term='fuente'/><category term='spanish'/><category term='solution'/><category term='bug'/><category term='aguja'/><category term='free'/><category term='llamar'/><category term='ajustable'/><category term='textos'/><category term='app.yaml'/><category term='termino'/><category term='nodos'/><category term='compuestos'/><category term='adobe'/><category term='presentacion'/><category term='gauge'/><category term='solucion'/><category term='cual'/><category term='informacion'/><category term='compilador'/><category term='detection'/><category term='frames'/><category term='syntaxis'/><category term='controles'/><category term='resources'/><category term='lineargradient'/><category term='classes'/><category term='drag'/><category term='flicker'/><category term='configurar'/><category term='variables'/><category term='scripting'/><category term='paint'/><category term='java'/><category term='effect'/><category term='graphics'/><category term='duration'/><category term='rotacion'/><category term='at'/><category term='experiment'/><category term='clases'/><category term='wora'/><category term='rotate'/><category term='resorte'/><category term='online'/><category term='curso'/><category term='align'/><category term='desktop'/><category term='movil'/><category term='construir'/><category term='sombra'/><category term='fps'/><category term='mp3'/><category term='scrips'/><category term='google'/><category term='entrada'/><category term='sonido'/><category term='return'/><category term='incrustar'/><category term='list'/><category term='bind with inverse'/><category term='option'/><category term='compilacion'/><category term='zone'/><category term='collision'/><category term='application'/><category term='demo'/><category term='java me'/><category term='drag and drop'/><category term='open source code'/><category term='site'/><category term='many'/><category term='portable'/><category term='node'/><category term='oldvalue'/><category term='sound'/><category term='animation'/><category term='course'/><category term='orientation'/><category term='jnlp'/><category term='physics'/><category term='code'/><category term='duracion'/><category term='aplicar'/><category term='flotante'/><category term='graphic graphics'/><category term='customization'/><category term='gratuito'/><category term='grafico'/><category term='attracted'/><category term='charts'/><category term='dinamico'/><category term='listas'/><category term='workaround'/><category term='silverlight'/><category term='java2me'/><category term='howto'/><category term='compound'/><category term='area'/><category term='graficos'/><category term='per second'/><category term='world'/><category term='celular'/><category term='twitterfx'/><category term='size'/><category term='configuracion'/><category term='widgets'/><category term='ball'/><category term='create'/><category term='netbeans'/><category term='builder'/><category term='dibujo'/><category term='recorrer'/><category term='colision'/><category term='cool'/><category term='slider'/><category term='migracion'/><category term='trick'/><category term='atributo'/><category term='hacer'/><category term='twitter'/><category term='problema'/><category term='source code'/><category term='index'/><category term='bouce'/><category term='bucle'/><category term='visitas'/><category term='attract'/><category term='objetos'/><category term='libreria'/><category term='barra'/><category term='mobile'/><category term='persist'/><category term='javafx 1.0'/><category term='display'/><category term='documentation'/><category term='web'/><category term='bouncing'/><category term='how to'/><category term='storage'/><category term='alignment'/><category term='rebotan'/><category term='componente'/><category term='gratis'/><category term='how'/><category term='apply'/><category term='library'/><category term='fisica'/><category term='radialgradient'/><category term='secuencias'/><category term='distribuir'/><category term='pda'/><category term='libros'/><category term='arreglos'/><category term='function'/><category term='texts'/><category term='performance'/><category term='tv'/><category term='diseño'/><category term='instancias'/><category term='fxz'/><category term='canskip'/><category term='arrastrar'/><category term='alto'/><category term='deteccion'/><category term='midlet'/><category term='dependencias'/><category term='local'/><category term='respuesta'/><category term='detectar'/><category term='language'/><category term='minimo'/><category term='scan'/><category term='vertical'/><category term='aplicacion'/><category term='telefono'/><category term='manometro'/><category term='portability'/><category term='valor'/><category term='integration'/><category term='transparency'/><category term='cambio'/><category term='persistence'/><category term='sitio'/><category term='hospedaje'/><category term='ria'/><category term='navegador'/><category term='release'/><category term='modificacion'/><category term='widget'/><category term='orientacion'/><category term='aprender'/><category term='visits'/><category term='1.2'/><category term='juegos'/><category term='restrictions'/><category term='circulo'/><category term='enlaces'/><category term='herramienta'/><category term='texto'/><category term='shadow'/><category term='fondo'/><category term='adjustable'/><category term='javascript'/><category term='timeline'/><category term='ventana'/><category term='que es'/><category term='memefx'/><category term='reservada'/><category term='calling'/><category term='effects'/><category term='download'/><category term='delete'/><category term='arrastrables'/><category term='browser'/><category term='imagenes'/><category term='class'/><category term='script'/><category term='windows'/><category term='conflicto'/><category term='codigo abierto'/><category term='codigo fuente'/><category term='background'/><category term='basico'/><category term='cellular'/><category term='lesson'/><category term='ajustar'/><category term='experimento'/><category term='contenedor'/><category term='divertido'/><category term='tool'/><category term='maze'/><category term='resolver'/><category term='demostraciones'/><category term='configure'/><category term='games'/><category term='documentacion'/><category term='maximo'/><category term='mejorar'/><category term='website'/><category term='font'/><category term='ejemplos'/><category term='moviles'/><category term='leccion'/><category term='pantallas'/><category term='demostration'/><category term='jws'/><category term='1.1'/><category term='source'/><category term='como'/><category term='colores'/><category term='incluir'/><category term='tamaño'/><category term='reiniciacion'/><category term='opcion'/><category term='call'/><category term='encabezado'/><category term='rebotar'/><category term='nodes'/><category term='eventos'/><category term='bounce'/><category term='avoid'/><category term='binding'/><category term='images'/><category term='resize'/><category term='java web start'/><category term='graphic'/><category term='pestañeo'/><category term='back'/><category term='cellphone'/><category term='distribucion'/><category term='ajuste'/><category term='books'/><category term='bugs'/><category term='production'/><category term='autor'/><category term='migrar'/><category term='como usar'/><category term='fonts'/><category term='diversion'/><category term='hosting'/><category term='mundo'/><category term='nodo'/><category term='applet'/><category term='api'/><category term='draggable'/><category term='array'/><category term='adjustment'/><category term='audio'/><category term='configuration'/><category term='sintaxis'/><category term='resource'/><category term='video'/><category term='despliegue'/><category term='español'/><category term='actionscript'/><category term='gradient'/><category term='ejercicio'/><category term='mas'/><category term='demos'/><category term='imagesaccordion'/><category term='controlador'/><category term='to'/><category term='juego'/><category term='example'/><category term='programacion'/><category term='atrae'/><category term='maximum'/><category term='descarga'/><category term='chile'/><category term='altura'/><category term='truco'/><category term='output'/><category term='controller'/><category term='pelota'/><category term='text'/><category term='varios'/><category term='funciones'/><category term='atraer'/><category term='persistencia'/><category term='circle'/><category term='boucing'/><category term='framework'/><category term='atraidos'/><category term='error'/><category term='performace'/><category term='partida'/><category term='menues'/><category term='loop'/><category term='funcion'/><category term='recorrido'/><category term='input'/><category term='reinicia'/><category term='event'/><category term='accordion'/><category term='detect'/><category term='posicion'/><category term='texthtml'/><category term='animaciones'/><category term='animacion'/><category term='rebotando'/><category term='jafax'/><category term='fuentes'/><category term='statement'/><category term='instalar'/><category term='menu'/><category term='popupmenu'/><category term='salida'/><category term='screen'/><category term='pantalla'/><category term='speed'/><category term='puntero'/><category term='aprendiendo'/><category term='header'/><category term='efecto'/><category term='textalignment'/><category term='objects. object'/><category term='cell'/><category term='efectos'/><category term='tip'/><category term='replace'/><category term='demostracion'/><category term='grafica'/><category term='dinamicas'/><category term='dinamica'/><category term='evitar'/><category term='escritorio'/><category term='frame'/><category term='use'/><category term='reloj'/><category term='accumulate'/><category term='ejemplo'/><category term='suite'/><category term='personablizable'/><category term='previo'/><category term='knob'/><category term='rebota'/><category term='3d'/><category term='ancho'/><category term='objeto'/><category term='illustrator'/><category term='articulo'/><category term='rendimiento'/><category term='functions'/><category term='open source'/><category term='insert'/><category term='test'/><category term='recurso'/><category term='widgetfx'/><category term='popup'/><category term='minimum'/><category term='window'/><category term='tips'/><category term='spring'/><category term='timelines'/><category term='persistent'/><category term='expresiones'/><category term='bind'/><category term='flick'/><category term='illustratos'/><category term='codigo'/><category term='multiple'/><category term='pie'/><category term='portabilidad'/><category term='velocidad'/><category term='datos'/><category term='floating'/><category term='security'/><category term='sequence'/><category term='crear'/><category term='javame'/><category term='ejes'/><category term='indexof'/><category term='acumular'/><category term='acordeon'/><category term='game'/><category term='links'/><category term='multiples'/><category term='component'/><category term='evaluacion'/><category term='deferaction'/><category term='imagen'/><category term='custom'/><category term='bar'/><category term='componentes'/><category term='html'/><category term='color'/><category term='arrastrable'/><category term='customizable'/><category term='selector'/><category term='explicacion'/><category term='components'/><category term='ciencia'/><category term='bola'/><category term='adjust'/><category term='biblioteca'/><category term='por segundo'/><category term='reemplazo'/><category term='sandbox'/><category term='value'/><category term='integracion'/><category term='width'/><category term='on replace'/><category term='cache'/><category term='personalizacion'/><category term='dynamic'/><category term='personalizar'/><category term='autores'/><category term='agregar'/><category term='perilla'/><category term='keyframe'/><category term='trucos'/><category term='real'/><category term='for'/><category term='recursos'/><category term='python'/><category term='javaone'/><category term='horizontal'/><category term='limits'/><category term='height'/><category term='transparencia'/><category term='valores'/><category term='recomendaciones'/><category term='app engine'/><category term='science'/><category term='phys2d'/><category term='stage'/><category term='javafx'/><category term='bind with reverse'/><category term='variable'/><category term='author'/><category term='ajax'/><category term='programming'/><category term='tutorial'/><category term='trigger'/><category term='ejecutar'/><category term='position'/><category term='diseñador'/><category term='persistente'/><category term='funcionalidad'/><category term='lista'/><category term='opciones'/><category term='rebote'/><category term='elastico'/><category term='clase'/><category term='distribution'/><title type='text'>Aprendiendo JavaFX</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Mauro</name><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>62</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-114930265400628746.post-1708876475753658538</id><published>2009-08-28T11:30:00.000-07:00</published><updated>2009-08-28T11:48:13.089-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migracion'/><category scheme='http://www.blogger.com/atom/ns#' term='1.1'/><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='migrar'/><category scheme='http://www.blogger.com/atom/ns#' term='cambio'/><category scheme='http://www.blogger.com/atom/ns#' term='1.2'/><title type='text'>Migrando a JavaFX 1.2: de UiStub --&gt; FXDNode</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_esUBlqKjDzk/SpgjFzRq3YI/AAAAAAAAD2g/b_xR6W6MUwI/s1600-h/javafx-1-2-top-101.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 180px; height: 163px;" src="http://4.bp.blogspot.com/_esUBlqKjDzk/SpgjFzRq3YI/AAAAAAAAD2g/b_xR6W6MUwI/s200/javafx-1-2-top-101.jpg" alt="" id="BLOGGER_PHOTO_ID_5375084737837325698" border="0" /&gt;&lt;/a&gt;Ayer retomé JavaFX para migrar el proyecto memeFX (código abierto) a la versión JavaFX 1.2 y este es básicamente el único inconveniente que encontré (además de un bug algo extraño que tengo que verificar).&lt;br /&gt;&lt;br /&gt;Estas clases se utilizan para obtener recursos gráficos para la aplicación, como las imágenes generadas con Adobe Illustrator:&lt;br /&gt;&lt;br /&gt;En JavaFX 1.1 se usaba UiStub del paquete javafx.fxd.UiStub:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;import javafx.fxd.&lt;span style="font-weight: bold; color: rgb(102, 255, 255);"&gt;UiStub&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;public class myClass extends &lt;span style="font-weight: bold; color: rgb(102, 255, 255);"&gt;UiStub &lt;/span&gt;{&lt;br /&gt;&lt;br /&gt;  override protected function &lt;span style="font-weight: bold; color: rgb(102, 255, 255);"&gt;update&lt;/span&gt;() {&lt;br /&gt;      ...&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Ahora, es necesario utilizar FXDNode también en el paquete javafx.fxd. Sólo hay que hacer este cambio:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;import javafx.fxd.&lt;span style="color: rgb(102, 255, 255); font-weight: bold;"&gt;FXDNode&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;public class BasicKnob extends &lt;span style="font-weight: bold; color: rgb(102, 255, 255);"&gt;FXDNode &lt;/span&gt;{&lt;br /&gt;&lt;br /&gt;  override protected function &lt;span style="font-weight: bold; color: rgb(102, 255, 255);"&gt;contentLoaded&lt;/span&gt;() {&lt;br /&gt;      ...&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-1708876475753658538?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/1708876475753658538/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=1708876475753658538' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/1708876475753658538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/1708876475753658538'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/08/migrando-javafx-12-de-uistub-fxdnode.html' title='Migrando a JavaFX 1.2: de UiStub --&gt; FXDNode'/><author><name>Mauro</name><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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_esUBlqKjDzk/SpgjFzRq3YI/AAAAAAAAD2g/b_xR6W6MUwI/s72-c/javafx-1-2-top-101.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-114930265400628746.post-1733795070395066010</id><published>2009-06-16T22:41:00.000-07:00</published><updated>2009-07-10T16:22:24.533-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='juego'/><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='divertido'/><category scheme='http://www.blogger.com/atom/ns#' term='dibujo'/><category scheme='http://www.blogger.com/atom/ns#' term='grafica'/><category scheme='http://www.blogger.com/atom/ns#' term='graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='graficos'/><category scheme='http://www.blogger.com/atom/ns#' term='fisica'/><category scheme='http://www.blogger.com/atom/ns#' term='diversion'/><category scheme='http://www.blogger.com/atom/ns#' term='physics'/><title type='text'>Pastello... JavaFX crayon phyics</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_esUBlqKjDzk/SjiDVxchMXI/AAAAAAAACUw/7NMz0Wg5YF0/s1600-h/pastello.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 152px;" src="http://3.bp.blogspot.com/_esUBlqKjDzk/SjiDVxchMXI/AAAAAAAACUw/7NMz0Wg5YF0/s200/pastello.jpg" alt="" id="BLOGGER_PHOTO_ID_5348168967575908722" border="0" /&gt;&lt;/a&gt;Me suscribi para seguir el Twitter de JavaFX y el primer post que encontré me pareció entretenido. Se llama Pastello. Es un juego de "puzzle" en que debes dibujar la solución para que una bolita llegue hasta donde está la estrella.&lt;br /&gt;&lt;br /&gt;Lo interesante del proyecto es la FISICA de los elementos. Así, por ejemplo, puedes dejar caer bolitas sobre la bola principal, de manera que esta gire subiendo por una rampa que dibujaste con un triangulo. También puedes agregar contrapesos, etc. Un tanto adictivo! ;D&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.lavpescia.it/pastello/"&gt;&lt;span style="color: rgb(255, 0, 0);font-size:130%;" &gt;&lt;span style="font-weight: bold;"&gt;Jugar Pastello&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://theorymatters.wordpress.com/2009/05/28/javafx-crayon-physics/"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Sitio del proyecto Pastello&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-1733795070395066010?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/1733795070395066010/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=1733795070395066010' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/1733795070395066010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/1733795070395066010'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/06/pastello-javafx-crayon-phyics.html' title='Pastello... JavaFX crayon phyics'/><author><name>Mauro</name><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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_esUBlqKjDzk/SjiDVxchMXI/AAAAAAAACUw/7NMz0Wg5YF0/s72-c/pastello.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-114930265400628746.post-8231971167142635807</id><published>2009-06-05T17:50:00.000-07:00</published><updated>2009-06-05T17:57:22.675-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='ejes'/><category scheme='http://www.blogger.com/atom/ns#' term='grafica'/><category scheme='http://www.blogger.com/atom/ns#' term='pie'/><category scheme='http://www.blogger.com/atom/ns#' term='presentacion'/><category scheme='http://www.blogger.com/atom/ns#' term='codigo'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='display'/><category scheme='http://www.blogger.com/atom/ns#' term='despliegue'/><category scheme='http://www.blogger.com/atom/ns#' term='datos'/><category scheme='http://www.blogger.com/atom/ns#' term='informacion'/><category scheme='http://www.blogger.com/atom/ns#' term='charts'/><category scheme='http://www.blogger.com/atom/ns#' term='graficos'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>JavaFX 1.2 incluye APIs para gráficos (charts)</title><content type='html'>&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;Este es el código para agregar un gráfico de Pie en JavaFX&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_esUBlqKjDzk/Sim9osBHZgI/AAAAAAAACKk/cDGrUAFjTRk/s1600-h/piechart.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 208px;" src="http://1.bp.blogspot.com/_esUBlqKjDzk/Sim9osBHZgI/AAAAAAAACKk/cDGrUAFjTRk/s400/piechart.PNG" alt="" id="BLOGGER_PHOTO_ID_5344010939560060418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package piechartsample;&lt;br /&gt;&lt;br /&gt;import javafx.scene.chart.*;&lt;br /&gt;import javafx.scene.Scene;&lt;br /&gt;import javafx.scene.text.Font;&lt;br /&gt;import javafx.scene.text.FontWeight;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;&lt;br /&gt;var name = ["Java", "JavaFX", "MySQL", "Netbeans", "Others"];&lt;br /&gt;var val = [20, 12, 25, 22, 30];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var r :  PieChart.Data[] = [];&lt;br /&gt;for(i in [0..4]) {&lt;br /&gt;insert  PieChart.Data {&lt;br /&gt; action: function() {&lt;br /&gt;     print("Name   ::  {name[i]}");&lt;br /&gt; }&lt;br /&gt; label  : name[i] value : val[i] } into r; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var chart = PieChart3D {&lt;br /&gt;            data : r&lt;br /&gt;            pieLabelFont: Font.font("dialog", FontWeight.REGULAR, 8);&lt;br /&gt;            pieLabelVisible: true&lt;br /&gt;            pieValueVisible: true&lt;br /&gt;            pieToLabelLineOneLength: 3&lt;br /&gt;            pieToLabelLineTwoLength : 6&lt;br /&gt;&lt;br /&gt;         }&lt;br /&gt;&lt;br /&gt;         var st = Stage {&lt;br /&gt;            height: 420&lt;br /&gt;             width: 480&lt;br /&gt;             title:"Pie Chart 3D"&lt;br /&gt;             scene: Scene {&lt;br /&gt;                 content: [&lt;br /&gt;                     chart&lt;br /&gt;                  ]&lt;br /&gt;             }&lt;br /&gt;         }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;Este es el código para un gráfico de "burbujas":&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_esUBlqKjDzk/Sim-FjY_2SI/AAAAAAAACKs/g7rsetYH_Fg/s1600-h/bubblechart.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 269px;" src="http://1.bp.blogspot.com/_esUBlqKjDzk/Sim-FjY_2SI/AAAAAAAACKs/g7rsetYH_Fg/s400/bubblechart.PNG" alt="" id="BLOGGER_PHOTO_ID_5344011435460516130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;package bubblechart;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import javafx.scene.chart.*;&lt;br /&gt;import javafx.scene.chart.part.*;&lt;br /&gt;import javafx.scene.paint.Color;&lt;br /&gt;import javafx.scene.Scene;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;var x: Number[] = [30, 60, 10, 100,50];&lt;br /&gt;var y: Number[] = [40,20,90,40,23];&lt;br /&gt;var radius: Number[] = [10,13,7,10,5];&lt;br /&gt;&lt;br /&gt;var x1: Number[] = [13, 20, 100, 30,50];&lt;br /&gt;var y1: Number[] = [100,80,60,40,20];&lt;br /&gt;var radius1: Number[] = [7,13,10,6,12];&lt;br /&gt;&lt;br /&gt;var r :  BubbleChart.Data[] = [];&lt;br /&gt;var r1:  BubbleChart.Data[] = [];&lt;br /&gt;for(i in [0..4]) {&lt;br /&gt;insert  BubbleChart.Data {fill: Color.YELLOWGREEN xValue : x[i] yValue : y[i] radius: radius[i] }into r;&lt;br /&gt;insert  BubbleChart.Data {fill: Color.RED xValue : x1[i] yValue : y1[i] radius: radius1[i] }into r1;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;var s1 : BubbleChart.Series =  BubbleChart.Series{data: [r,r1]};&lt;br /&gt;var BubbleChartData : BubbleChart.Series[] = [s1];&lt;br /&gt;var chart = BubbleChart {&lt;br /&gt;              title : "BubbleChart"&lt;br /&gt;              xAxis : NumberAxis{&lt;br /&gt;                  lowerBound: 0&lt;br /&gt;                  upperBound : 150&lt;br /&gt;                  label: "SomeX"&lt;br /&gt;                  visible: true&lt;br /&gt;                  axisStrokeWidth: 1&lt;br /&gt;                  tickUnit : 20&lt;br /&gt;                  tickLabelsVisible: true&lt;br /&gt;&lt;br /&gt;              }&lt;br /&gt;              yAxis : NumberAxis{&lt;br /&gt;                  lowerBound: 0&lt;br /&gt;                  upperBound : 150&lt;br /&gt;                  tickUnit: 20&lt;br /&gt;                  label: "SomeY"&lt;br /&gt;                  visible: true&lt;br /&gt;                  tickLabelsVisible: true&lt;br /&gt;             }&lt;br /&gt;              data : BubbleChartData&lt;br /&gt;          }&lt;br /&gt;&lt;br /&gt;          var st = Stage {&lt;br /&gt;             height: 520&lt;br /&gt;              width: 640&lt;br /&gt;              title:"Bubble Chart"&lt;br /&gt;              scene: Scene {&lt;br /&gt;                  content: [&lt;br /&gt;                      chart&lt;br /&gt;                   ]&lt;br /&gt;              }&lt;br /&gt;          }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-8231971167142635807?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/8231971167142635807/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=8231971167142635807' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/8231971167142635807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/8231971167142635807'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/06/javafx-12-incluye-apis-para-graficos.html' title='JavaFX 1.2 incluye APIs para gráficos (charts)'/><author><name>Mauro</name><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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_esUBlqKjDzk/Sim9osBHZgI/AAAAAAAACKk/cDGrUAFjTRk/s72-c/piechart.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-114930265400628746.post-2784784010909139245</id><published>2009-06-05T13:57:00.000-07:00</published><updated>2009-06-05T14:09:00.669-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='demos'/><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><category scheme='http://www.blogger.com/atom/ns#' term='diseño'/><category scheme='http://www.blogger.com/atom/ns#' term='javaone'/><category scheme='http://www.blogger.com/atom/ns#' term='demostraciones'/><category scheme='http://www.blogger.com/atom/ns#' term='diseñador'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos'/><category scheme='http://www.blogger.com/atom/ns#' term='pantallas'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='multiples'/><category scheme='http://www.blogger.com/atom/ns#' term='desktop'/><category scheme='http://www.blogger.com/atom/ns#' term='tv'/><category scheme='http://www.blogger.com/atom/ns#' term='movil'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><category scheme='http://www.blogger.com/atom/ns#' term='demostracion'/><category scheme='http://www.blogger.com/atom/ns#' term='herramienta'/><title type='text'>Aquí hay algunos demos con JavaFX</title><content type='html'>A partir del minuto 20 de este video hay unas demos con JavaFX, incluyendo (minuto 30) la herramienta para generar JavaFX (como la utilizada hoy para generar Flash). Se ve bastante interesante, especialmente la capacidad de generar versiones para distintos dispositivos, en el mismo proyecto. Esto quiere decir que, mientras desarrollas una aplicación JavaFX para el escritorio, puedes ir creando una versión para un aparato móvil, un netbook o un TV con JavaFX (con distintos elementos o distribución de esos elementos en la pantalla de cada dispositivo).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Video: El show de los "Juguetes" Java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;object id="flashObj" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,47,0" height="278" width="425"&gt;&lt;param name="movie" value="http://c.brightcove.com/services/viewer/federated_f9/1640183659?isVid=1&amp;amp;publisherID=1460825906"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="flashVars" value="videoId=25457455001&amp;amp;playerID=1640183659&amp;amp;domain=embed&amp;amp;"&gt;&lt;param name="base" value="http://admin.brightcove.com"&gt;&lt;param name="seamlesstabbing" value="false"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="swLiveConnect" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://c.brightcove.com/services/viewer/federated_f9/1640183659?isVid=1&amp;amp;publisherID=1460825906" bgcolor="#FFFFFF" flashvars="videoId=25457455001&amp;amp;playerID=1640183659&amp;amp;domain=embed&amp;amp;" base="http://admin.brightcove.com" name="flashObj" seamlesstabbing="false" type="application/x-shockwave-flash" allowfullscreen="true" swliveconnect="true" allowscriptaccess="always" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" height="278" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-2784784010909139245?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/2784784010909139245/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=2784784010909139245' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/2784784010909139245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/2784784010909139245'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/06/aqui-hay-algunos-demos-con-javafx.html' title='Aquí hay algunos demos con JavaFX'/><author><name>Mauro</name><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-114930265400628746.post-8243050519724565643</id><published>2009-05-08T14:21:00.000-07:00</published><updated>2009-05-08T14:28:07.497-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='juego'/><category scheme='http://www.blogger.com/atom/ns#' term='animaciones'/><category scheme='http://www.blogger.com/atom/ns#' term='velocidad'/><category scheme='http://www.blogger.com/atom/ns#' term='animacion'/><category scheme='http://www.blogger.com/atom/ns#' term='moviles'/><category scheme='http://www.blogger.com/atom/ns#' term='respuesta'/><category scheme='http://www.blogger.com/atom/ns#' term='juegos'/><category scheme='http://www.blogger.com/atom/ns#' term='rendimiento'/><category scheme='http://www.blogger.com/atom/ns#' term='celular'/><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='recomendaciones'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='telefono'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='movil'/><title type='text'>Mejores prácticas para el desarrollo de JavaFX móvil</title><content type='html'>Un interesante artículo que describe como desarrollar aplicaciones con el mejor rendimiento posible en aparatos móviles, usando JavaFX Script:&lt;br /&gt;&lt;br /&gt;- Evitar bindings innecesarios&lt;br /&gt;- Mantener el scenegraph lo más pequeño posible&lt;br /&gt;- Usar Integer en vez de Number&lt;br /&gt;- Usar figuras simples en vez de imágenes&lt;br /&gt;- Usar funcionalidad de pre-escalado&lt;br /&gt;- Usar background loading ("descarga de fondo")&lt;br /&gt;- Usar funciones de clase Sequences&lt;br /&gt;&lt;br /&gt;Aquí está el artículo completo. Más adelante revisaré cada recomendación, para compartir los "descubrimientos" ;)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/developer/technicalArticles/javafx/mobile/"&gt;http://java.sun.com/developer/technicalArticles/javafx/mobile/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-8243050519724565643?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/8243050519724565643/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=8243050519724565643' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/8243050519724565643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/8243050519724565643'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/05/mejores-practicas-para-el-desarrollo-de.html' title='Mejores prácticas para el desarrollo de JavaFX móvil'/><author><name>Mauro</name><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-114930265400628746.post-6253263894097264288</id><published>2009-04-29T13:42:00.000-07:00</published><updated>2009-04-30T01:09:20.680-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='imagesaccordion'/><category scheme='http://www.blogger.com/atom/ns#' term='widgets'/><category scheme='http://www.blogger.com/atom/ns#' term='acordeon'/><category scheme='http://www.blogger.com/atom/ns#' term='twitterfx'/><category scheme='http://www.blogger.com/atom/ns#' term='widget'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='articulo'/><category scheme='http://www.blogger.com/atom/ns#' term='widgetfx'/><category scheme='http://www.blogger.com/atom/ns#' term='memefx'/><title type='text'>MemeFX en artículo de Sun.com</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_esUBlqKjDzk/Sfi9b5qEr7I/AAAAAAAABT0/8mxCOTkRWZQ/s1600-h/Javafx-logo.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 196px; height: 91px;" src="http://2.bp.blogspot.com/_esUBlqKjDzk/Sfi9b5qEr7I/AAAAAAAABT0/8mxCOTkRWZQ/s200/Javafx-logo.png" alt="" id="BLOGGER_PHOTO_ID_5330218446024388530" border="0" /&gt;&lt;/a&gt;Los articulistas de Sun seleccionaron 3 proyectos JavaFX para mostrar lo que la comunidad está desarrollando con el nuevo lenguaje. Uno de los desarrollos seleccionados fue mi proyecto de código abierto &lt;a href="http://code.google.com/p/memefx/"&gt;MemeFX&lt;/a&gt; :D&lt;br /&gt;&lt;br /&gt;.... ¡está bien!, no es lo mismo que aparecer en la portada del Times jajaja.... pero no deja de ser bueno para el ego hacer algo que para otros puede resultar interesante... ;D ... así que me disculpan que me sienta un poco más "importante" que ayer jajajaja... ;D&lt;br /&gt;&lt;br /&gt;Bueno, el artículo incluye otro dos proyectos bastante buenos. Un cliente para Twitter, desarrollado en JavaFX y una aplicación de Widgets para el escritorio (similar al Windows Sidebar de Vista).&lt;br /&gt;&lt;br /&gt;Por cierto, el autor de TwitterFX me contacto para agradecer por el componente &lt;a href="http://code.google.com/p/memefx/wiki/txthtmlIntro"&gt;TextHTML&lt;/a&gt;, porque hasta ahora el no habia podido desarrollar uno ni había otro en existencia en la internet, así que por lo menos el proyecto de componentes que estoy desarrollando comienza a ser UTIL -de verdad y no sólo una curiosidad técnica- que es lo que realmente importa.&lt;br /&gt;&lt;br /&gt;Aquí está el link al artículo en java.sun.com:&lt;br /&gt;&lt;br /&gt;&lt;a style="color: rgb(255, 255, 0);" href="http://java.sun.com/developer/technicalArticles/javafx/AppORama/index.html"&gt;http://java.sun.com/developer/technicalArticles/javafx/AppORama/index.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-6253263894097264288?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/6253263894097264288/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=6253263894097264288' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/6253263894097264288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/6253263894097264288'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/04/memefx-en-articulo-de-suncom.html' title='MemeFX en artículo de Sun.com'/><author><name>Mauro</name><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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_esUBlqKjDzk/Sfi9b5qEr7I/AAAAAAAABT0/8mxCOTkRWZQ/s72-c/Javafx-logo.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-114930265400628746.post-1546641905866068762</id><published>2009-04-24T13:55:00.000-07:00</published><updated>2009-04-24T14:02:59.826-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='como'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='incrustar'/><category scheme='http://www.blogger.com/atom/ns#' term='text'/><category scheme='http://www.blogger.com/atom/ns#' term='demo'/><category scheme='http://www.blogger.com/atom/ns#' term='incluir'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='enlaces'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='texthtml'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='demostracion'/><category scheme='http://www.blogger.com/atom/ns#' term='links'/><title type='text'>Demo de TextHTML (componente de memeFX)</title><content type='html'>Aquí hay una pequeña demo del componente TextHTML en acción. Incluido el uso de LINKS en los textos de una aplicación JavaFX. También pueden ver &lt;span style="font-size:130%;"&gt;&lt;a style="font-weight: bold; color: rgb(255, 255, 0);" href="http://javafxdemo.appspot.com/jfx/HTMLTest.jnlp"&gt;AQUI&lt;/a&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt; una demo Java Web Start.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/fluBIC_TXBQ&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/fluBIC_TXBQ&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;La biblioteca &lt;span style="font-size:130%;"&gt;memeFX está &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;a style="font-weight: bold; color: rgb(255, 255, 0);" href="http://code.google.com/p/memefx/"&gt;AQUI&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-1546641905866068762?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/1546641905866068762/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=1546641905866068762' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/1546641905866068762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/1546641905866068762'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/04/demo-de-texthtml-componente-de-memefx.html' title='Demo de TextHTML (componente de memeFX)'/><author><name>Mauro</name><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-114930265400628746.post-4450878295406714145</id><published>2009-04-23T13:49:00.001-07:00</published><updated>2009-04-28T14:11:06.396-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shadow'/><category scheme='http://www.blogger.com/atom/ns#' term='speed'/><category scheme='http://www.blogger.com/atom/ns#' term='velocidad'/><category scheme='http://www.blogger.com/atom/ns#' term='mejorar'/><category scheme='http://www.blogger.com/atom/ns#' term='problema'/><category scheme='http://www.blogger.com/atom/ns#' term='rendimiento'/><category scheme='http://www.blogger.com/atom/ns#' term='cache'/><category scheme='http://www.blogger.com/atom/ns#' term='gradient'/><category scheme='http://www.blogger.com/atom/ns#' term='improve'/><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='solucion'/><category scheme='http://www.blogger.com/atom/ns#' term='animation'/><category scheme='http://www.blogger.com/atom/ns#' term='solution'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>Cache:true ... otro detalle para mejorar el rendimiento gráfico</title><content type='html'>Si, por ejemplo, utilizas una figura con una gradiente -o sombra- como fondo de un área, es mejor agregar a esa figura el parámetro &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 0);"&gt;cache:true&lt;/span&gt;&lt;/span&gt;, de manera de evitar que el objeto sea re-dibujado con cada cambio que se realiza por encima de él (en el caso de una gradiente, debe volver a recalcular y redibujar cada franja de color que conforma la transición entre los colores... lo que resulta sumamente "caro" en términos de procesamiento).&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/5KdbW4FKOrg&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/5KdbW4FKOrg&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-style: italic;"&gt;El código al pie del artículo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Al agregar &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 0);"&gt;cache:true&lt;/span&gt;&lt;/span&gt; se le indica al sistema que debe generar la imagen &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;una vez&lt;/span&gt; y guardarla en cache, de esta menera, cuando se realiza un cambio sobre ella, sólo recupera la imagen desde una copia almacenada en memoria (como bytes) y pinta los cambios encima, lo que resulta sumamente rápido y menos "costoso" en ciclos de procesamiento.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En todo caso, &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;no debes utilizar cache:true cuando la imagen va a cambiar con frecuencia&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, porque esto sólo producirá que sea re-generada con cada cambio, pero además almacenada, lo que da por resultado un proceso mucho más "costoso". El cache:true debe ser utilizado en imágenes que NO cambian frecuentemente.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import javafx.stage.Stage;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import javafx.scene.Scene;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import javafx.scene.shape.Rectangle;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import javafx.scene.paint.Color;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import javafx.scene.paint.LinearGradient;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import javafx.scene.paint.Stop;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import javafx.animation.Timeline;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import javafx.animation.KeyFrame;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import javafx.scene.effect.DropShadow;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var px:Number;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var py:Number;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;Timeline {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    repeatCount: Timeline.INDEFINITE&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    autoReverse:true&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    keyFrames : [&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        KeyFrame {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            time : 0s&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            values: [px=&amp;gt;100, py=&amp;gt;100]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        KeyFrame {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            time : 3s&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            canSkip : true&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            values: [px=&amp;gt;1180, py=&amp;gt;680]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    ]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;}.play();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var angle:Number;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;Timeline {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    repeatCount: Timeline.INDEFINITE&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    autoReverse:true&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    keyFrames : [&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        KeyFrame {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            time : 0s&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            values: [angle=&amp;gt;0]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        KeyFrame {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            time : 1.5s&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            canSkip : true&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            values: [angle=&amp;gt;360]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    ]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;}.play();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;Stage {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    title: "Application title"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    width: 1024&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    height: 768&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    scene: Scene {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        content: [&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            Rectangle {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                &lt;span style="font-weight: bold; color: rgb(51, 255, 255);font-size:180%;" &gt;cache:true&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                x: 0, y: 0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                width: 1280, height: 768&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                fill: &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;LinearGradient&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                    startX : 0.0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                    startY : 0.0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                    endX : 1.0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                    endY : 0.0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                    stops: [&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                        Stop {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                            color : Color.BLACK&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                            offset: 0.0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                        },&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                        Stop {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                            color : Color.BLUE&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                            offset: 1.0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                        },&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                    ]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                effect: &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;DropShadow&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;{ offsetX:10, offsetY:10 }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            Rectangle {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                x: bind px, y: bind py&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                width: 200, height: 200&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                fill: Color.RED&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                rotate: bind angle&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        ]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-4450878295406714145?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/4450878295406714145/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=4450878295406714145' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/4450878295406714145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/4450878295406714145'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/04/cachetrue-otro-detalle-para-mejorar-el.html' title='Cache:true ... otro detalle para mejorar el rendimiento gráfico'/><author><name>Mauro</name><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-114930265400628746.post-7373129920929682814</id><published>2009-04-20T11:35:00.000-07:00</published><updated>2009-04-24T18:06:07.884-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='text'/><category scheme='http://www.blogger.com/atom/ns#' term='library'/><category scheme='http://www.blogger.com/atom/ns#' term='texthtml'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='memefx'/><category scheme='http://www.blogger.com/atom/ns#' term='biblioteca'/><title type='text'>HTML en JavaFX</title><content type='html'>&lt;span style="color: rgb(255, 255, 0);font-size:130%;" &gt;&lt;span style="font-weight: bold;"&gt;Componente TextHTML&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ya está disponible el componente TextHTML en la biblioteca &lt;a href="http://code.google.com/p/memefx/"&gt;memeFX&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Este control -aunque básico- permite incluir contenido mucho mas rico que el permitido por el componente Text, standard en JavaFX.&lt;br /&gt;&lt;br /&gt;Por ahora, básicamente permite cambiar los fonts (fuentes), color del texto, la alineación de parrafos, agregar LIKS (enlaces) e incluir algunos caracteres especiales (&amp;lt; &amp;gt; €   etc). Para más información visita el sitio del proyecto y mira la documentación.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_esUBlqKjDzk/SezBB6FNeTI/AAAAAAAABPk/YlXvMm3SYU8/s1600-h/texthtml.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 335px; height: 166px;" src="http://3.bp.blogspot.com/_esUBlqKjDzk/SezBB6FNeTI/AAAAAAAABPk/YlXvMm3SYU8/s400/texthtml.png" alt="" id="BLOGGER_PHOTO_ID_5326844697787595058" border="0" /&gt;&lt;/a&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;TextHTML {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    x: 20, y: 20, wrappingWidth:300&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    content:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        "&amp;lt;p align=justify&amp;gt;&amp;lt;font size=24 color=#ffff00&amp;gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        "Easter Island&amp;lt;/font&amp;gt; &amp;lt;i&amp;gt;(Rapa Nui)&amp;lt;/i&amp;gt; is a "&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        "Polynesian island in the southeastern &amp;lt;font "&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        "size=24 face=Verdana color=#ff5555&amp;gt;Pacific "&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        "Ocean&amp;lt;/font&amp;gt;. The island is a &amp;lt;font face="&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        "TimesRoman size=24  color=#55ffff&amp;gt;&amp;lt;a href="&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        "algo&amp;gt;special&amp;lt;/a&amp;gt; &amp;lt;i&amp;gt;territory&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; of "&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        "&amp;lt;a href=Chile&amp;gt;Chile&amp;lt;/a&amp;gt;. Easter Island is "&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        "famous for its monumental statues, called "&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        "&amp;lt;font color=#00ff00 size=18&amp;gt;moai.&amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    onLinkPressed: function(link) { println(link) }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;};&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;En el futuro espero incluir imágenes y algun tipo de control sobre ellas (alineación de las imágenes, eventos como mouseOver, etc).&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);font-size:130%;" &gt;&lt;span style="font-weight: bold;"&gt;HTML en ImagesAccordion&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El componente ImagesAccordion ahora incluye el componente TextHTML para las descripciones extensas de las imágenes.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;&lt;a href="http://javafxdemo.appspot.com/jfx/imgFX.jnlp"&gt;CLICK AQUI&lt;/a&gt; para lanzar un demo Java Web Start&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://javafxdemo.appspot.com/jfx/imgFX.jnlp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 203px;" src="http://3.bp.blogspot.com/_esUBlqKjDzk/SezC6SCvV7I/AAAAAAAABPs/_r6dfSaVfXU/s400/accordhtml.jpg" alt="" id="BLOGGER_PHOTO_ID_5326846765803984818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a style="color: rgb(255, 255, 0);" href="http://code.google.com/p/memefx/"&gt;http://code.google.com/p/memefx/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-7373129920929682814?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/7373129920929682814/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=7373129920929682814' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/7373129920929682814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/7373129920929682814'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/04/texthtml-en-memefx.html' title='HTML en JavaFX'/><author><name>Mauro</name><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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_esUBlqKjDzk/SezBB6FNeTI/AAAAAAAABPk/YlXvMm3SYU8/s72-c/texthtml.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-114930265400628746.post-2507833770361886430</id><published>2009-04-18T00:10:00.000-07:00</published><updated>2009-04-18T00:21:34.592-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mejora'/><category scheme='http://www.blogger.com/atom/ns#' term='como'/><category scheme='http://www.blogger.com/atom/ns#' term='configuracion'/><category scheme='http://www.blogger.com/atom/ns#' term='velocidad'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='mejorar'/><category scheme='http://www.blogger.com/atom/ns#' term='jws'/><category scheme='http://www.blogger.com/atom/ns#' term='rendimiento'/><category scheme='http://www.blogger.com/atom/ns#' term='mas'/><category scheme='http://www.blogger.com/atom/ns#' term='jnlp'/><category scheme='http://www.blogger.com/atom/ns#' term='partida'/><category scheme='http://www.blogger.com/atom/ns#' term='performace'/><category scheme='http://www.blogger.com/atom/ns#' term='java web start'/><category scheme='http://www.blogger.com/atom/ns#' term='truco'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='trick'/><title type='text'>Como mejorar la partida de Java Web Start</title><content type='html'>Aquí hay un truco para mejorar la velocidad de partida de las aplicaciones JavaFX Web Start.&lt;br /&gt;&lt;br /&gt;Todo lo que necesitas hacer es agregar una linea a tus archivos JNLP.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;&amp;lt;update check="background"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;El elemento update se usa para indicar la preferencia sobre como Java Web Start maneja las actualizaciones. El elemento update puede contener los siguientes atributos opcionales:&lt;br /&gt;&lt;br /&gt;Atributo check: El atributo check indica la preferencia sobre cuando el cliente JNLP debe chequear por actualizaciones, y puede tener uno de los siguientes tres valores:&lt;br /&gt;&lt;br /&gt;1. "&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;always&lt;/span&gt;": Siempre chequea por actualizaciones antes de lanzar la aplicación.&lt;br /&gt;2. "&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;timeout&lt;/span&gt;" &lt;span style="font-style: italic;"&gt;(default)&lt;/span&gt;: Chequea por actualizaciones hasta alcanzar un umbral de tiempo (timeout) antes de lanzar la aplicación. Si el chequeo de actualización no se completa antes del timeout, la aplicación es lanzada, y el chequeo de actualización continua por "atras" del proceso de la aplicación.&lt;br /&gt;3. "&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;background&lt;/span&gt;": Lanza la aplicación mientras chequea si existen actualizaciones simultaneamente, por "atras".&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;La opción 3 mejorará el tiempo de partida&lt;/span&gt; de las aplicaciones JavaFX Web Start.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-2507833770361886430?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/2507833770361886430/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=2507833770361886430' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/2507833770361886430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/2507833770361886430'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/04/como-mejorar-la-partida-de-java-web.html' title='Como mejorar la partida de Java Web Start'/><author><name>Mauro</name><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-114930265400628746.post-7794359719869290145</id><published>2009-04-16T14:01:00.001-07:00</published><updated>2009-05-14T16:37:00.024-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='resolver'/><category scheme='http://www.blogger.com/atom/ns#' term='como'/><category scheme='http://www.blogger.com/atom/ns#' term='animaciones'/><category scheme='http://www.blogger.com/atom/ns#' term='por segundo'/><category scheme='http://www.blogger.com/atom/ns#' term='velocidad'/><category scheme='http://www.blogger.com/atom/ns#' term='grafica'/><category scheme='http://www.blogger.com/atom/ns#' term='animacion'/><category scheme='http://www.blogger.com/atom/ns#' term='problema'/><category scheme='http://www.blogger.com/atom/ns#' term='rendimiento'/><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='solucion'/><category scheme='http://www.blogger.com/atom/ns#' term='graphic'/><category scheme='http://www.blogger.com/atom/ns#' term='per second'/><category scheme='http://www.blogger.com/atom/ns#' term='fps'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='frames'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='grafico'/><title type='text'>Un detalle para obtener una mejor performance</title><content type='html'>Este detalle (junto con incluir canSkip:true en los timelines asociados a animaciones o transiciones gráficas de algún tipo) puede hacer una gran diferencia en la performance gráfica de JavaFX.&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/thi42Xk9AQ4&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/thi42Xk9AQ4&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Tengo un CustomNode cuyo contenido son unos nodos almacenados en una secuencia:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;public class myComponent extends CustomNode {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    var &lt;span style="color: rgb(51, 255, 51);"&gt;objs&lt;/span&gt;:Node[];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    public override function &lt;span style="color: rgb(51, 255, 255);"&gt;create&lt;/span&gt;(): Node {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        Group {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            &lt;span style="color: rgb(255, 0, 0);"&gt;content: bind &lt;span style="color: rgb(51, 255, 51);"&gt;objs&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        };&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    };&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Digamos que se necesita reemplazar con frecuencia los nodos en &lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;objs &lt;/span&gt;y que tengo una función que realiza este trabajo:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;function paint&lt;/span&gt;():Void {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;    &lt;span style="color: rgb(255, 0, 0);"&gt;delete &lt;span style="color: rgb(51, 255, 51);"&gt;objs&lt;/span&gt;&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;    for (element in someGroup) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;        ...&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;        &lt;span style="color: rgb(255, 0, 0);"&gt;insert&lt;/span&gt; newNode into &lt;span style="color: rgb(51, 255, 51);"&gt;objs&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;        ...&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Como muestra el video, eso es ineficiente. Al estar enlazado el contenido de &lt;span style="color: rgb(51, 255, 51); font-weight: bold;"&gt;objs&lt;/span&gt; con el contenido del componente e ir cambiando el contenido de &lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;objs&lt;/span&gt;, se va gatillando trabajo para refrescar el componente.&lt;br /&gt;&lt;br /&gt;Es más eficiente crear una secuencia temporal y traspasar al final todos los nodos a la secuencia asociada al componente:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;function paint&lt;/span&gt;():Void {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;    &lt;span style="color: rgb(255, 0, 0);"&gt;var tmpObjs:Node[];&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    for (element in someGroup) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        &lt;span style="color: rgb(255, 0, 0);"&gt;insert &lt;/span&gt;newNode into &lt;span style="color: rgb(255, 0, 0);"&gt;tmpObjs&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    &lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;objs &lt;/span&gt;= tmpObjs&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Habría que probar si esto también es aplicable cuando se realizan cambios a los elementos en la secuencia (y no sólo cuando estos se reemplazan). Es probable que ocurra lo mismo, porque al actualizar uno a uno los elementos, es muy probable que también se vaya gatillando trabajo parcial, mientras si se reemplaza toda la secuencia de una vez, ese trabajo debería ocurrir una sóla vez... ¿?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-7794359719869290145?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/7794359719869290145/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=7794359719869290145' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/7794359719869290145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/7794359719869290145'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/04/un-detalle-para-obtener-una-mejor.html' title='Un detalle para obtener una mejor performance'/><author><name>Mauro</name><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-114930265400628746.post-185191233501181564</id><published>2009-04-14T12:07:00.001-07:00</published><updated>2009-04-15T09:50:34.165-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='como'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='height'/><category scheme='http://www.blogger.com/atom/ns#' term='alto'/><category scheme='http://www.blogger.com/atom/ns#' term='fuentes'/><category scheme='http://www.blogger.com/atom/ns#' term='altura'/><category scheme='http://www.blogger.com/atom/ns#' term='solucion'/><category scheme='http://www.blogger.com/atom/ns#' term='truco'/><category scheme='http://www.blogger.com/atom/ns#' term='fonts'/><category scheme='http://www.blogger.com/atom/ns#' term='font'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='trucos'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='fuente'/><category scheme='http://www.blogger.com/atom/ns#' term='trick'/><title type='text'>Un "truco" para obtener el alto de un Font</title><content type='html'>Estoy construyendo un componente de texto HTML para mi librería de JavaFX, y me encontré con el siguiente problema.&lt;br /&gt;&lt;br /&gt;¿Cómo obtengo el alto de un font?&lt;br /&gt;&lt;br /&gt;No confundan el obtener el alto de un TEXT con obtener el alto de un FONT.&lt;br /&gt;&lt;br /&gt;Si uno tiene un texto y quiere obtener sus dimensiones, basta con:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var myText = Text {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    content: "Mi texto"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    ...&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(255, 255, 0);"&gt;Font {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        size:24&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        ...&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var ancho = myText.boundsInLocal.width;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var alto = myText.boundsInLocal.height;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;El asunto es que si uno pone "....." como contenido del texto, el alto es de apenas unos pixeles.&lt;br /&gt;&lt;br /&gt;Probablemente ustedes no se vayan a encontrar con este problema con mucha frecuencia, pero para el componente que estoy creando es decisivo... entonces, aquí va una solución bastante... mmm.... "simple"... pero funciona.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var myFont = Font {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;   size=24&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;   ...&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var &lt;span style="color: rgb(255, 0, 0);"&gt;tmpText &lt;/span&gt;= Text {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;   content: "&lt;span style="color: rgb(255, 0, 0);"&gt;Aj&lt;/span&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;   font: myFont&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var myText = Text {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;   content: ".........."&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;   font: myFont&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;   ...&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var &lt;span style="color: rgb(255, 0, 0);"&gt;altoFont&lt;/span&gt; = &lt;span style="color: rgb(255, 0, 0);"&gt;tmpText&lt;/span&gt;.boundsInLocal.height;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var anchoTexto = myText.boundsInLocal.width;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;No es el ideal recurrir a este tipo de "trucos", pero me pareció mejor que tener que incluir las APIs de Java para el manejo de Fonts, que si entregan todo tipo de información sobre las fuentes... espero que en próximas versiones de JavaFX la API incluya una alternativa más "elegante", es decir, que entregue directamente las medidas asociadas a las fuentes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-185191233501181564?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/185191233501181564/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=185191233501181564' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/185191233501181564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/185191233501181564'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/04/un-truco-para-obtener-el-alto-de-un.html' title='Un &quot;truco&quot; para obtener el alto de un Font'/><author><name>Mauro</name><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-114930265400628746.post-8029763975467095100</id><published>2009-04-12T01:58:00.000-07:00</published><updated>2009-04-15T09:55:14.919-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atributo'/><category scheme='http://www.blogger.com/atom/ns#' term='valores'/><category scheme='http://www.blogger.com/atom/ns#' term='deteccion'/><category scheme='http://www.blogger.com/atom/ns#' term='clases'/><category scheme='http://www.blogger.com/atom/ns#' term='on replace'/><category scheme='http://www.blogger.com/atom/ns#' term='variable'/><category scheme='http://www.blogger.com/atom/ns#' term='codigo'/><category scheme='http://www.blogger.com/atom/ns#' term='detectar'/><category scheme='http://www.blogger.com/atom/ns#' term='cambio'/><category scheme='http://www.blogger.com/atom/ns#' term='reemplazo'/><category scheme='http://www.blogger.com/atom/ns#' term='valor'/><title type='text'>"On Replace" no es "On Modify"...</title><content type='html'>No tengo claro si hay alguna manera de hacer que "on replace" se dispare al modificar una variable de una clase definida por el usuario (supongo que no, porque se llamaría ON MODIFY). Al parecer es necesario recrear el objeto y asignarlo a la variable para que "on replace" detecte el cambio.&lt;br /&gt;&lt;br /&gt;Digamos que defino una clase:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;public class Data {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    public var attrib1:Number=0.0;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    public var attrib2:String="";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Luego, creo una instancia de la clase:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var data1:Data = Data {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    attrib1: 1.2,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    attrib2: "Mauricio"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;} on replace {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    println("{data1.attrib1} {data1.attrib2}");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;data1.attrib2="Omar";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;data1.attrib2="Veronica";&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;La salida de este ejemplo es:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;1.2 Mauricio&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Es decir, al asignar "Omar" o "Veronica" a attrib2, el bloque "on replace" de data1 no se dispara.&lt;br /&gt;&lt;br /&gt;La única manera (que conozco) de evitar esto es asignar una nueva instancia del objeto a data1:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;data1= Data { attrib1:data1.attrib1 attrib2:"Omar"};&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Quizás haya alguna forma de declarar la variable con algún tipo de binding o algo por el estilo que permita detectar los cambios de variables dentro de una instancia.&lt;br /&gt;&lt;br /&gt;Por ahora, vale la pena tener este detalle presente para evitar problemas y pérdidas de tiempo... si uno no lo sabe, puede no ser evidente que esa parte del código no se está ejecutando y hay un bug en el código.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-8029763975467095100?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/8029763975467095100/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=8029763975467095100' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/8029763975467095100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/8029763975467095100'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/04/cuando-on-replace-no-funciona.html' title='&quot;On Replace&quot; no es &quot;On Modify&quot;...'/><author><name>Mauro</name><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-114930265400628746.post-889681364549118069</id><published>2009-04-12T01:20:00.000-07:00</published><updated>2009-04-12T02:12:48.994-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='previo'/><category scheme='http://www.blogger.com/atom/ns#' term='valores'/><category scheme='http://www.blogger.com/atom/ns#' term='sequence'/><category scheme='http://www.blogger.com/atom/ns#' term='variable'/><category scheme='http://www.blogger.com/atom/ns#' term='modificacion'/><category scheme='http://www.blogger.com/atom/ns#' term='variables'/><category scheme='http://www.blogger.com/atom/ns#' term='oldvalue'/><category scheme='http://www.blogger.com/atom/ns#' term='on replace'/><category scheme='http://www.blogger.com/atom/ns#' term='secuencias'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='replace'/><category scheme='http://www.blogger.com/atom/ns#' term='cambio'/><category scheme='http://www.blogger.com/atom/ns#' term='valor'/><title type='text'>"On Replace" aplicado a secuencias</title><content type='html'>La clausula "on replace", si está presente al momento de definir una variable, causa que el bloque de código sea ejecutado cada vez que el valor de la variable cambia -- incluyendo la asignación inicial de su valor.&lt;br /&gt;&lt;br /&gt;Los parametros opcionales proveen información sobre qué cambió: &lt;span style="color: rgb(255, 0, 0);"&gt;on replace oldValue [ firstIndex .. lastIndex ] = newElements { ... }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Todos estos parámetros son opcionales, y en la más simple de las formas, ninguno está presente:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var x = 0 on replace { println("x is ahora: {x}") }&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;El parámetro "oldValue" provee el valor previo de la variable.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var x = 0 on replace oldValue { &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    println("x was {oldValue} and is now: {x}") }&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Los parámetros remanentes son utiles con las secuencias.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var seq = ['A', 'B', 'C', 'D', 'E', 'F'] &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    on replace oldValue[firstIdx .. lastIdx] = &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    newElements { println(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        "reemplazo {oldValue}[{firstIdx}..{lastIdx}]"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        " por {newElements} produciendo {seq}") &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;} &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;seq[3] = '$'; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;insert '#' into seq; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;delete '$' from seq; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;delete seq[2]; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;seq[1..4] = ['X', 'Y']; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;delete seq; &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Lo que produce está salida:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;replaced [0..-1] by ABCDEF yielding ABCDEF&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;replaced ABCDEF[3..3] by $ yielding ABC$EF&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;replaced ABC$EF[6..5] by # yielding ABC$EF#&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;replaced ABC$EF#[3..3] by  yielding ABCEF#&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;replaced ABCEF#[2..2] by  yielding ABEF#&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;replaced ABEF#[1..4] by XY yielding AXY&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;replaced AXY[0..2] by  yielding&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Nota que &lt;span style="color: rgb(255, 0, 0);"&gt;firstIndex&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;lastIndex &lt;/span&gt;and &lt;span style="color: rgb(255, 0, 0);"&gt;newElements &lt;/span&gt;se refieren únicamente a la porción que la secuencia que cambió.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-889681364549118069?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/889681364549118069/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=889681364549118069' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/889681364549118069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/889681364549118069'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/04/on-replace-y-on-replace-aplicado.html' title='&quot;On Replace&quot; aplicado a secuencias'/><author><name>Mauro</name><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-114930265400628746.post-2290601554678535943</id><published>2009-04-07T10:35:00.000-07:00</published><updated>2009-04-15T10:04:15.696-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='statement'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='termino'/><category scheme='http://www.blogger.com/atom/ns#' term='como'/><category scheme='http://www.blogger.com/atom/ns#' term='problema'/><category scheme='http://www.blogger.com/atom/ns#' term='error'/><category scheme='http://www.blogger.com/atom/ns#' term='conflicto'/><category scheme='http://www.blogger.com/atom/ns#' term='delete'/><category scheme='http://www.blogger.com/atom/ns#' term='compilacion'/><category scheme='http://www.blogger.com/atom/ns#' term='evitar'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='reservada'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='compilador'/><category scheme='http://www.blogger.com/atom/ns#' term='insert'/><title type='text'>Cómo compilar clases Java en JavaFX, que contienen delete o insert</title><content type='html'>Como saben, los términos "insert" y "delete" están reservados por JavaFX para insertar y borrar elementos en las secuencias. Esto puede producir un inconveniente cuando uno incluye dentro de un proyecto JavaFX una clase Java donde se utiliza llamadas a métodos denominados "insert" o "delete".&lt;br /&gt;&lt;br /&gt;Esto ocurre, por ejemplo, si se utiliza "delete" para borrar un archivo. El compilador muestra el siguiente error:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;font-size:100%;" &gt;Sorry, I was trying to understand an expression&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;font-size:100%;" &gt;but I got confused when I saw 'delete' which is a keyword.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;font-size:100%;" &gt;new java.io.File("temp").delete();&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;font-size:100%;" &gt;                         ^&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;La solución es simple, sólo hay que incluir el término entre &lt;&lt; ... &gt;&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;font-size:100%;" &gt;new java.io.File("temp").&lt;span style="color: rgb(255, 0, 0);font-size:130%;" &gt;&amp;lt;&amp;lt;delete&amp;gt;&amp;gt;&lt;/span&gt;();&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Lo interesante es que esta sintaxis permite utilizar cualquier texto como un identificador:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;font-size:100%;" &gt;def &amp;lt;&amp;lt;english&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;font-size:100%;" &gt;      variable&amp;gt;&amp;gt; = "cualquier simbolo sirve como identificador";&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;font-size:100%;" &gt;def &amp;lt;&amp;lt;русская переменная&amp;gt;&amp;gt; = &amp;lt;&amp;lt;english&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;font-size:100%;" &gt;      variable&amp;gt;&amp;gt;;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;font-size:100%;" &gt;println(&amp;lt;&amp;lt;русская переменная&amp;gt;&amp;gt;);&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;La salida del script es:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;cualquier simbolo sirve como identificador&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Noten que el identificador "english variable" incluso incluye un salto de línea (CR/LF).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-2290601554678535943?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/2290601554678535943/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=2290601554678535943' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/2290601554678535943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/2290601554678535943'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/04/como-compilar-clases-java-en-javafx-que.html' title='Cómo compilar clases Java en JavaFX, que contienen delete o insert'/><author><name>Mauro</name><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-114930265400628746.post-552594727166975719</id><published>2009-03-30T23:41:00.000-07:00</published><updated>2009-03-30T23:56:27.394-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='como'/><category scheme='http://www.blogger.com/atom/ns#' term='flick'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='problema'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><category scheme='http://www.blogger.com/atom/ns#' term='deferaction'/><category scheme='http://www.blogger.com/atom/ns#' term='pestañeo'/><category scheme='http://www.blogger.com/atom/ns#' term='flicker'/><category scheme='http://www.blogger.com/atom/ns#' term='evitar'/><category scheme='http://www.blogger.com/atom/ns#' term='workaround'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='avoid'/><title type='text'>Usando FX.deferAction()</title><content type='html'>Al desarrollar el componente de acordeón de imágenes, se producía un "pestañeo extraño" al momento de solicitar a los elementos que actualizaran su posición. Le dí algunas vueltas al código hasta comprobar que: no era resultado de algo producido por un error en el código, sino por algo relacionado con el refresco de la pantalla (o algo por el estilo ¿?).&lt;br /&gt;&lt;br /&gt;Así que recurrí un poco al instinto y a la memoria... y... recorde haber leido algo sobre deferAction. Así que incluí el código que solicita el ajuste de posición, dentro de la llamada de esta función y el problema terminó:&lt;br /&gt;&lt;br /&gt;El siguiente código:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;public-read var active: Integer on replace {       &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;    for (item in pictures) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;        item.adjust();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;    };&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Pasó a ser este:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;public-read var active: Integer on replace {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    &lt;span style="color: rgb(255, 0, 0);"&gt;FX.deferAction&lt;/span&gt;(function():Void {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        for (item in pictures) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            item.adjust();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        };&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    });&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Sólo anidé el &lt;span style="font-style: italic; font-weight: bold;"&gt;for&lt;/span&gt; dentro de &lt;span style="font-style: italic; font-weight: bold;"&gt;FX.deferAction(function():Void { ... });&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sí descargan la biblioteca memeFX y quitan el FX.deferAction en ImagesAccordion.fx, quizás puedan ver el problema que me llevó a esta solución (no sé si el problema sea reproducible en otras máquinas). Tampoco me quedó claro que produce el problema ni por qué lo resuelve deferAction, voy a buscar información al respecto. Por ahora, sólo comparto el "tip" en caso que alguien tenga un problema similar.&lt;br /&gt;&lt;br /&gt;&lt;a style="color: rgb(255, 255, 0);" href="http://code.google.com/p/memefx/"&gt;http://code.google.com/p/memefx/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-552594727166975719?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/552594727166975719/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=552594727166975719' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/552594727166975719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/552594727166975719'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/03/usando-fxdeferaction.html' title='Usando FX.deferAction()'/><author><name>Mauro</name><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-114930265400628746.post-6629560839745979310</id><published>2009-03-29T10:20:00.000-07:00</published><updated>2009-03-30T23:39:36.672-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='efectos'/><category scheme='http://www.blogger.com/atom/ns#' term='jafax'/><category scheme='http://www.blogger.com/atom/ns#' term='animation'/><category scheme='http://www.blogger.com/atom/ns#' term='animaciones'/><category scheme='http://www.blogger.com/atom/ns#' term='canskip'/><category scheme='http://www.blogger.com/atom/ns#' term='timelines'/><category scheme='http://www.blogger.com/atom/ns#' term='timeline'/><category scheme='http://www.blogger.com/atom/ns#' term='animacion'/><category scheme='http://www.blogger.com/atom/ns#' term='keyframe'/><category scheme='http://www.blogger.com/atom/ns#' term='effect'/><category scheme='http://www.blogger.com/atom/ns#' term='effects'/><category scheme='http://www.blogger.com/atom/ns#' term='efecto'/><title type='text'>Por qué incluir canSkip:true en los timelines</title><content type='html'>Este video muestra la diferencia en el rendimiento de las animaciones gráficas con y sin canSkip:true. Es recomendable incluir este parametro en los KeyFrame que alteran valores (values:) asociados a animaciones y efectos (cambio de posiciones, variación de sombras, difuminado, etc... cualquier efecto o movimiento gradual).&lt;br /&gt;&lt;br /&gt;Una persona del grupo JavafxProgramming creo una aplicación Flex que luego replicó en JavaFX. Su problema era el rendimiento de JavaFX, que hacia su aplicación inutilizable. Pidió consejos al foro, pero nada funcionó... hasta que incluyó el canSkip:true en los timelines... recién ahí la aplicación funcionó como debía.&lt;br /&gt;&lt;br /&gt;Quizás sería bueno que Sun incluyera el canSkip con true como valor por defecto. Esto puede terminar desprestigiando la plataforma.&lt;br /&gt;&lt;br /&gt;En todo caso, sería bueno que todos comparta este detalle o lo tengan muy presente al momento de usar los timelines o de tener problemas con el rendimiento.&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/DCD6HdP1hxQ&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/DCD6HdP1hxQ&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-6629560839745979310?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/6629560839745979310/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=6629560839745979310' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/6629560839745979310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/6629560839745979310'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/03/por-que-incluir-canskiptrue-en-los.html' title='Por qué incluir canSkip:true en los timelines'/><author><name>Mauro</name><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-114930265400628746.post-3995394216594322060</id><published>2009-03-22T11:59:00.000-07:00</published><updated>2009-03-22T12:04:20.854-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='horizontal'/><category scheme='http://www.blogger.com/atom/ns#' term='orientation'/><category scheme='http://www.blogger.com/atom/ns#' term='componente'/><category scheme='http://www.blogger.com/atom/ns#' term='images'/><category scheme='http://www.blogger.com/atom/ns#' term='orientacion'/><category scheme='http://www.blogger.com/atom/ns#' term='imagenes'/><category scheme='http://www.blogger.com/atom/ns#' term='component'/><category scheme='http://www.blogger.com/atom/ns#' term='components'/><category scheme='http://www.blogger.com/atom/ns#' term='menu'/><category scheme='http://www.blogger.com/atom/ns#' term='componentes'/><category scheme='http://www.blogger.com/atom/ns#' term='vertical'/><category scheme='http://www.blogger.com/atom/ns#' term='acordeon'/><category scheme='http://www.blogger.com/atom/ns#' term='accordion'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>memeFX 0.2.2 : ImagesAccordion con ORIENTACION</title><content type='html'>Ahora se puede cambiar la orientación del componente de "acordeón", para que las imágenes se desplacen horizontal o verticalmente. Basta con incluir en la definición del componente, un:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;orientation: ImagesAccordion.VERTICAL&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;para que las imágenes se muevan verticalmente.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/46aCTtgmOmk&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/46aCTtgmOmk&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-3995394216594322060?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/3995394216594322060/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=3995394216594322060' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/3995394216594322060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/3995394216594322060'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/03/memefx-022-imagesaccordion-con.html' title='memeFX 0.2.2 : ImagesAccordion con ORIENTACION'/><author><name>Mauro</name><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-114930265400628746.post-3779659195608807913</id><published>2009-03-20T12:02:00.000-07:00</published><updated>2009-03-20T13:44:56.210-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='construir'/><category scheme='http://www.blogger.com/atom/ns#' term='juego'/><category scheme='http://www.blogger.com/atom/ns#' term='java me'/><category scheme='http://www.blogger.com/atom/ns#' term='create'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='juegos'/><category scheme='http://www.blogger.com/atom/ns#' term='javame'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><category scheme='http://www.blogger.com/atom/ns#' term='crear'/><category scheme='http://www.blogger.com/atom/ns#' term='example'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='netbeans'/><category scheme='http://www.blogger.com/atom/ns#' term='movil'/><category scheme='http://www.blogger.com/atom/ns#' term='maze'/><category scheme='http://www.blogger.com/atom/ns#' term='builder'/><title type='text'>Como crear juegos para móvil con Netbeans 6.5</title><content type='html'>Realmente, es increible lo fácil que resulta crear un juego para teléfono con Netbeans 6.5. De hecho, este tutorial demuestra como crear uno en ¡10 minutos! Vale la pena verlo y tenerlo en cuenta.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Blogger no me permite incrustar el video aquí, así que ahí les va el enlance (se ve mejor a pantalla completa): &lt;a href="http://www.netbeans.tv/screencasts/Creating-Mobile-Games-in-NetBeans-441/"&gt;CLICK AQUI&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://developers.sun.com/events/techdays/downloads/pdfs/6400_MobileGame_labdoc.pdf"&gt;Crea tu propio juego para móvil. Hands on Lab6400 (pdf)&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://developers.sun.com/events/techdays/downloads/labs/6400_mobilegame.zip"&gt;Mobile Game Project.zip&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://wiki.netbeans.org/CreatingJavaMEGamesWithGameBuilder"&gt;Guía para el GameBuilder de Netbeans&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-3779659195608807913?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/3779659195608807913/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=3779659195608807913' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/3779659195608807913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/3779659195608807913'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/03/como-crear-juegos-para-movil-con.html' title='Como crear juegos para móvil con Netbeans 6.5'/><author><name>Mauro</name><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-114930265400628746.post-8974354025228502226</id><published>2009-03-20T10:26:00.000-07:00</published><updated>2009-03-21T18:08:43.840-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='componente'/><category scheme='http://www.blogger.com/atom/ns#' term='library'/><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='acordeon'/><category scheme='http://www.blogger.com/atom/ns#' term='accordion'/><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='components'/><category scheme='http://www.blogger.com/atom/ns#' term='component'/><category scheme='http://www.blogger.com/atom/ns#' term='componentes'/><category scheme='http://www.blogger.com/atom/ns#' term='biblioteca'/><title type='text'>memeFX v0.2</title><content type='html'>Ya está disponible la librería incluyendo una versión final de "acordeón de imágenes". La verdad que tiene muchas opciones para personalizar el componente. Además, permite enlazar algunas acciones del usuario con funciones.&lt;br /&gt;&lt;br /&gt;Asi, por ejemplo, se podría hacer el que componente comience a tocar un MP3 distinto al pasar el mouse sobre los distintos elementos del "acordeón", y que muestre detalles sobre la música si se hace click sobre ese elemento. Pudiendo además dejar de tocar al abandonar el "acordeón" (al sacar el mouse de encima).&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Proyecto memeFX y descarga código fuente, &lt;/span&gt;&lt;a style="color: rgb(255, 0, 0);" href="http://code.google.com/p/memefx/"&gt;CLICK AQUI&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Demo Java Web Start del ImageAccordion, &lt;/span&gt;&lt;a style="font-weight: bold; color: rgb(255, 0, 0);" href="http://javafxdemo.appspot.com/jfx/imgFX.jnlp"&gt;CLICK AQUI&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Esto me dio la idea de hacer una variación que permita crear un "acordeón de formulario", es decir, que haya varios formularios con campos, botones, etc. Y que uno pueda pasar de uno a otro igual que en el acordeón de imágenes. Voy a darle vueltas y veré que resulta.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/46aCTtgmOmk&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/46aCTtgmOmk&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-8974354025228502226?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/8974354025228502226/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=8974354025228502226' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/8974354025228502226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/8974354025228502226'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/03/memefx-v02.html' title='memeFX v0.2'/><author><name>Mauro</name><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-114930265400628746.post-8831859665532443331</id><published>2009-03-19T11:40:00.001-07:00</published><updated>2009-03-19T12:09:46.168-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='binding'/><category scheme='http://www.blogger.com/atom/ns#' term='variable'/><category scheme='http://www.blogger.com/atom/ns#' term='duration'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><category scheme='http://www.blogger.com/atom/ns#' term='variables'/><category scheme='http://www.blogger.com/atom/ns#' term='timeline'/><category scheme='http://www.blogger.com/atom/ns#' term='bind'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='at'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='keyframe'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><category scheme='http://www.blogger.com/atom/ns#' term='duracion'/><title type='text'>Timelines de duración variable y el at(..)</title><content type='html'>Uno de los inconvenientes de trabajar en un ambientea tan nuevo como el JavaFX script, es que no abundan las fuentes de información.&lt;br /&gt;&lt;br /&gt;Una de las cosas que no tenía claras (seguramente porque no investigué lo suficiente, o no miré mejor los ejemplos), era cómo se hace que un timeline tenga duración variable.&lt;br /&gt;&lt;br /&gt;Bueno, ahora descubrí que diablos es el at(..) en los timeline y cómo se hace para que la duración sea variable.&lt;br /&gt;&lt;br /&gt;Primera cosa, cuando uno usa at(), en realidad está usando una "abreviatura" en la manera de definir un timeline. La idea es que sólo sea una opción breve para escribir el código, pero por lo mismo, no es la forma más "potente".&lt;br /&gt;&lt;br /&gt;Tomemos este ejemplo:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;var x:Number;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;Timeline {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;    repeatCount: 1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;    keyFrames: [&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;        at (0s) { x =&amp;gt; 0.0}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;        at (3s) { x =&amp;gt; 100.0}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;    ]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;}.play();&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;En él, definimos una variable x, que al segundo 0s -de iniciado el timeline- asume un valor de 0.0, luego, x asumirá gradualmente los valores entre 0.0 y 100.0, alcanzando el máximo valor (100.0) en 3s segundos.&lt;br /&gt;&lt;br /&gt;El asunto que me faltaba comprender era... ¿como cambiaba el tiempo en at(3s)?, porque no acepta ni variables ni bind dentro de los paréntesis.&lt;br /&gt;&lt;br /&gt;Pues resulta que con at(..) no lo vas a conseguir (por lo menos eso entiendo en este momento), la forma correcta y potente de usar las lineas de tiempo es esta:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;var dur=3s;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;var x:Number;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;Timeline {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;    repeatCount: 1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;    keyFrames : [&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;        KeyFrame {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;            time : 0s&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;            values: [x=&amp;gt;0]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;        },&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;        KeyFrame {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;            time: bind dur&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;            values: [x=&amp;gt;100]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;    ]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;}.play();&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;De hecho, esta forma de definir un timeline permite anidar timelines o agregar un action: en cada KeyFrame, de manera que una acción sea ejecutada cada vez que una etapa de la animación o transición se completa.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;var dur=3s;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;var dur2=5s;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;var x:Number;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;Timeline {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    repeatCount: 1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    keyFrames : [&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        KeyFrame {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            time : 0s&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            values: [x=&amp;gt;0]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        KeyFrame {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            time: bind dur&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            canSkip: true&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            values: [x=&amp;gt;50]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            action: function() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                println("completo etapa 1");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            };&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        KeyFrame {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            time: bind dur2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            canSkip: true&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            values: [x=&amp;gt;200]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            action: function() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                println("completo etapa 2");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            };&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    ]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;}.play();&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-8831859665532443331?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/8831859665532443331/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=8831859665532443331' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/8831859665532443331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/8831859665532443331'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/03/timelines-de-duracion-variable-y-el-at.html' title='Timelines de duración variable y el at(..)'/><author><name>Mauro</name><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-114930265400628746.post-6111436692717285851</id><published>2009-03-18T06:16:00.001-07:00</published><updated>2009-03-18T11:28:34.283-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='componente'/><category scheme='http://www.blogger.com/atom/ns#' term='images'/><category scheme='http://www.blogger.com/atom/ns#' term='free'/><category scheme='http://www.blogger.com/atom/ns#' term='open source code'/><category scheme='http://www.blogger.com/atom/ns#' term='imagenes'/><category scheme='http://www.blogger.com/atom/ns#' term='component'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='control'/><category scheme='http://www.blogger.com/atom/ns#' term='acordeon'/><category scheme='http://www.blogger.com/atom/ns#' term='demo'/><category scheme='http://www.blogger.com/atom/ns#' term='accordion'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>Un "acordeón" de imágenes</title><content type='html'>Este componente aun no está terminado, pero ya lo pueden probar usando el link de más abajo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Lanzar demo Java Web Start, &lt;/span&gt;&lt;a style="font-weight: bold; color: rgb(255, 0, 0);" href="http://javafxdemo.appspot.com/jfx/imgFX.jnlp"&gt;CLICK AQUI&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Código fuente componente y demo, &lt;/span&gt;&lt;a style="font-weight: bold; color: rgb(255, 0, 0);" href="http://code.google.com/p/memefx/"&gt;CLICK AQUI&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/lq7laz78PDs&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/lq7laz78PDs&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;El código para crear un "Acordeón de imágenes" es el siguiente:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;var accordion = ImagesAccordion{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    width: 650,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    height: 350, &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    lineWidth: 1.0,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    lineColor: Color.WHITE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    images: [&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        ImageItem {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            id: "moais",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            caption: "Moais"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            image: Image { url: "{__DIR__}moais.jpg"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            message: "Easter Island (Rapa Nui) is a Polynesian island in the "&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                     "southeastern Pacific Ocean, The island is a special "&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                     "territory of Chile. Easter Island is famous  for its "&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                     "monumental statues, called moai."&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            messageArea: Rectangle2D {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                minX: 30,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                minY: 253,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                width: 350,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                height: 87&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            call: click&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        ImageItem {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            id: "anakena",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            caption: "Anakena"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            image: Image { url: "{__DIR__}anakena.jpg"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            message: "‘Anakena is a white coral sand beach in Rapa Nui..."&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            messageArea: Rectangle2D {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                minX: 20,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                minY: 233,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                width: 360,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                height: 107&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            messageFont: Font { size: 12&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            call: click&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        ImageItem {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            id: "glacier",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            caption: "Grey glacier"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            image: Image { url: "{__DIR__}grey.jpg"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            message: "The Glacier is in the south end..."&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            messageArea: Rectangle2D {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                minX: 30,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                minY: 270,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                width: 320,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                height: 70&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            call: click&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        ImageItem {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            id: "torres",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            caption: "Torres del Paine"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            image: Image { url: "{__DIR__}paine.jpg"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            message: "Spectacular mountain group in Torres del Paine..."&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            messageArea: Rectangle2D {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                minX: 30,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                minY: 270,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                width: 320,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                height: 70&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            call: click&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        ImageItem {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            id: "salar",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            caption: "Atacama desert"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            image: Image { url: "{__DIR__}salar.jpg"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            message: "The Atacama Desert is a virtually rainless plateau in Chile..."&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            messageArea: Rectangle2D {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                minX: 20,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                minY: 237,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                width: 380,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                height: 103&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            //            messageFont: Font { size: 12 }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            call: click&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        /*        ImageItem {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        id: "crayons",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;         caption: "Crayones"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;         message: "Recuerdos de la niñez"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;         image: Image { url: "{__DIR__}crayons.jpg"}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;         call: click&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;         },*/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        ImageItem {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            id: "chaiten",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            caption: "Chaiten"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            image: Image { url: "{__DIR__}chaiten.jpg"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            message: "Hell on Earth. Chaitén is a volcanic caldera..."&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            messageArea: Rectangle2D {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                minX: 20,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                minY: 270,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                width: 420,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;                height: 70&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;            call: click&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    ]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    effect: Reflection { fraction: 0.1,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;function click(image:ImageItem) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;    println(image.id);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-6111436692717285851?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/6111436692717285851/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=6111436692717285851' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/6111436692717285851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/6111436692717285851'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/03/un-acordeon-de-imagenes.html' title='Un &quot;acordeón&quot; de imágenes'/><author><name>Mauro</name><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-114930265400628746.post-6360539227652570385</id><published>2009-03-17T22:39:00.000-07:00</published><updated>2009-03-17T22:51:18.338-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='solucion'/><category scheme='http://www.blogger.com/atom/ns#' term='reinicia'/><category scheme='http://www.blogger.com/atom/ns#' term='timeline'/><category scheme='http://www.blogger.com/atom/ns#' term='problema'/><category scheme='http://www.blogger.com/atom/ns#' term='solution'/><category scheme='http://www.blogger.com/atom/ns#' term='error'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><category scheme='http://www.blogger.com/atom/ns#' term='reiniciacion'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>Un pequeño bug en el Timeline y una solución</title><content type='html'>Estaba haciendo unas pruebas y de vez en cuando notaba un comportamiento extraño, finalmente descubrí que el problema se origina en la reutilización de un Timeline, que estaba definido como:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;    var timeline= Timeline {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;        repeatCount: 1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;        keyFrames: [&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            at (0s) { currentX =&amp;gt; startX }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            at (0.5s) { currentX =&amp;gt; posX }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;        ]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;    };&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Aunque no es el ideal que haya bugs, es algo habitual en una plataforma nueva (he leído que Adobe Flex tiene demasiados bugs, así que -aunque es consuelo de tontos- me voy a conformar con este pequeño error en JavaFX).&lt;br /&gt;&lt;br /&gt;La solución fue tan simple como... no reutilizar el Timeline una y otra vez, sino que recrearlo cuando lo voy a usar:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    var timeline:Timeline;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            timeline = Timeline {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                repeatCount: 1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                keyFrames: [&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                    at (0s) { currentX =&amp;gt; startX }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                    at (0.5s) { currentX =&amp;gt; posX }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                ]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            };&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            timeline.playFromStart();&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;El problema específico de mi programa, era que a veces asignaba currentX igual a 0 en at (0s), aunque startX no tenia ese valor.&lt;br /&gt;&lt;br /&gt;En todo caso, no es un problema que ocurra con frecuencia (supongo que debe ser un pequeño error el compilador), así que no es necesario hacer esto cada vez que utilicen un Timeline... pero si notan algo extraño como que un elemento asociado de alguna manera a un timeline salta de manera no esperada, intenten esto (por lo menos hasta que el bug sea corregido).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-6360539227652570385?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/6360539227652570385/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=6360539227652570385' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/6360539227652570385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/6360539227652570385'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/03/un-pequeno-bug-en-el-timeline-y-una.html' title='Un pequeño bug en el Timeline y una solución'/><author><name>Mauro</name><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-114930265400628746.post-7276821393271970542</id><published>2009-03-16T23:36:00.000-07:00</published><updated>2009-03-16T23:48:12.826-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lista'/><category scheme='http://www.blogger.com/atom/ns#' term='scan'/><category scheme='http://www.blogger.com/atom/ns#' term='index'/><category scheme='http://www.blogger.com/atom/ns#' term='sequence'/><category scheme='http://www.blogger.com/atom/ns#' term='recorrido'/><category scheme='http://www.blogger.com/atom/ns#' term='for'/><category scheme='http://www.blogger.com/atom/ns#' term='puntero'/><category scheme='http://www.blogger.com/atom/ns#' term='list'/><category scheme='http://www.blogger.com/atom/ns#' term='recorrer'/><category scheme='http://www.blogger.com/atom/ns#' term='bucle'/><category scheme='http://www.blogger.com/atom/ns#' term='loop'/><category scheme='http://www.blogger.com/atom/ns#' term='secuencias'/><category scheme='http://www.blogger.com/atom/ns#' term='indexof'/><title type='text'>for... indexof</title><content type='html'>Este es un detalle muy menor, pero UTIL... típicamente, cuando uno recorre una lista, crea una variable que sirva de puntero y que se incremente en la medida que pasa los elementos de la lista.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var names=["peter","john","james"];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;var i=0;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;for (name in names) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    println("{name} {&lt;span style="color: rgb(255, 0, 0);"&gt;i&lt;/span&gt;}");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    &lt;span style="color: rgb(255, 0, 0);"&gt;i++;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Con JavaFX script esto no es necesario, sólo basta con un:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var names=["peter","john","james"];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;for (name in names) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    println("{name} {&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;indexof name&lt;/span&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;}");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-7276821393271970542?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/7276821393271970542/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=7276821393271970542' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/7276821393271970542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/7276821393271970542'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/03/for-indexof.html' title='for... indexof'/><author><name>Mauro</name><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-114930265400628746.post-8250609904904993890</id><published>2009-03-16T10:04:00.000-07:00</published><updated>2009-03-16T10:16:37.512-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nodos'/><category scheme='http://www.blogger.com/atom/ns#' term='acumular'/><category scheme='http://www.blogger.com/atom/ns#' term='multiple'/><category scheme='http://www.blogger.com/atom/ns#' term='nodes'/><category scheme='http://www.blogger.com/atom/ns#' term='varios'/><category scheme='http://www.blogger.com/atom/ns#' term='apply'/><category scheme='http://www.blogger.com/atom/ns#' term='accumulate'/><category scheme='http://www.blogger.com/atom/ns#' term='many'/><category scheme='http://www.blogger.com/atom/ns#' term='nodo'/><category scheme='http://www.blogger.com/atom/ns#' term='efecto'/><category scheme='http://www.blogger.com/atom/ns#' term='effects'/><category scheme='http://www.blogger.com/atom/ns#' term='como usar'/><category scheme='http://www.blogger.com/atom/ns#' term='efectos'/><category scheme='http://www.blogger.com/atom/ns#' term='use'/><category scheme='http://www.blogger.com/atom/ns#' term='multiples'/><category scheme='http://www.blogger.com/atom/ns#' term='node'/><category scheme='http://www.blogger.com/atom/ns#' term='effect'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='aplicar'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>¿Comó aplicar más de un efecto a un nodo?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_esUBlqKjDzk/Sb6Ijx5pqcI/AAAAAAAAA0Y/FxjReqboBQQ/s1600-h/cray.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 145px; height: 117px;" src="http://1.bp.blogspot.com/_esUBlqKjDzk/Sb6Ijx5pqcI/AAAAAAAAA0Y/FxjReqboBQQ/s200/cray.jpg" alt="" id="BLOGGER_PHOTO_ID_5313834758615706050" border="0" /&gt;&lt;/a&gt;Si por ejemplo, se desea hacer difusa una imagen y al mismo tiempo reducir su brillo.&lt;br /&gt;&lt;br /&gt;El "truco" está en que casi todos los efectos tienen un INPUT. Eso permite anidar los efectos.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var img = ImageView {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    image: Image { url: "{__DIR__}crayons.jpg"},&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    effect: &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        GaussianBlur {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            &lt;span style="font-weight: bold; color: rgb(255, 0, 0);font-size:130%;" &gt;input:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                ColorAdjust{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                    brightness: -0.5&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-8250609904904993890?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/8250609904904993890/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=8250609904904993890' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/8250609904904993890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/8250609904904993890'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/03/como-aplicar-mas-de-un-efecto-un-nodo.html' title='¿Comó aplicar más de un efecto a un nodo?'/><author><name>Mauro</name><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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_esUBlqKjDzk/Sb6Ijx5pqcI/AAAAAAAAA0Y/FxjReqboBQQ/s72-c/cray.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-114930265400628746.post-2894594287437620293</id><published>2009-03-16T01:03:00.000-07:00</published><updated>2009-03-16T01:36:03.850-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='function'/><category scheme='http://www.blogger.com/atom/ns#' term='dynamic'/><category scheme='http://www.blogger.com/atom/ns#' term='event'/><category scheme='http://www.blogger.com/atom/ns#' term='dinamicas'/><category scheme='http://www.blogger.com/atom/ns#' term='dinamica'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='dinamico'/><category scheme='http://www.blogger.com/atom/ns#' term='funcionalidad'/><category scheme='http://www.blogger.com/atom/ns#' term='funcion'/><category scheme='http://www.blogger.com/atom/ns#' term='functions'/><category scheme='http://www.blogger.com/atom/ns#' term='eventos'/><category scheme='http://www.blogger.com/atom/ns#' term='agregar'/><title type='text'>Agregando funcionalidad a eventos, sobre la marcha</title><content type='html'>Mientras desarrollaba el componente de menú flotante, me encontré con esta posibilidad... agregar funcionalidad a un evento... sobre la marcha.&lt;br /&gt;&lt;br /&gt;El asunto es este. Si defino un evento onMousePressed de un círculo, ¿como podría agregar funcionalidad a ese evento sin alterar el código y sin crear un nuevo tipo de clase?&lt;br /&gt;&lt;br /&gt;Entonces pense... ¿qué tal si primero obtengo la funcionalidad en un evento (onMousePressed) de un objeto y la guardo en una variable? ... Luego, ¿qué tal si reemplazo el evento onMousePressed de ese objeto, con una nueva función en la que primero ejecute la funcion original (guardada en la variable) y luego agrego la nueva funcionalidad?&lt;br /&gt;&lt;br /&gt;Bueno, es posible hacerlo...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Para ver una versión Java Web Start, &lt;/span&gt;&lt;a style="font-weight: bold; color: rgb(255, 0, 0);" href="http://javafxdemo.appspot.com/jfx/addFunctions.jnlp"&gt;CLICK AQUI&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;package addfunctions;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import javafx.stage.Stage;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import javafx.scene.Scene;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import javafx.scene.Node;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import javafx.scene.input.*;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import javafx.scene.paint.*;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import javafx.scene.shape.*;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import javafx.util.Sequences;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var colors: Color[]=[Color.RED, Color.YELLOW,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    Color.BLUE, Color.GREEN];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var mycircle = Circle {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    centerX: 80, centerY: 80,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    radius: 40&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    fill: Color.RED&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    onMousePressed: function(e) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        println("CLICK");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    };&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var mycircle2 = Circle {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    centerX: 150, centerY: 150,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    radius: 40&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    fill: Color.RED&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    onMousePressed: function(e) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        println("CLICK 2");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    };&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;function &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;addColorSwitch&lt;/span&gt;(node:Node) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt; &lt;span style="color: rgb(153, 153, 153);"&gt;   // obtiene la funcion original en el nodo&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    var origFunc: function(e:MouseEvent):Void=&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        node.onMousePressed;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;    // reemplaza evento en el nodo por nuevo evento&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    node.onMousePressed= function(e:MouseEvent) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;        // incluye la funcion original del nodo&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        origFunc(e);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;        // agrega funcionalidad&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        var shape = (node as Circle);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;        // obtiene color actual en el circulo&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        var currentColor = shape.fill;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;        // busca la posicion del color en la secuencia&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        var pos = Sequences.indexOf(colors, currentColor);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;        // si es el ultimo colo de la secuencia, vuelve a cero&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;        // si no, al siguiente elemento&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        if (pos == sizeof colors - 1) then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        pos=0 else pos++;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;        // asigna nuevo color a circulo&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        shape.fill=colors[pos];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    };&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;// agrega funcionalidad a&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;// onMousePressed en los circulos&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;addColorSwitch(mycircle);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;addColorSwitch(mycircle2);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;Stage {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    width: 250, height: 250&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    scene: Scene {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        content: [mycircle, mycircle2]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-2894594287437620293?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/2894594287437620293/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=2894594287437620293' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/2894594287437620293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/2894594287437620293'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/03/agregando-funcionalidad-eventos-sobre.html' title='Agregando funcionalidad a eventos, sobre la marcha'/><author><name>Mauro</name><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-114930265400628746.post-6068047220817986743</id><published>2009-03-14T16:42:00.000-07:00</published><updated>2009-03-15T10:31:57.752-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='componente'/><category scheme='http://www.blogger.com/atom/ns#' term='selector'/><category scheme='http://www.blogger.com/atom/ns#' term='codigo abierto'/><category scheme='http://www.blogger.com/atom/ns#' term='source code'/><category scheme='http://www.blogger.com/atom/ns#' term='popupmenu'/><category scheme='http://www.blogger.com/atom/ns#' term='opcion'/><category scheme='http://www.blogger.com/atom/ns#' term='component'/><category scheme='http://www.blogger.com/atom/ns#' term='menu'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='flotante'/><category scheme='http://www.blogger.com/atom/ns#' term='popup'/><category scheme='http://www.blogger.com/atom/ns#' term='control'/><category scheme='http://www.blogger.com/atom/ns#' term='demo'/><category scheme='http://www.blogger.com/atom/ns#' term='menues'/><category scheme='http://www.blogger.com/atom/ns#' term='opciones'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>MemeFX ... con Popup Menu (experimental)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_esUBlqKjDzk/SbxEwaSZ7kI/AAAAAAAAA0Q/UzvTADbMNFs/s1600-h/menu.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 165px; height: 106px;" src="http://1.bp.blogspot.com/_esUBlqKjDzk/SbxEwaSZ7kI/AAAAAAAAA0Q/UzvTADbMNFs/s200/menu.png" alt="" id="BLOGGER_PHOTO_ID_5313197258871270978" border="0" /&gt;&lt;/a&gt;Estuve haciendo algunos arreglos al experimento del menú flotante que desarrollé hace algún tiempo, y salvo algunos detalles, funciona sin problemas.&lt;br /&gt;&lt;br /&gt;Acabo de subir el código de la biblioteca (memeFX), incluyendo este código y un demo, donde se aprecia como usar el menú flotante.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);font-size:130%;" &gt;Para ver el demo (Java Web Start), haz &lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;a style="font-weight: bold; color: rgb(255, 0, 0);" href="http://javafxdemo.appspot.com/jfx/popupMenu.jnlp"&gt;CLICK AQUI&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);font-size:130%;" &gt;Para visitar el sitio web del proyecto, &lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;a style="font-weight: bold; color: rgb(255, 0, 0);" href="http://code.google.com/p/memefx/"&gt;CLICK AQUI&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Algo de código:&lt;br /&gt;&lt;br /&gt;Primero, se crea un tipo de menú colgante... lo que puede incluir cambios a la apariencia del menú (colores, grosores, rotación, transparencia, esquinas redondeadas, etc.).&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var &lt;span style="color: rgb(51, 255, 255);"&gt;popupCircle &lt;/span&gt;= PopupMenu{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    corner: 20,  padding: 8, borderWidth: 4,&lt;br /&gt;opacity: 0.9, animate: true&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    content: [&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        MenuItem { text: "Animar circulo!", &lt;span style="color: rgb(51, 255, 51);"&gt;&lt;br /&gt;          &lt;span style="font-weight: bold;"&gt;callNode&lt;/span&gt;&lt;/span&gt;: &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;node &lt;/span&gt;},&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        MenuItem { text: "Mostrar nombre y posicion",&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;           &lt;span style="font-weight: bold;"&gt;callPosId&lt;/span&gt;&lt;/span&gt;: &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;positionId &lt;/span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    ]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;El &lt;span style="color: rgb(51, 255, 51);"&gt;tipo de función&lt;/span&gt; declarada para el Item (la función que ejecuta al ser seleccionado un item del menú), tiene que ver con los parámetros que retorna el menú al ser seleccionada la opción:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;call&lt;/span&gt; = no retorna parametros, la función es declarada como:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;function algo():Void { ... };&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;callId&lt;/span&gt; = retorna el ID del objeto sobre el que se utilizó el menú, la función es declarada como:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;function algo(id:String):Void { ... };&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;callPos&lt;/span&gt; = retorna el MouseEvent que originó la aparición del menú. Permite, por ejemplo, obtener la posición del mouse al lanzar el menú (&lt;a href="http://java.sun.com/javafx/1.1/docs/api/javafx.scene.input/javafx.scene.input.MouseEvent.html"&gt;¿qué otros datos se pueden obtener de MouseEvent?&lt;/a&gt;). La función es declarada como:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;function algo(e:MouseEvent):Void { ... };&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;callNode&lt;/span&gt; = retorna el Nodo sobre el que se utilizó el menú flotante. Permite manipular directamente el objeto (en este ejemplo, se anima el tamaño del círculo seleccionado). Si se quiere utilizar sobre un tipo particular de nodo, es necesario hacer un casting al tipo de objeto apropiado... ejemplo, si el tipo de objeto es un campo de texto: (node as SwingTextField).text="{node.id}" . La función es declarada como:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;function algo(node:Node):Void { ... };&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;callPosId&lt;/span&gt; = retorna el MouseEvent que originó la aparición del menu y el ID del objeto sobre el que se utilizó (puede ser útil para saber en que parte del objeto se hizo click). La función es declarada como:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;function algo(e:MouseEvent, id:String) { ... };&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;callPosNode&lt;/span&gt; = retorna el MouseEvent que originó la aparición del menu y el Nodo sobre el que se utilizó (puede ser útil para saber en que parte y sobre que objeto se hizo click). La función es declarada como:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;function algo(e:MouseEvent, node:Node) { ... };&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En este ejemplo agregaré dos círculos:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var circle1 = Circle {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    id: "Cicle 1"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    centerX: 100, centerY: 100&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    radius: 40, fill: Color.RED&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var circle2 = Circle {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    id: "Cicle 2"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    centerX: 220, centerY: 300&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    radius: 80, fill: Color.YELLOW&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Los ID son opcionales, pero pueden ser usados para reconocer sobre que objeto se lanzó el menú flotante (callId y callPosId).&lt;br /&gt;&lt;br /&gt;A continuación, enlazo el menú con los círculos:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;popupCircle&lt;/span&gt;.to(circle1);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;popupCircle&lt;/span&gt;.to(circle2);&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Se agregan las rutinas que serán ejecutadas por las opciones del menú (el código pudo ser incluido al definir el menú colgante).&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;function &lt;span style="color: rgb(255, 0, 0);"&gt;node&lt;/span&gt;(node:Node):Void {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    Timeline {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        repeatCount: 4&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        autoReverse: true&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        keyFrames: [&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            at (0s) {node.scaleX =&amp;gt; 1.0;&lt;br /&gt;        node.scaleY =&amp;gt; 1.0 }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            at (0.2s) {node.scaleX =&amp;gt; 1.4;&lt;br /&gt;          node.scaleY =&amp;gt; 1.4}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        ]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    }.play();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;function &lt;span style="color: rgb(255, 0, 0);"&gt;positionId&lt;/span&gt;(e:MouseEvent, id:String):Void {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    println("Mouse at {e.x},{e.y} over {id}");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Finalmente, se agregan los círculos y los menús al Stage:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;Stage {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    scene: Scene {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        content: [&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            circle1,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            circle2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            PopupMenu.activateMenus()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        ]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-6068047220817986743?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/6068047220817986743/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=6068047220817986743' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/6068047220817986743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/6068047220817986743'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/03/memefx-con-popup-menu-experimental.html' title='MemeFX ... con Popup Menu (experimental)'/><author><name>Mauro</name><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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_esUBlqKjDzk/SbxEwaSZ7kI/AAAAAAAAA0Q/UzvTADbMNFs/s72-c/menu.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-114930265400628746.post-4310410338196104823</id><published>2009-03-13T14:06:00.000-07:00</published><updated>2009-03-15T09:52:50.986-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='componente'/><category scheme='http://www.blogger.com/atom/ns#' term='perilla'/><category scheme='http://www.blogger.com/atom/ns#' term='library'/><category scheme='http://www.blogger.com/atom/ns#' term='display'/><category scheme='http://www.blogger.com/atom/ns#' term='reloj'/><category scheme='http://www.blogger.com/atom/ns#' term='gauge'/><category scheme='http://www.blogger.com/atom/ns#' term='position'/><category scheme='http://www.blogger.com/atom/ns#' term='components'/><category scheme='http://www.blogger.com/atom/ns#' term='componentes'/><category scheme='http://www.blogger.com/atom/ns#' term='knob'/><category scheme='http://www.blogger.com/atom/ns#' term='stage'/><category scheme='http://www.blogger.com/atom/ns#' term='persistencia'/><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='controller'/><category scheme='http://www.blogger.com/atom/ns#' term='persistence'/><category scheme='http://www.blogger.com/atom/ns#' term='libreria'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='size'/><category scheme='http://www.blogger.com/atom/ns#' term='biblioteca'/><title type='text'>MemeFX ... mi biblioteca para JavaFX</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_esUBlqKjDzk/SbrP92r5LJI/AAAAAAAAAzk/iP1EbpVbe_A/s1600-h/cornerLL.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 200px;" src="http://1.bp.blogspot.com/_esUBlqKjDzk/SbrP92r5LJI/AAAAAAAAAzk/iP1EbpVbe_A/s200/cornerLL.png" alt="" id="BLOGGER_PHOTO_ID_5312787371995507858" border="0" /&gt;&lt;/a&gt;El nombre puede parecer "curioso", pero tiene una razón "intelectualoide" de ser...&lt;br /&gt;&lt;br /&gt;Meme (se pronuncia MIM), responde a toda una teoría sobre la capacidad de las ideas para replicarse y evolucionar por si mismas, como seres vivos. La idea es que el diseño puede surgir del caos (suena a código abierto, ¿no?).&lt;br /&gt;&lt;br /&gt;Se supone que a través de un proceso evolutivo y se selección natural, se consigue un resultado superior al original... ahora, como este proyecto es código abierto, y por lo mismo, fácilmente replicable y modificable (puede mutar y evolucionar libremente)... entonces, podría convertirse en un meme.&lt;br /&gt;&lt;br /&gt;Veamos si el EFECTO MEME (MemeFX) ocurre con él... ;)&lt;br /&gt;&lt;br /&gt;En este momento la biblioteca contiene sólo tres componentes, pero, no por eso no son útiles ;D ... la idea es que con el tiempo vaya creciendo. Tengo algunas ideas como incorporar controles para un menu flotante gráfico (si han mirado el blog, por ahí &lt;a href="http://aprendiendo-javafx.blogspot.com/2009/02/javafx-menu-flotante-popup-menu.html"&gt;ya hice un intento&lt;/a&gt;), un &lt;a href="http://www.stickmanlabs.com/accordion/"&gt;componente de acordeón&lt;/a&gt;, componentes que permitan fácilmente asignar drag and drop a los elementos y definir areas para ser arrojados, un componente para simplificar que los applets sean arrastrables desde el navegador al escritorio (básicamente que genere el área de arrastre solo, porque de por sí es simple habilitar esa funcionalidad), etc. Las ideas son bienvenidas.&lt;br /&gt;&lt;br /&gt;Por ahora, aquí está el código fuente de la biblioteca, demos Java Web Start con sus respectivos códigos fuentes y la documentación sobre como utilizarlos y personalizarlos.&lt;br /&gt;&lt;br /&gt;Ojalá les sean de utilidad y puedan unirse al proyecto quienes se sientan motivados.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);font-size:180%;" &gt;&lt;a href="http://code.google.com/p/memefx/"&gt;http://code.google.com/p/memefx/&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://es.wikipedia.org/wiki/Meme"&gt;Aquí hay más info sobre los Memes&lt;/a&gt;, si alguien tiene curiosidad.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-4310410338196104823?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/4310410338196104823/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=4310410338196104823' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/4310410338196104823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/4310410338196104823'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/03/memefx-mi-biblioteca-para-javafx.html' title='MemeFX ... mi biblioteca para JavaFX'/><author><name>Mauro</name><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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_esUBlqKjDzk/SbrP92r5LJI/AAAAAAAAAzk/iP1EbpVbe_A/s72-c/cornerLL.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-114930265400628746.post-3638800447702070959</id><published>2009-03-11T15:10:00.000-07:00</published><updated>2009-03-13T10:03:42.641-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='sandbox'/><category scheme='http://www.blogger.com/atom/ns#' term='persistencia'/><category scheme='http://www.blogger.com/atom/ns#' term='restrictions'/><category scheme='http://www.blogger.com/atom/ns#' term='persistent'/><category scheme='http://www.blogger.com/atom/ns#' term='persistence'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><category scheme='http://www.blogger.com/atom/ns#' term='persist'/><category scheme='http://www.blogger.com/atom/ns#' term='persistente'/><category scheme='http://www.blogger.com/atom/ns#' term='local'/><title type='text'>Como guardar datos persistentes en una aplicación JavaFX Web Start</title><content type='html'>Esto permite que incluso una aplicación JWS -sin autorización para acceder a los recursos locales- almacene objetos y datos localmente, utilizando un mecanismo parecido a los "cookies" de los navegadores web.&lt;br /&gt;&lt;br /&gt;Para el desarrollo del proyecto, hay que incluir el archivo javaws.jar entre las bibliotecas del proyecto, de manera de poder compilar el código. El archivo javaws.jar es standard en las distribuciones de Java 6 y posteriores, así que no es necesario incluirlo en la distribución de tu aplicación.&lt;br /&gt;&lt;br /&gt;Comenzamos incluyendo los import en la aplicación:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import java.io.*;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import java.net.URL;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import javax.jnlp.*;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;A continuación declaramos dos variables:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var persistenceService: PersistenceService = null;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var codebase: URL = null;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;En el bloque INIT de la aplicación JavaFX, incluimos:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;init {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    try {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        var basicService: BasicService =&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            ServiceManager.lookup("javax.jnlp.BasicService") &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            as BasicService;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        codebase = basicService.getCodeBase();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            persistenceService =&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            ServiceManager.lookup("javax.jnlp.PersistenceService")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            as PersistenceService;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    } catch (use:Exception) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Eso inicializa codebase y persistenceService.&lt;br /&gt;&lt;br /&gt;En este ejemplo, declaro una clase Java que contendrá los datos que deseo almacenar persistentemente en el computador del usuario:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import java.io.Serializable;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;class persistentData implements Serializable {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt; public float x;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt; public float y;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt; public float width;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt; public float height;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    persistentData (float x, float y, float width, float height) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        this.x=x;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        this.y=y;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        this.width=width;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        this.height=height;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    };&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Ahora, puedo incluir el código para almacenar en el repositorio local una instancia de mi clase persistentData:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var cache = new persistentData (x, y, width, height);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;try {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    var fc: FileContents =&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        persistenceService.get(codebase);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    var oos: ObjectOutputStream = &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        new ObjectOutputStream&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        (fc.getOutputStream(true));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    oos.writeObject( cache );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    oos.flush();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    oos.close();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;} catch (e:Exception) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Y para recuperar el objeto desde el repositorio:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var cache:persistentData;&lt;br /&gt;try {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    var appSettings: FileContents = null;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    appSettings = persistenceService.get(codebase);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    var ois: ObjectInputStream = new ObjectInputStream&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        ( appSettings.getInputStream() );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    cache = ois.readObject() as persistentData;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    ois.close();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;} catch (fnfe: FileNotFoundException ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;   try {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        var size = persistenceService.create(codebase, 1024);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;   } catch (ioe:IOException) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;} catch (e:Exception) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Voila!&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Nota: el número 1024 en la línea persistenceService.create(codebase, 1024) indica el espacio (en bytes) que la aplicación está solicitando al repositorio para almacenar datos.&lt;br /&gt;&lt;br /&gt;Si vas a ejecutar más de una aplicación Java Web Start desde una misma ruta (el mismo directorio en las URLs), es necesario agregar algo al codebase de manera de distinguir a ambas aplicaciones, porque si no, van a "pisarse" los datos almacenados.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-3638800447702070959?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/3638800447702070959/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=3638800447702070959' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/3638800447702070959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/3638800447702070959'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/03/como-guardar-datos-persistentes-en-una.html' title='Como guardar datos persistentes en una aplicación JavaFX Web Start'/><author><name>Mauro</name><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-114930265400628746.post-6239601320022880222</id><published>2009-03-11T14:55:00.000-07:00</published><updated>2009-03-11T15:40:00.670-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fondo'/><category scheme='http://www.blogger.com/atom/ns#' term='option'/><category scheme='http://www.blogger.com/atom/ns#' term='color'/><category scheme='http://www.blogger.com/atom/ns#' term='customization'/><category scheme='http://www.blogger.com/atom/ns#' term='lineargradient'/><category scheme='http://www.blogger.com/atom/ns#' term='cual'/><category scheme='http://www.blogger.com/atom/ns#' term='opcion'/><category scheme='http://www.blogger.com/atom/ns#' term='gradient'/><category scheme='http://www.blogger.com/atom/ns#' term='personalizacion'/><category scheme='http://www.blogger.com/atom/ns#' term='paint'/><category scheme='http://www.blogger.com/atom/ns#' term='background'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='radialgradient'/><title type='text'>¿Qué usar? ¿Color o Paint?</title><content type='html'>Desarrollando el componente de "reloj" (no sé como llamarlo en español, en inglés les dicen Gauge), al incluir la posibilidad que el usuario pueda cambiar el color de fondo del "reloj" me topé con este dilema.... ¿Color o Paint?&lt;br /&gt;&lt;br /&gt;Obviamente que yo opté por el Paint en el caso de este componente, porque permite pasar como un parametro a una función no solo un "color", sino una "gradiente" de colores, ya sea radial o lineal.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    public function customBackground(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;      color:Paint, effect:Effect):Node {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        Circle {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            centerX: 150,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            centerY: 150&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            radius: 135&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            fill: bind color&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    };&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;La ventaja de usar Paint es que luego uno puede llamar la función (en el caso de mi componente) con :&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;background: control2.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    customBackground(Color.DARKBLUE)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;o pasarle una "gradiente":&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;background: control3.customBackground(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        RadialGradient {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        centerX: 56, centerY: 56&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        focusX: 0.1, focusY: 0.1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        radius: 103&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        proportional: false&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        stops: [&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            Stop {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                color: Color.WHITE&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                offset: 0.0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            },&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            Stop {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                color: Color.DARKRED&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;                offset: 1.0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        ]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    })&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;lo que permite mayor personalización....&lt;br /&gt;&lt;br /&gt;Es un detalle menor, pero al menos es bueno tener presente que existe la opción, especialmente si se están desarrollando componentes y se desea dar flexibilidad a quienes los utilicen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-6239601320022880222?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/6239601320022880222/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=6239601320022880222' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/6239601320022880222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/6239601320022880222'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/03/que-usar-color-o-paint.html' title='¿Qué usar? ¿Color o Paint?'/><author><name>Mauro</name><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-114930265400628746.post-8307633425449830276</id><published>2009-03-09T16:30:00.000-07:00</published><updated>2009-03-10T09:13:34.863-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='custom'/><category scheme='http://www.blogger.com/atom/ns#' term='valores'/><category scheme='http://www.blogger.com/atom/ns#' term='componente'/><category scheme='http://www.blogger.com/atom/ns#' term='output'/><category scheme='http://www.blogger.com/atom/ns#' term='personalizar'/><category scheme='http://www.blogger.com/atom/ns#' term='customizable'/><category scheme='http://www.blogger.com/atom/ns#' term='display'/><category scheme='http://www.blogger.com/atom/ns#' term='manometro'/><category scheme='http://www.blogger.com/atom/ns#' term='aguja'/><category scheme='http://www.blogger.com/atom/ns#' term='component'/><category scheme='http://www.blogger.com/atom/ns#' term='salida'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='personablizable'/><title type='text'>Pronto liberaré este nuevo componente</title><content type='html'>No crean que abandoné mi pasión por el JavaFX ;D ... sólo he estado dedicado a desarrollar este componente que voy a liberar como código abierto.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;&lt;a href="http://javafxdemo.appspot.com/jfx/democombo.jnlp"&gt;JAVA WEB START DEMO&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sería genial si alguien con algo de tiempo me ayuda a integrar estos componentes (la perilla, el stagecontroller y este nuevo componente) en el proyecto JFXtras (&lt;a href="http://code.google.com/p/jfxtras/"&gt;CLICK&lt;/a&gt;). Mi problema es de falta de tiempo.&lt;br /&gt;&lt;br /&gt;¿Algún voluntario?&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/OlTELQ1axi4&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/OlTELQ1axi4&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package democombo;&lt;br /&gt;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;import javafx.scene.Scene;&lt;br /&gt;import javafx.scene.Group;&lt;br /&gt;import javafx.scene.paint.*;&lt;br /&gt;import javafx.scene.text.*;&lt;br /&gt;import javafx.scene.shape.Circle;&lt;br /&gt;import javafx.scene.shape.Rectangle;&lt;br /&gt;import org.combofx.gauge.*;&lt;br /&gt;import org.combofx.stage.*;&lt;br /&gt;import org.combofx.knob.*;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/** Stage controller */&lt;br /&gt;var cs = controlStage{&lt;br /&gt;width: 1024, height: 600&lt;br /&gt;initialPosition: controlStage.CENTER&lt;br /&gt;checkMinHeight: true, minHeight: 600&lt;br /&gt;checkMinWidth: true, minWidth: 1024&lt;br /&gt;stickyBorders: true, limitBorders: true&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// gauge component #1&lt;br /&gt;var gauge1 = Gauge {&lt;br /&gt;ui: BasicGauge{ }&lt;br /&gt;primaryLabel: "Km/H"&lt;br /&gt;secondaryLabel: "Speed"&lt;br /&gt;secondaryLabelFont: Font { size: 15 };&lt;br /&gt;min: 0.0, max: 100.0&lt;br /&gt;scaleX: 0.72, scaleY: 0.72&lt;br /&gt;translateX: -35, translateY: -42&lt;br /&gt;speed: Gauge.SLOW&lt;br /&gt;initialValue: 0&lt;br /&gt;value: bind knob1.value&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/** knob input #1 */&lt;br /&gt;var knob1 = Knob {&lt;br /&gt;ui: BasicKnob{ }&lt;br /&gt;dialLinesNumber: 31&lt;br /&gt;dialLinesLongEvery: 3&lt;br /&gt;minAngle: 0, maxAngle: 720&lt;br /&gt;translateX: 160, translateY: 160&lt;br /&gt;min: 0, max: 100&lt;br /&gt;scaleX: 0.5, scaleY: 0.5&lt;br /&gt;value: 50&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// gauge component #2&lt;br /&gt;var control2 = CornerLLGauge{};&lt;br /&gt;var gauge2 = Gauge {&lt;br /&gt;ui: control2&lt;br /&gt;primaryLabel: "Km/H"&lt;br /&gt;secondaryLabel: "Current\nSpeed"&lt;br /&gt;min: 0.0, max: 100.0&lt;br /&gt;dialNumsVisibleEvery: 2&lt;br /&gt;translateX: 300&lt;br /&gt;speed: Gauge.SLOWEST&lt;br /&gt;initialValue: 0&lt;br /&gt;value: bind knob2.value&lt;br /&gt;dialLongLinesColor: Color.YELLOW&lt;br /&gt;// custom background color&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;    background: control2.customBackground(Color.DARKBLUE)&lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/** knob input #2 */&lt;br /&gt;var knob2 = Knob {&lt;br /&gt;ui: BasicKnob{ }&lt;br /&gt;dialLinesNumber: 31&lt;br /&gt;minAngle: 0, maxAngle: 720&lt;br /&gt;dialLinesLongEvery: 3&lt;br /&gt;translateX: 470, translateY: 160&lt;br /&gt;min: 0, max: 100&lt;br /&gt;scaleX: 0.5, scaleY: 0.5&lt;br /&gt;value: 50&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// gauge component #3&lt;br /&gt;var control3 = RectGauge{ };&lt;br /&gt;var gauge3 = Gauge {&lt;br /&gt;ui: control3&lt;br /&gt;primaryLabel: "Km/H"&lt;br /&gt;primaryLabelColor: Color.ORANGE&lt;br /&gt;secondaryLabel: "Speed"&lt;br /&gt;min: -100.0, max: 100.0&lt;br /&gt;dialNumsLargeEvery: 2&lt;br /&gt;largeNumberFont: Font { size: 16, oblique: true }&lt;br /&gt;smallNumberFont: Font { size: 10, oblique: true }&lt;br /&gt;translateX: 600, translateY: -7&lt;br /&gt;scaleX: 0.94, scaleY: 0.94&lt;br /&gt;speed: Gauge.INMEDIATE&lt;br /&gt;initialValue: 0.1&lt;br /&gt;value: bind knob3.value&lt;br /&gt;dialLongLinesWidth: 4&lt;br /&gt;internalLongRadDial: 118&lt;br /&gt;dialShortLinesColor: Color.YELLOW&lt;br /&gt;dialShortLinesWidth: 0.5&lt;br /&gt;// custom background radial gradient&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;    background: control3.customBackground(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;        RadialGradient {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;        centerX: 56, centerY: 56&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;        focusX: 0.1, focusY: 0.1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;        radius: 103&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;        proportional: false&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;        stops: [&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;            Stop {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                color: Color.WHITE&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                offset: 0.0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;            },&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;            Stop {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                color: Color.DARKRED&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                offset: 1.0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;        ]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;    })&lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/** knob input #3 */&lt;br /&gt;var knob3 = Knob {&lt;br /&gt;ui: BasicKnob{ }&lt;br /&gt;dialLinesNumber: 31&lt;br /&gt;minAngle: 0, maxAngle: 720&lt;br /&gt;dialLinesLongEvery: 3&lt;br /&gt;translateX: 830, translateY: 160&lt;br /&gt;min: -100, max: 100&lt;br /&gt;scaleX: 0.5, scaleY: 0.5&lt;br /&gt;value: 0&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// gauge component #4&lt;br /&gt;var control4 = SquareGauge{};&lt;br /&gt;var gauge4 = Gauge {&lt;br /&gt;ui: control4&lt;br /&gt;decorationVisible: false&lt;br /&gt;primaryLabel: "Km/H"&lt;br /&gt;secondaryLabel: "Speed"&lt;br /&gt;secondaryLabelFont: Font { size: 15 }&lt;br /&gt;valueColor: Color.CYAN&lt;br /&gt;valueFont: Font {&lt;br /&gt;    size: 19,&lt;br /&gt;    oblique: true&lt;br /&gt;    name: "Verdana"&lt;br /&gt;}&lt;br /&gt;min: 0.0, max: 100.0&lt;br /&gt;scaleX: 0.72, scaleY: 0.72&lt;br /&gt;translateX: -35, translateY: 250&lt;br /&gt;speed: Gauge.FAST&lt;br /&gt;initialValue: 0&lt;br /&gt;value: bind knob4.value&lt;br /&gt;// custom gauge background color&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;   background: control4.customBackground(Color.DARKGREEN)&lt;/span&gt;&lt;br /&gt; // highlighted ranges&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;    highlightRange: [&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;        Gauge.range { &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            start: 0, end: 70 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            color: Color.GREEN &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            opacity: 0.8 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;        },&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;        Gauge.range {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            start: 70, end: 90&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            color: Color.YELLOW&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            dialLongLinesColor: Color.YELLOW&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            dialShortLinesColor: Color.YELLOW&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            opacity: 0.5&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            Gauge.range {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            start: 90, end: 100&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            color: Color.RED&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            dialLongLinesColor: Color.RED&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            dialShortLinesColor: Color.RED&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            opacity: 0.5&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;    ]&lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/** knob input #4 */&lt;br /&gt;var knob4 = Knob {&lt;br /&gt;ui: OrangeKnob{}&lt;br /&gt;dialLinesNumber: 31&lt;br /&gt;minAngle: 0, maxAngle: 720&lt;br /&gt;dialLinesLongEvery: 3&lt;br /&gt;translateX: 160, translateY: 450&lt;br /&gt;min: 0, max: 100&lt;br /&gt;scaleX: 0.5, scaleY: 0.5&lt;br /&gt;value: 50&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// gauge component #5&lt;br /&gt;var control5 = SmallGauge{};&lt;br /&gt;var gauge5 = Gauge {&lt;br /&gt;ui: control5&lt;br /&gt;primaryLabel: "Km/H"&lt;br /&gt;secondaryLabel: "Speed"&lt;br /&gt;min: 0.0, max: 100.0&lt;br /&gt;dialNumsVisibleEvery: 2&lt;br /&gt;translateX: 295, translateY: 290&lt;br /&gt;speed: Gauge.FASTEST&lt;br /&gt;initialValue: 0&lt;br /&gt;value: bind knob5.value&lt;br /&gt;valueColor: Color.RED&lt;br /&gt;dialLongLinesColor: Color.RED&lt;br /&gt;shadowColor: Color.RED&lt;br /&gt;shadowX: 2, shadowY: 2&lt;br /&gt;// custom background radial gradient&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;    background: control5.customBackground(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;        RadialGradient {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;        centerX: 56, centerY: 56&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;        focusX: 0.1, focusY: 0.1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;        radius: 103&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;        proportional: false&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;        stops: [&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;            Stop {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                color: Color.WHITE&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                offset: 0.0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;            },&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;            Stop {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                color: Color.BLACK&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                offset: 1.0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;        ]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;    })&lt;/span&gt;&lt;br /&gt; // highlighted gauge range&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;    highlightRange: [&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;        Gauge.range {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            start: 80, end: 100,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            color: Color.RED&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            dialLongLinesColor: Color.RED,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            dialShortLinesColor: Color.RED&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            internalRad: 120, externalRad: 123&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;    ]&lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/** knob input #5 */&lt;br /&gt;var knob5 = Knob {&lt;br /&gt;ui: OrangeKnob{}&lt;br /&gt;dialLinesNumber: 31&lt;br /&gt;minAngle: 0, maxAngle: 720&lt;br /&gt;dialLinesLongEvery: 3&lt;br /&gt;translateX: 470, translateY: 450&lt;br /&gt;min: 0, max: 100&lt;br /&gt;scaleX: 0.5, scaleY: 0.5&lt;br /&gt;value: 50&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/** knob input noise #6 */&lt;br /&gt;var knob6noise = Knob {&lt;br /&gt;ui: OrangeKnob{ }&lt;br /&gt;dialLinesNumber: 11&lt;br /&gt;dialLinesLongEvery: 2&lt;br /&gt;translateX: 730, translateY: 450&lt;br /&gt;min: 0, max: 1&lt;br /&gt;scaleX: 0.5, scaleY: 0.5&lt;br /&gt;value: 0&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// gauge component #6&lt;br /&gt;var control6 = FlatRectInvGauge{};&lt;br /&gt;var gauge6 = Gauge {&lt;br /&gt;ui: control6&lt;br /&gt;primaryLabel: ""&lt;br /&gt;secondaryLabel: "Km/H"&lt;br /&gt;secondaryLabelColor: Color.ORANGE&lt;br /&gt;secondaryLabelFont: Font { size: 19 }&lt;br /&gt;min: 0, max: 1&lt;br /&gt;dialNumsVisibleEvery: 2&lt;br /&gt;translateX: 600, translateY: 280&lt;br /&gt;scaleX: 0.94, scaleY: 0.94&lt;br /&gt;speed: Gauge.FAST&lt;br /&gt;initialValue: 0.1&lt;br /&gt;value: bind knob6.value&lt;br /&gt;dialLongLinesWidth: 4&lt;br /&gt;internalLongRadDial: 118&lt;br /&gt;dialShortLinesColor: Color.ORANGE&lt;br /&gt;dialShortLinesWidth: 0.5&lt;br /&gt;noise: true, noiseLevel: bind knob6noise.value&lt;br /&gt;reverseScale: true&lt;br /&gt;dialNumsIntegerOnly: false&lt;br /&gt;dialNumsDecimals: 1&lt;br /&gt;useDots: true&lt;br /&gt;displayVisible: false&lt;br /&gt;decorationVisible: false&lt;br /&gt;shadowX: 0, shadowY: 0&lt;br /&gt;// highlighted gauge ranges&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;    highlightRange: [&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            Gauge.range {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            start: 0, end: 0.5&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            dialNumsColor: Color.ORANGE&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;        },&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            Gauge.range {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            start: 0.6, end: 0.8&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            color: Color.DARKRED&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            opacity: 0.3&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            internalRad: 0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;        },&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            Gauge.range {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            start: 0.8, end: 1.0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            color: Color.DARKRED&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            opacity: 0.6&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;            internalRad: 0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;    ]&lt;/span&gt;&lt;br /&gt; // custom gauge background&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;    background: Group { content: [&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;            Rectangle {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                x: 10,&lt;/span&gt;&lt;span style="color: rgb(51, 255, 255);"&gt; y: 10&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                arcHeight: 20,&lt;/span&gt; &lt;span style="color: rgb(51, 255, 255);"&gt;arcWidth: 20&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                width: 260, &lt;/span&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;height: 180&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                fill: Color.RED&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;            Circle {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                centerX: 140,&lt;/span&gt; &lt;span style="color: rgb(51, 255, 255);"&gt;centerY: 52&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                radius: 125&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                fill: Color.DARKRED&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                opacity: 0.5&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                clip: Rectangle { &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                    x: 15, &lt;/span&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;y: 35, &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                    width: 250, &lt;/span&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;height: 180 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                    arcHeight: 20, &lt;/span&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;arcWidth: 20 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;                }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;        }]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;    }&lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/** knob input #6 */&lt;br /&gt;var knob6 = Knob {&lt;br /&gt;ui: OrangeKnob { }&lt;br /&gt;dialLinesNumber: 31&lt;br /&gt;minAngle: 0, maxAngle: 720&lt;br /&gt;dialLinesLongEvery: 3&lt;br /&gt;translateX: 830, translateY: 450&lt;br /&gt;min: 0, max: 1&lt;br /&gt;scaleX: 0.5, scaleY: 0.5&lt;br /&gt;value: 0.5&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Stage {&lt;br /&gt;// bind Stage (window) to the controller&lt;br /&gt;width: bind cs.width with inverse&lt;br /&gt;height: bind cs.height with inverse&lt;br /&gt;x: bind cs.x with inverse&lt;br /&gt;y: bind cs.y with inverse&lt;br /&gt;&lt;br /&gt;scene: Scene {&lt;br /&gt;    content: [gauge1, knob1, gauge2, knob2, gauge3, knob3,&lt;br /&gt;    gauge4, knob4, gauge5, knob5, gauge6, knob6, knob6noise]&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-8307633425449830276?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/8307633425449830276/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=8307633425449830276' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/8307633425449830276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/8307633425449830276'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/03/pronto-liberare-este-nuevo-componente.html' title='Pronto liberaré este nuevo componente'/><author><name>Mauro</name><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-114930265400628746.post-6962515594727707016</id><published>2009-02-24T09:25:00.000-08:00</published><updated>2009-02-25T12:11:02.779-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='screen'/><category scheme='http://www.blogger.com/atom/ns#' term='escritorio'/><category scheme='http://www.blogger.com/atom/ns#' term='ajustable'/><category scheme='http://www.blogger.com/atom/ns#' term='portable'/><category scheme='http://www.blogger.com/atom/ns#' term='pantalla'/><category scheme='http://www.blogger.com/atom/ns#' term='adjustable'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='tamaño'/><category scheme='http://www.blogger.com/atom/ns#' term='desktop'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='movil'/><category scheme='http://www.blogger.com/atom/ns#' term='wora'/><category scheme='http://www.blogger.com/atom/ns#' term='size'/><category scheme='http://www.blogger.com/atom/ns#' term='portability'/><title type='text'>Una aplicación Desktop / Móvil que se adapta a la pantalla</title><content type='html'>Este ejemplo hace algo bastante simple, pero útil:&lt;br /&gt;&lt;br /&gt;- Detecta el profile en que se está ejecutando (si es una aplicación móvil o de escritorio)&lt;br /&gt;- Dependiendo de eso, obtiene las dimensiones de la pantalla (en caso de ser móvil) o define un tamaño inicial para la aplicación de escritorio.&lt;br /&gt;- En caso de tratarse de una aplicación de escritorio, resta al tamaño de la ventana el borde de la misma, de manera de conocer el area útil (en la que puede desplegar información o gráficos).&lt;br /&gt;- En el caso de una aplicación de escritorio, ajusta lo desplegado al tamaño de la ventana, en caso que se cambie el tamaño a la ventana.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/nzj0_QwcXUo&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/nzj0_QwcXUo&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Aquí está el código:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package mobilescreen;&lt;br /&gt;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;import javafx.scene.Scene;&lt;br /&gt;import javafx.scene.text.*;&lt;br /&gt;import javafx.animation.*;&lt;br /&gt;import javafx.scene.shape.Circle;&lt;br /&gt;import javafx.scene.paint.Color;&lt;br /&gt;import javafx.scene.shape.Rectangle;&lt;br /&gt;&lt;br /&gt;var dx: Number=2;&lt;br /&gt;var dy: Number=3;&lt;br /&gt;var x: Number;&lt;br /&gt;var y: Number;&lt;br /&gt;var realW:Number;&lt;br /&gt;var realH:Number;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var profile = FX.getProperty("javafx.me.profiles");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var isMobile = profile != null and &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;               profile.indexOf("MIDP") &amp;gt;= 0;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;var w: Number on replace {&lt;br /&gt;  if (w == 0) then &lt;span style="color: rgb(51, 255, 51);"&gt;w = 300&lt;/span&gt;;&lt;br /&gt;  realW = w - (if (isMobile) 0 else &lt;span style="color: rgb(255, 102, 0);"&gt;16&lt;/span&gt;);&lt;br /&gt;  x = realW / 2 ;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;var h: Number on replace {&lt;br /&gt;  if (h == 0) then &lt;span style="color: rgb(51, 255, 51);"&gt;h = 400&lt;/span&gt;;&lt;br /&gt;  realH = h - (if (isMobile) 0 else &lt;span style="color: rgb(255, 102, 0);"&gt;36&lt;/span&gt;);&lt;br /&gt;  y = realH / 2 ;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;Timeline {&lt;br /&gt;  repeatCount: Timeline.INDEFINITE&lt;br /&gt;  keyFrames: [&lt;br /&gt;      KeyFrame {&lt;br /&gt;          time: 0.02s&lt;br /&gt;          action: function () {&lt;br /&gt;              x += dx;&lt;br /&gt;              y += dy;&lt;br /&gt;              if (x &amp;lt; 0 or x &amp;gt; realW )&lt;br /&gt;              dx = -dx;&lt;br /&gt;              if (y &amp;lt; 0 or y &amp;gt; realH)&lt;br /&gt;              dy = -dy;&lt;br /&gt;          }&lt;br /&gt;      }&lt;br /&gt;  ]&lt;br /&gt;}.play();&lt;br /&gt;&lt;br /&gt;Stage {&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;    width: bind w with inverse&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;    height: bind h with inverse&lt;/span&gt;&lt;br /&gt;  scene: Scene {&lt;br /&gt;      content: [&lt;br /&gt;          Text {&lt;br /&gt;              font: Font { size: 16 }&lt;br /&gt;              x: 10, y: 30&lt;br /&gt;              content: bind&lt;br /&gt;              "width: {w}\nheight:{h}\nis mobile: {isMobile}"&lt;br /&gt;          },&lt;br /&gt;          Rectangle {&lt;br /&gt;              x: &lt;span style="color: rgb(204, 51, 204);"&gt;10&lt;/span&gt;, y: &lt;span style="color: rgb(204, 51, 204);"&gt;10&lt;/span&gt;&lt;br /&gt;              width: &lt;span style="color: rgb(51, 255, 51);"&gt;bind realW&lt;/span&gt; - &lt;span style="color: rgb(204, 51, 204);"&gt;20&lt;/span&gt;&lt;br /&gt;              height: &lt;span style="color: rgb(51, 255, 51);"&gt;bind realH&lt;/span&gt; - &lt;span style="color: rgb(204, 51, 204);"&gt;20&lt;/span&gt;&lt;br /&gt;              fill: Color.BLUE&lt;br /&gt;              opacity: 0.5&lt;br /&gt;          },&lt;br /&gt;          Circle {&lt;br /&gt;              centerX: bind x,&lt;br /&gt;              centerY: bind y&lt;br /&gt;              fill: Color.RED,&lt;br /&gt;              opacity: 0.5&lt;br /&gt;              radius: 40&lt;br /&gt;          }&lt;br /&gt;      ]&lt;br /&gt;  }&lt;br /&gt;};&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-6962515594727707016?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/6962515594727707016/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=6962515594727707016' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/6962515594727707016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/6962515594727707016'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/02/una-aplicacion-desktop-movil-que-se.html' title='Una aplicación Desktop / Móvil que se adapta a la pantalla'/><author><name>Mauro</name><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-114930265400628746.post-1725610233403388582</id><published>2009-02-23T20:47:00.001-08:00</published><updated>2009-02-24T10:11:07.704-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='cellphone'/><category scheme='http://www.blogger.com/atom/ns#' term='como'/><category scheme='http://www.blogger.com/atom/ns#' term='java me'/><category scheme='http://www.blogger.com/atom/ns#' term='cellular'/><category scheme='http://www.blogger.com/atom/ns#' term='create'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='pda'/><category scheme='http://www.blogger.com/atom/ns#' term='java2me'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='javame'/><category scheme='http://www.blogger.com/atom/ns#' term='cell'/><category scheme='http://www.blogger.com/atom/ns#' term='celular'/><category scheme='http://www.blogger.com/atom/ns#' term='crear'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='midlet'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='movil'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>Cómo crear una aplicación móvil con JavaFX y Netbeans 6.5</title><content type='html'>Este video muestra lo sencillo que es crear y probar aplicaciones móviles desarrolladas en JavaFX script con Netbeans 6.5.&lt;br /&gt;&lt;br /&gt;Básicamente, sólo tienes que crear una aplicación y luego indicar que la vas a ejecutar con el emulador.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/NgXQ5bJhGKc&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/NgXQ5bJhGKc&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-1725610233403388582?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/1725610233403388582/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=1725610233403388582' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/1725610233403388582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/1725610233403388582'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/02/c.html' title='Cómo crear una aplicación móvil con JavaFX y Netbeans 6.5'/><author><name>Mauro</name><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-114930265400628746.post-1560521885192084167</id><published>2009-02-16T07:36:00.000-08:00</published><updated>2009-02-19T10:53:47.777-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nodos'/><category scheme='http://www.blogger.com/atom/ns#' term='texto'/><category scheme='http://www.blogger.com/atom/ns#' term='align'/><category scheme='http://www.blogger.com/atom/ns#' term='nodes'/><category scheme='http://www.blogger.com/atom/ns#' term='fxz'/><category scheme='http://www.blogger.com/atom/ns#' term='textalignment'/><category scheme='http://www.blogger.com/atom/ns#' term='illustratos'/><category scheme='http://www.blogger.com/atom/ns#' term='texts'/><category scheme='http://www.blogger.com/atom/ns#' term='nodo'/><category scheme='http://www.blogger.com/atom/ns#' term='node'/><category scheme='http://www.blogger.com/atom/ns#' term='text'/><category scheme='http://www.blogger.com/atom/ns#' term='alignment'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='textos'/><title type='text'>Como reemplazar y centrar textos incrustados en archivos Adobe Illustrator con JavaFX</title><content type='html'>Uno de los beneficios de crear gráfica para JavaFX con Adobe Illustrator, es que luego esta puede ser reemplazada sin necesidad de alterar el código. Esto permite cambiar rápidamente la apariencia de una aplicación o dotarla de "pieles" o "skins" (distintas apariencias, a elección del usuario). Estas plantillas, que permiten incluso cambiar la posición de los elementos en la interfaz de usuario, entre otras cosas, pueden contener textos, que son posibles de reemplazar (haciendo su contenido dinámico).&lt;br /&gt;&lt;br /&gt;Pero, para hacerlo hay un par de detalles que es necesario conocer.&lt;br /&gt;&lt;br /&gt;Primero crearé una plantilla con Adobe Illustrator:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/lDTy5CHSq60&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/lDTy5CHSq60&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Una vez generado el archivo .FXZ podemos analizar el código.&lt;br /&gt;&lt;br /&gt;Sólo me concentraré en la manipulación de textos, ya que en artículos anteriores he mostrado como trabajar con otro tipo de elementos gráficos generados con Adobe Illustrator.&lt;br /&gt;&lt;br /&gt;Primero, crearemos una clase que cargue el archivo gráfico (.fxz) y que obtenga de él los nodos con los objetos.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import javafx.scene.Node;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import javafx.fxd.UiStub;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;import javafx.scene.text.*;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;public class &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;gaugeui &lt;/span&gt;extends UiStub {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    override public var &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;url &lt;/span&gt;= "{__DIR__}gauge.fxz";&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    public var &lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;reflex&lt;/span&gt;: &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Node&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    public var needle: Node;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    public var decoration: Node;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    public var body: Node;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    public var &lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;dispvalue&lt;/span&gt;: &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Text&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    public-read var dispvaluew;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    public-read var dispvaluex;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    override protected function update() {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        &lt;span style="color: rgb(51, 255, 255);"&gt;reflex = getNode("reflex")&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        needle = getNode("needle");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        decoration = getNode("decoration");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        body = getNode("body");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        &lt;span style="color: rgb(51, 255, 255);"&gt;dispvalue =&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;getNode("dispvalue") &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;as Text&lt;/span&gt;&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        dispvaluew = dispvalue.boundsInLocal.width;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        dispvaluex = dispvalue.boundsInLocal.minX;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Revisemos el código:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;override public var url = "{__DIR__}gauge.fxz";&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Esa línea indica desde donde debe descargar el archivo con la gráfica: {__DIR__} apunta al mismo directorio que la aplicación;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    public var &lt;span style="color: rgb(255, 0, 0);"&gt;reflex&lt;/span&gt;: &lt;span style="color: rgb(255, 0, 0);"&gt;Node&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    public var needle: Node;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    public var decoration: Node;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    public var body: Node;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Declara algunas variables para contener otros elementos gráficos;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    public var &lt;span style="color: rgb(255, 0, 0);"&gt;dispvalue&lt;/span&gt;: &lt;span style="color: rgb(255, 0, 0);"&gt;Text&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    public-read var &lt;span style="color: rgb(255, 0, 0);"&gt;dispvaluew&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    public-read var &lt;span style="color: rgb(255, 0, 0);"&gt;dispvaluex&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Declara una variable (dispvalue) de tipo TEXTO, para obtener el nodo que contiene el texto que vamos a reemplazar en este ejercicio, y dos variables adicionales asociadas a ese texto: una (dispvaluew) que contendrá el ancho del area reservada originalmente para el texto y otra (dispvaluex) que contendrá la posición horizontal original para el área de texto;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;override protected function update()&lt;/span&gt; {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;       &lt;span style="color: rgb(102, 102, 102);"&gt; // obtiene los nodos graficos&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        &lt;span style="color: rgb(51, 255, 255);"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;reflex &lt;/span&gt;= &lt;span style="color: rgb(255, 0, 0);"&gt;getNode&lt;/span&gt;("reflex");&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        needle = getNode("needle");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        decoration = getNode("decoration");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        body = getNode("body");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        &lt;span style="color: rgb(102, 102, 102);"&gt;// obtiene el nodo, pero lo transforma en texto&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        &lt;span style="color: rgb(51, 255, 255);"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;dispvalue &lt;/span&gt;= &lt;span style="color: rgb(255, 0, 0);"&gt;getNode&lt;/span&gt;("dispvalue") &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;as Text&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        &lt;span style="color: rgb(102, 102, 102);"&gt;// obtiene el ancho del texto original&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        &lt;span style="color: rgb(51, 255, 255);"&gt;dispvaluew = dispvalue.boundsInLocal.width;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        &lt;span style="color: rgb(102, 102, 102);"&gt;// obtiene la posicion horizontal original del texto&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;        &lt;span style="color: rgb(51, 255, 255);"&gt;dispvaluex = dispvalue.boundsInLocal.minX;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Para rescatar los nodos desde el archivo .fxz, utilizamos los nombres de asignamos a los elementos en el diseño. En nuestro ejemplo, llamamos al elemento de texto que deseamos manipular "jfx:dispvalue" (la identificacion jfx: permite identificar las etiquetas de nodos que importará JavaFX), y por lo tanto, obtenemos ese nodo con un getNode("dispvalue"), e inmediatamente lo convertimos en un Text (as Text).&lt;br /&gt;&lt;br /&gt;Ahora bien, uno de los inconvenientes de la modificación de los textos desde un script, es que al modificar el contenido, se modifica el ancho del elemento que contiene el texto, y dependiendo de la alineación también puede modificarse la posición horizontal.&lt;br /&gt;&lt;br /&gt;Por eso, al obtener el nodo de texto original, también almaceno la posición (dispvaluex) y el ancho (dispvaluew) que tenía el texto en el diseño. Con esta información más la nueva información de ancho generada al modificar el contenido del texto, puedo calcular la posición centrada del texto.&lt;br /&gt;&lt;br /&gt;Para conseguirlo, puedo hacer algo como esto:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// instancia la clase que carga la gráfica (arriba)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;var ui = gaugeui{};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// variable (degree) que mostrará en el area de texto&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;var degree = 0.0 on replace {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    &lt;span style="color: rgb(102, 102, 102);"&gt;// actualiza contenido con numero entero convertido en string&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;ui.dispvalue.content&lt;/span&gt;="{degree as Integer}";&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    &lt;span style="color: rgb(102, 102, 102);"&gt;// obtiene nuevo ancho del texto (alterado por nuevo contenido)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;var w = ui.dispvalue.boundsInLocal.width&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    &lt;span style="color: rgb(102, 102, 102);"&gt;// calcula coordenada horizontal para mantener el texto&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    // centrado respecto a su posicion original en el diseño&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;    &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;ui.dispvalue.x = ui.dispvaluex +&lt;br /&gt;                 ui.dispvaluew / 2 - w / 2;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Al modificarse degree, obtiene su valor entero y lo convierte en un string. Esto lo hace al incluir la variable como parte de una cadena de texto entre paréntesis de llave... "{expresión}"&lt;br /&gt;&lt;br /&gt;A continuación, obtiene el nuevo ancho del texto modificado, con un: elemento_texto.boundsInLocal.width&lt;br /&gt;&lt;br /&gt;Finalmente, obtiene la nueva posición horizontal del texto, usando la posición original del texto en el diseño mas la mitad del ancho del texto original. En este punto sabemos cual era el punto medio del texto original (posición respecto a la cual centraremos el nuevo texto).&lt;br /&gt;&lt;br /&gt;A esa posición, restamos la mitad del nuevo ancho del texto.... y como resultado, el texto se mantiene visualmente centrado.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/-sYQM0LIuwU&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/-sYQM0LIuwU&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;La inconveniente con el uso de TextAlignment.CENTER, es que el texto se centra respecto a las demás líneas de un párrafo (con más de una línea), entonces, si usamos un texto con una sóla línea, TextAligment.CENTER no tiene ningún efecto.&lt;br /&gt;&lt;br /&gt;En resumen, hay que recuperar el nodo del texto por su nombre, convertilo y almacenarlo como Text, obtener el ancho y posición original del texto en el diseño... y calcular la posición horizontal del texto al modificar su contenido.&lt;br /&gt;&lt;br /&gt;Por cierto, es posible exportar los archivos Illustrator a .fxz sin los fonts, pero si te quieres asegurar que los textos se mantendrán en apariencia, tamaño y posición, es mejor incluirlos. El resultado no es extremadamente grande, un font típico pesa cerca de 50KB.&lt;br /&gt;&lt;br /&gt;Ojalá esto sea de utilidad.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-1560521885192084167?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/1560521885192084167/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=1560521885192084167' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/1560521885192084167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/1560521885192084167'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/02/como-reemplazar-y-centrar-textos.html' title='Como reemplazar y centrar textos incrustados en archivos Adobe Illustrator con JavaFX'/><author><name>Mauro</name><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-114930265400628746.post-8772087378787655113</id><published>2009-02-15T10:33:00.000-08:00</published><updated>2009-02-17T15:54:31.108-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='app engine'/><category scheme='http://www.blogger.com/atom/ns#' term='configuracion'/><category scheme='http://www.blogger.com/atom/ns#' term='configure'/><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='free'/><category scheme='http://www.blogger.com/atom/ns#' term='jws'/><category scheme='http://www.blogger.com/atom/ns#' term='hospedaje'/><category scheme='http://www.blogger.com/atom/ns#' term='hosting'/><category scheme='http://www.blogger.com/atom/ns#' term='java web start'/><category scheme='http://www.blogger.com/atom/ns#' term='app.yaml'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='configurar'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='gratuito'/><title type='text'>Como hospedar Aplicaciones Java Web Start en Google App Engine</title><content type='html'>Estaba buscando donde hospedar un par de demos Java Web Start y finalmente recordé que tenía una cuenta de Google App Engine, así que me puse a investigar como hospedar allí los archivos JNLP y JAR de mis aplicaciones.&lt;br /&gt;&lt;br /&gt;Hacerlo no resulta obvio, pues Google App Engine no ofrece un acceso de tipo FTP o un upload de archivos via web. La manera de hacerlo es sincronizando una aplicación Python local con los servidores de Google utilizando el utilitario appcfg.py update path/nombre_aplicacion_local, y la forma de subir los contenidos estáticos es incluirlos como parte de la aplicación Python y configurar la aplicación para servir contenidos estáticos e incluir una definición del MIME type para los archivos JNLP, de manera que sean bien interpretados por los navegadores (IE 7 despliega el contenido del archivo JNLP en vez de lanzar la aplicación, si el servidor no está configurado con el tipo JNLP entre los tipos servidos).&lt;br /&gt;&lt;br /&gt;La solución final fue esta (creo que hay otras, pero esta fue la que me funcionó y no quise gastar más tiempo en investigar ;D):&lt;br /&gt;&lt;br /&gt;- Creé dos subdirectorios como parte de una aplicación Python, en la ruta demos en mi copia local de Google App Engine... los llamé /exec y /jfx&lt;br /&gt;&lt;br /&gt;- En el directorio /jfx copié los archivos JNLP&lt;br /&gt;&lt;br /&gt;- En el directorio /exec copié los archivos JAR con mis aplicaciones JWS&lt;br /&gt;&lt;br /&gt;- Luego, configuré el archivo app.yaml en el raíz de mi aplicación Python, de la siguiente manera:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;application: javafxdemo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;version: 3&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;runtime: python&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;api_version: 1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;handlers:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;- url: /exec&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;  static_dir: exec&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;- url: /jfx&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;  static_dir: jfx&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;  mime_type: application/x-java-jnlp-file&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;- url: .*&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;  script: javafxdemo.py&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Finalmente, ejecuté el comando: appcfg.py update demos\javafxdemo ... que sincronizó el directorio local con la aplicación en Google App Engine.&lt;br /&gt;&lt;br /&gt;Previamente modifiqué los archivos JNLP, de manera de explicitar que los archivos JNLP y los JAR están en directorios separados. Así que alteré las siguientes líneas:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;&amp;lt;jnlp spec="1.0+" codebase=&lt;br /&gt;"&lt;span style="color: rgb(51, 255, 255);"&gt;http://javafxdemo.appspot.com/&lt;/span&gt;"&lt;br /&gt;href="&lt;span style="color: rgb(102, 255, 255);"&gt;jfx/&lt;/span&gt;Knob.jnlp"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;&amp;lt;jar href="&lt;span style="color: rgb(51, 255, 255);"&gt;exec/&lt;/span&gt;Knob.jar" main="true"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Espero que les sirva este dato (por lo menos me servirá de ayuda-memoria la próxima)... o que me digan donde puedo hospedar (gratuítamente) contenidos estáticos sin tanto jaleo! jaja! y con 10GB de tráfico de salida gratuito ;D&lt;br /&gt;&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-8772087378787655113?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/8772087378787655113/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=8772087378787655113' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/8772087378787655113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/8772087378787655113'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/02/como-hospedar-aplicaciones-java-web.html' title='Como hospedar Aplicaciones Java Web Start en Google App Engine'/><author><name>Mauro</name><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-114930265400628746.post-3028936597522209914</id><published>2009-02-15T03:14:00.000-08:00</published><updated>2009-02-15T04:05:06.887-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='componente'/><category scheme='http://www.blogger.com/atom/ns#' term='descarga'/><category scheme='http://www.blogger.com/atom/ns#' term='world'/><category scheme='http://www.blogger.com/atom/ns#' term='codigo abierto'/><category scheme='http://www.blogger.com/atom/ns#' term='mundo'/><category scheme='http://www.blogger.com/atom/ns#' term='visitas'/><category scheme='http://www.blogger.com/atom/ns#' term='component'/><category scheme='http://www.blogger.com/atom/ns#' term='components'/><category scheme='http://www.blogger.com/atom/ns#' term='componentes'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='download'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='visits'/><title type='text'>Stage Controller, almost 1000 downloads - Casi 1000 visitas para descargar el Stage Controller</title><content type='html'>Almost 1000 people visited the blog in a day to download the Stage Controller class. Thanks to all of you for your interest.&lt;br /&gt;&lt;br /&gt;La verdad me sorprendió, pero casi 1000 personas visitaron el blog en un día para descargar el componente que controla los Stage... :D ... Visitas desde Nigeria, China, India, EEUU, Brazil, etc. Se ve que JavaFX está consiguiendo una comunidad global de desarrolladores, ¿no?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_esUBlqKjDzk/SZf8e0iLlDI/AAAAAAAAAo4/k3bJ4zH9w6E/s1600-h/map.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 235px;" src="http://4.bp.blogspot.com/_esUBlqKjDzk/SZf8e0iLlDI/AAAAAAAAAo4/k3bJ4zH9w6E/s400/map.png" alt="" id="BLOGGER_PHOTO_ID_5302984692680332338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Gracias a todos por su interés.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-3028936597522209914?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/3028936597522209914/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=3028936597522209914' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/3028936597522209914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/3028936597522209914'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/02/casi-1000-visitas-para-descargar-el.html' title='Stage Controller, almost 1000 downloads - Casi 1000 visitas para descargar el Stage Controller'/><author><name>Mauro</name><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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_esUBlqKjDzk/SZf8e0iLlDI/AAAAAAAAAo4/k3bJ4zH9w6E/s72-c/map.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-114930265400628746.post-3747933938495263834</id><published>2009-02-14T18:02:00.001-08:00</published><updated>2009-02-14T18:09:19.759-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='componente'/><category scheme='http://www.blogger.com/atom/ns#' term='perilla'/><category scheme='http://www.blogger.com/atom/ns#' term='codigo abierto'/><category scheme='http://www.blogger.com/atom/ns#' term='documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='ventana'/><category scheme='http://www.blogger.com/atom/ns#' term='window'/><category scheme='http://www.blogger.com/atom/ns#' term='component'/><category scheme='http://www.blogger.com/atom/ns#' term='components'/><category scheme='http://www.blogger.com/atom/ns#' term='componentes'/><category scheme='http://www.blogger.com/atom/ns#' term='knob'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='stage'/><category scheme='http://www.blogger.com/atom/ns#' term='documentacion'/><category scheme='http://www.blogger.com/atom/ns#' term='controller'/><category scheme='http://www.blogger.com/atom/ns#' term='demo'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='demostracion'/><title type='text'>My Google Code: Knob &amp; Stage Controller / Perilla y controlador de Stage</title><content type='html'>Two of the components I developed are now hosted at Google Code. They include documentation about how to use them.&lt;br /&gt;&lt;br /&gt;Dos de los componentes que desarrollé están ahora hospedados en Google Code. Ellos incluyen la documentación sobre como usarlos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;Knob control / Perilla&lt;/span&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javafxknob/"&gt;http://code.google.com/p/javafxknob/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://javafxdemo.appspot.com/jfx/Knob.jnlp"&gt;Java Web Start demo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 0);"&gt;Stage Controller / Controlador de Stage&lt;/span&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javafxstagecontroller/"&gt;http://code.google.com/p/javafxstagecontroller/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://javafxdemo.appspot.com/jfx/stageController.jnlp"&gt;Java Web Start demo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-3747933938495263834?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/3747933938495263834/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=3747933938495263834' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/3747933938495263834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/3747933938495263834'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/02/my-google-code-knob-stage-controller.html' title='My Google Code: Knob &amp; Stage Controller / Perilla y controlador de Stage'/><author><name>Mauro</name><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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-114930265400628746.post-4251263954309136896</id><published>2009-02-14T17:44:00.000-08:00</published><updated>2009-02-14T17:56:16.620-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='1.1'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='escritorio'/><category scheme='http://www.blogger.com/atom/ns#' term='telefono'/><category scheme='http://www.blogger.com/atom/ns#' term='desktop'/><category scheme='http://www.blogger.com/atom/ns#' term='portabilidad'/><category scheme='http://www.blogger.com/atom/ns#' term='movil'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='wora'/><category scheme='http://www.blogger.com/atom/ns#' term='celular'/><title type='text'>JavaFX 1.1 liberado (incl. JavaFX Mobile)</title><content type='html'>Fue liberada la versión 1.1 de JavaFX, que incluye el primer release de JavaFX Mobile.&lt;br /&gt;&lt;br /&gt;Ahora los programas desarrollados con JavaFX de escritorio corren sin modificación en JavaFX Mobile, a diferencia -por ejemplo- de Flex, que tiene su propia versión para móviles, FlexLite.&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);font-size:180%;" &gt;&lt;br /&gt;&lt;a href="http://www.javafx.com/launch/"&gt;http://www.javafx.com/launch/&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El SDK 1.1 incluye un emulador que permite probar que tal funciona la portabilidad escritorio -&gt; móvil&lt;br /&gt;&lt;br /&gt;También, a primera vista, se ven algunos detalles de mejor integracion con Netbeans 6.5, como algunos elementos en la paleta de componentes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-4251263954309136896?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/4251263954309136896/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=4251263954309136896' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/4251263954309136896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/4251263954309136896'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/02/javafx-11-liberado-incl-javafx-mobile.html' title='JavaFX 1.1 liberado (incl. JavaFX Mobile)'/><author><name>Mauro</name><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-114930265400628746.post-1785493981157481233</id><published>2009-02-12T01:52:00.000-08:00</published><updated>2009-02-15T09:53:21.002-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='demostration'/><category scheme='http://www.blogger.com/atom/ns#' term='codigo'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='posicion'/><category scheme='http://www.blogger.com/atom/ns#' term='ventana'/><category scheme='http://www.blogger.com/atom/ns#' term='position'/><category scheme='http://www.blogger.com/atom/ns#' term='window'/><category scheme='http://www.blogger.com/atom/ns#' term='stage'/><category scheme='http://www.blogger.com/atom/ns#' term='example'/><category scheme='http://www.blogger.com/atom/ns#' term='controller'/><category scheme='http://www.blogger.com/atom/ns#' term='tamaño'/><category scheme='http://www.blogger.com/atom/ns#' term='control'/><category scheme='http://www.blogger.com/atom/ns#' term='demo'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='controlador'/><category scheme='http://www.blogger.com/atom/ns#' term='resize'/><category scheme='http://www.blogger.com/atom/ns#' term='demostracion'/><title type='text'>JavaFX: Stage "controller" demo - Demo "controlador" de Stage</title><content type='html'>This small code demostrates how easy is to handle the onResize and onMove events implemented by the Stage controller (&lt;a href="http://aprendiendo-javafx.blogspot.com/2009/02/javafx-stage-controller-un-controlador.html"&gt;Stage Controller&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Este pequeño código demuestra lo fácil que es manejar los eventos onResize y onMove implementados por el controlador de Stage (&lt;a href="http://aprendiendo-javafx.blogspot.com/2009/02/javafx-stage-controller-un-controlador.html"&gt;Controlador de Stage&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Jmm6Yd1jlR8&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/Jmm6Yd1jlR8&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Here's the code / Aquí está el código:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;var img = Image { url: "{__DIR__}myimage.jpg" };&lt;br /&gt;var rect:Rectangle;&lt;br /&gt;var sw:Integer;&lt;br /&gt;var sh:Integer;&lt;br /&gt;&lt;br /&gt;var &lt;span style="COLOR: rgb(255,0,0);font-size:130%;" &gt;&lt;span style="FONT-WEIGHT: bold"&gt;cs &lt;/span&gt;&lt;/span&gt;= controlStage {&lt;br /&gt;  timeToCallFunctions:0.001s&lt;br /&gt;  timeToCheckPosSize:0.001s&lt;br /&gt;  initialPosition:controlStage.CENTER, persist:true&lt;br /&gt;  checkMinWidth:true, minWidth:270,&lt;br /&gt;  checkMinHeight:true, minHeight:270,&lt;br /&gt;  stickyBorders:true&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(255,255,51)"&gt;    onResize: function(e) { clip(e) }&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(255,255,51)"&gt;    onMove: function(e) { clip(e) }&lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(102,102,102)"&gt;// screen resolution&lt;/span&gt;&lt;br /&gt;sw = cs.maxScrWidth;&lt;br /&gt;sh = cs.maxScrHeight;&lt;br /&gt;&lt;br /&gt;function clip(r:Rectangle2D) {&lt;br /&gt;  rect = Rectangle {&lt;br /&gt;      x: r.minX - (sw - img.width) / 2&lt;br /&gt;      y: r.minY - (sh - img.height) /2&lt;br /&gt;      width: r.width, height: r.height&lt;br /&gt;  }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;Stage {&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(255,0,0)"&gt;    width: bind cs.width with inverse&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(255,0,0)"&gt;    height: bind cs.height with inverse&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(255,0,0)"&gt;    x: bind cs.x with inverse&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(255,0,0)"&gt;    y: bind cs.y with inverse&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(255,0,0)"&gt;    onClose: function() { cs.persistStage() };&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  scene: Scene { content:&lt;br /&gt;      ImageView {&lt;br /&gt;          translateX: bind -rect.x&lt;br /&gt;          translateY: bind -rect.y&lt;br /&gt;          image: img&lt;br /&gt;          clip: rect&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javafxstagecontroller/"&gt;&lt;strong&gt;&lt;span style="COLOR: rgb(255,0,0);font-size:180%;" &gt;Download the Netbeans 6.5 project, here. Descarga el proyecto Netbeans 6.5, aquí.&lt;/span&gt;&lt;/strong&gt; &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-1785493981157481233?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/1785493981157481233/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=1785493981157481233' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/1785493981157481233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/1785493981157481233'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/02/javafx-stage-controller-demo-demo.html' title='JavaFX: Stage &quot;controller&quot; demo - Demo &quot;controlador&quot; de Stage'/><author><name>Mauro</name><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-114930265400628746.post-4353216600234067115</id><published>2009-02-06T15:15:00.000-08:00</published><updated>2009-02-15T09:52:33.797-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='function'/><category scheme='http://www.blogger.com/atom/ns#' term='stage'/><category scheme='http://www.blogger.com/atom/ns#' term='tamaño'/><category scheme='http://www.blogger.com/atom/ns#' term='posicion'/><category scheme='http://www.blogger.com/atom/ns#' term='ventana'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='resize'/><category scheme='http://www.blogger.com/atom/ns#' term='position'/><category scheme='http://www.blogger.com/atom/ns#' term='trigger'/><title type='text'>JavaFX: A Stage "controller" / Un "controlador" de Stage</title><content type='html'>&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;&lt;span class="Apple-style-span" style="COLOR: rgb(255,255,51)"&gt;Update: Stage Controller hosted on &lt;a href="http://code.google.com/p/javafxstagecontroller/"&gt;Google Code&lt;/a&gt;, includes documentation for using the class. &lt;a href="http://javafxdemo.appspot.com/jfx/stageController.jnlp"&gt;Click Here&lt;/a&gt; for a Java Web Start example.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/DHlLrnF3Qxg&amp;amp;hl=es&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/DHlLrnF3Qxg&amp;amp;hl=es&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;This class allows you to "attach" some automatic behaviors to your app window (Stage). For example, you can make the window to stick to the edges of the screen with a simple... stickyBorders:true ... or select the borders you want to make sticky... ie. stickyLeft:true&lt;br /&gt;&lt;br /&gt;You can persist the position and/or size of the window (with a simple persist:true, persistPosition:true or persistSize:true). You can anchor the window to the borders too (ie. anchorBottom:true). Enforce minimum and maximum sizes or enforce a specific size for the window or keep it in the middle of the screen, etc.&lt;br /&gt;&lt;br /&gt;It can trigger two events: onResize and onMove... so, your app can obtain it screen position and size at any moment (&lt;a href="http://aprendiendo-javafx.blogspot.com/2009/02/javafx-stage-controller-demo-demo.html"&gt;demo, handling events&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;There are many options and combinations.&lt;br /&gt;&lt;br /&gt;Enjoy it ;)&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;&lt;span class="Apple-style-span" style="COLOR: rgb(255,255,51)"&gt;Actualización: Ahora el Controlador de Stage es capaz de mantener la posición y/o tamaño de la ventana de la aplicación entre sesiones.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Esta clase permite definir comportamientos automáticos para la ventana de tu aplicación. Por ejemplo, puedes hacer que la ventana se "pegue" a los bordes de la pantalla con un simple... stickyBorders:true ... o seleccionar los bordes que quieres que sean "pegajosos"... ej. stickyLeft:true&lt;br /&gt;&lt;br /&gt;Puedes hacer que la aplicación recuerde su posición y/o tamaño entre sesiones de uso (con un simple persist:true, persistPosition:true o persistSize:true). Puedes "anclar" la ventana a los bordes también (ej. anchorBottom:true). Forzar tamaños mínimos y máximos o un tamaño específico para la ventana... o mantener la ventana en el centro de la pantalla.&lt;br /&gt;&lt;br /&gt;También puede gatillar dos eventos: onResize (si cambia el tamaño de la ventana) y onMove (si cambia de posición la ventana en la pantalla)... de esa manera la aplicación puede saber -en todo momento- en que área de la pantalla está localizada o que tamaño tiene (&lt;a href="http://aprendiendo-javafx.blogspot.com/2009/02/javafx-stage-controller-demo-demo.html"&gt;demo, manejando los eventos&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Hay muchas opciones y combinaciones.&lt;br /&gt;&lt;br /&gt;Ojalá sea útil ;)&lt;br /&gt;&lt;br /&gt;How to use it / Cómo se usa...&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span class="Apple-style-span" style="COLOR: rgb(102,102,102)"&gt;/** Stage controller */&lt;/span&gt;&lt;br /&gt;var &lt;span class="Apple-style-span" style="COLOR: rgb(51,255,51)"&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;cs = controlStage&lt;/span&gt;&lt;/span&gt; { &lt;span class="Apple-style-span" style="COLOR: rgb(102,102,102)"&gt;//persistFile: "testStage.persist"&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="COLOR: rgb(255,102,0)"&gt;initialPosition:controlStage.RIGHT + controlStage.TOP, persist:true&lt;br /&gt;checkMinWidth:true, minWidth:440, checkMinHeight:true, minHeight:270,&lt;br /&gt;stickyBorders:true&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="COLOR: rgb(51,255,255)"&gt;    onResize: function(e):Void {&lt;br /&gt;  println("resize to {e.width},{e.height} at {e.minX},{e.minY}");&lt;br /&gt;}&lt;br /&gt;onMove: function(e):Void {&lt;br /&gt;  println("moved to {e.minX},{e.minY} with {e.width},{e.height}")&lt;br /&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;Stage {&lt;br /&gt;&lt;span class="Apple-style-span" style="COLOR: rgb(102,102,102)"&gt;// bind Stage (window) to the controller&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="COLOR: rgb(204,102,204)"&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;    width: bind cs.width with inverse&lt;br /&gt;height: bind cs.height with inverse&lt;br /&gt;x: bind cs.x with inverse&lt;br /&gt;y: bind cs.y with inverse&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="COLOR: rgb(102,102,102)"&gt;// on stage close, stores last position and size&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="COLOR: rgb(255,0,0)"&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;onClose:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="COLOR: rgb(255,0,0)"&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt; function() { &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="COLOR: rgb(255,0,0)"&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;cs.persistStage()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="COLOR: rgb(255,0,0)"&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt; };&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;scene: Scene {  ....&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javafxstagecontroller/"&gt;&lt;span style="COLOR: rgb(255,0,0);font-size:180%;" &gt;&lt;span style="FONT-WEIGHT: bold"&gt;Descargar el proyecto Netbeans 6.5.... DOWNLOAD the Netbeans 6.5 project.... CLICK HERE&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-4353216600234067115?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/4353216600234067115/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=4353216600234067115' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/4353216600234067115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/4353216600234067115'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/02/javafx-stage-controller-un-controlador.html' title='JavaFX: A Stage &quot;controller&quot; / Un &quot;controlador&quot; de Stage'/><author><name>Mauro</name><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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-114930265400628746.post-3657211495676339302</id><published>2009-02-04T18:13:00.001-08:00</published><updated>2009-02-11T17:46:58.317-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='libros'/><category scheme='http://www.blogger.com/atom/ns#' term='autores'/><category scheme='http://www.blogger.com/atom/ns#' term='online'/><category scheme='http://www.blogger.com/atom/ns#' term='author'/><category scheme='http://www.blogger.com/atom/ns#' term='course'/><category scheme='http://www.blogger.com/atom/ns#' term='free'/><category scheme='http://www.blogger.com/atom/ns#' term='website'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='curso'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='site'/><category scheme='http://www.blogger.com/atom/ns#' term='autor'/><category scheme='http://www.blogger.com/atom/ns#' term='sitio'/><category scheme='http://www.blogger.com/atom/ns#' term='gratis'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><category scheme='http://www.blogger.com/atom/ns#' term='gratuito'/><title type='text'>Curso gratuito de JavaFX Script, de 15 semanas de duración</title><content type='html'>A partir del 30 de Enero pasado, se inició un curso gratuito por internet, para aprender JavaFX Script. Una vez por semana, los autores (Jim Weaver** &amp;amp; Sang Shin) publican el material necesario para experimentar y estudiar el lenguaje.&lt;br /&gt;&lt;br /&gt;Solo tienen que mirar una vez por semana este sitio, al final del curso los participantes recibirán un diploma por su participación (aunque simbólico mas que nada, porque no es respaldado por ninguna institución):&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;a style="color: rgb(255, 0, 0);" href="http://www.javapassion.com/javafx/"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;http://www.javapassion.com/javafx/&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;** Jim Weaver es autor de dos libros sobre JavaFX Script:&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;- &lt;/span&gt;&lt;a href="http://www.amazon.com/Pro-JavaFX-trade-Platform-Technology/dp/1430218754/ref=pd_bbs_sr_2?ie=UTF8&amp;amp;s=books&amp;amp;qid=1233800286&amp;amp;sr=8-2"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Pro JavaFX™ Platform: Script, Desktop and Mobile RIA with Java™ Technology&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;- &lt;/span&gt;&lt;a href="http://www.amazon.com/JavaFX-Script-Scripting-Client-side-Applications/dp/1590599454/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1233800286&amp;amp;sr=8-1"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;JavaFX Script: Dynamic Java Scripting for Rich Internet/Client-side Applications&lt;/span&gt;&lt;/a&gt; (quedó desactualizado por los cambios en el lenguaje).&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;br /&gt;.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-3657211495676339302?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/3657211495676339302/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=3657211495676339302' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/3657211495676339302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/3657211495676339302'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/02/curso-gratuito-de-javafx-script-de-15.html' title='Curso gratuito de JavaFX Script, de 15 semanas de duración'/><author><name>Mauro</name><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-114930265400628746.post-5935733562243932803</id><published>2009-02-04T17:27:00.001-08:00</published><updated>2009-02-05T17:19:49.685-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='funciones'/><category scheme='http://www.blogger.com/atom/ns#' term='evaluacion'/><category scheme='http://www.blogger.com/atom/ns#' term='statement'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='sintaxis'/><category scheme='http://www.blogger.com/atom/ns#' term='syntaxis'/><category scheme='http://www.blogger.com/atom/ns#' term='expresiones'/><category scheme='http://www.blogger.com/atom/ns#' term='codigo'/><category scheme='http://www.blogger.com/atom/ns#' term='return'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>JavaFX: un detalle importante sobre como se retornan valores</title><content type='html'>Si se han fijado, muchas veces nos encontramos con cosas como esta en el código de una aplicación JavaFX:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;function figura():Node {&lt;br /&gt;Group {&lt;br /&gt;    content: Line { startX:0,&lt;br /&gt;    startY:0, endX:100,&lt;br /&gt;    endY:100 }&lt;br /&gt;}&lt;br /&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Ahora, según la definición de la función, esta debe retornar un NODO (un objeto que puede ser una figura geométrica o una imagen, por ejemplo). Pero ese código, nunca ejecuta "explícitamente" un return.&lt;br /&gt;&lt;br /&gt;Lo que sucede, es que JavaFX Script asume (salvo que exista explícitamente una instrucción RETURN), que la última expresión evaluada es lo que se retorna. En el caso del código (arriba), retornaría el Group.&lt;br /&gt;&lt;br /&gt;El código escrito de manera más "formal" podría ser este:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;function figura():Node {&lt;br /&gt;var objeto = Group {&lt;br /&gt;    content: Line { startX:0,&lt;br /&gt;        startY:0, endX:100,&lt;br /&gt;        endY:100 }&lt;br /&gt;};&lt;br /&gt;return objeto;&lt;br /&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Ahora, esta flexibilidad no deja de tener su encanto al poder por ejemplo escribir algo como:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;var resultado:Number = if (a==b)&lt;br /&gt; then { a+b/c } else { d/e+f };&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;... o poder decribir el cuerpo de una función como:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;function calculo(a:Number,&lt;br /&gt; b:Number):Number {&lt;br /&gt;&lt;br /&gt;     a + 1000 / b&lt;br /&gt;&lt;br /&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;En realidad, es un detalle que no deja de ser comodo y que hace más comprensible y breve el código... quizas más natural (siendo siempre opcional, y teniendo siempre la posibilidad de ser mas "formal" al codificar).&lt;br /&gt;&lt;br /&gt;Ojalá esta explicación ayude a que comprendan mejor el código de algunos scripts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-5935733562243932803?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/5935733562243932803/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=5935733562243932803' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/5935733562243932803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/5935733562243932803'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/02/javafx-un-detalle-importante-sobre-como.html' title='JavaFX: un detalle importante sobre como se retornan valores'/><author><name>Mauro</name><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-114930265400628746.post-5333360043166664177</id><published>2009-02-04T11:32:00.000-08:00</published><updated>2009-02-11T22:51:15.339-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='colision'/><category scheme='http://www.blogger.com/atom/ns#' term='juego'/><category scheme='http://www.blogger.com/atom/ns#' term='real'/><category scheme='http://www.blogger.com/atom/ns#' term='animaciones'/><category scheme='http://www.blogger.com/atom/ns#' term='phys2d'/><category scheme='http://www.blogger.com/atom/ns#' term='animacion'/><category scheme='http://www.blogger.com/atom/ns#' term='collision'/><category scheme='http://www.blogger.com/atom/ns#' term='juegos'/><category scheme='http://www.blogger.com/atom/ns#' term='detection'/><category scheme='http://www.blogger.com/atom/ns#' term='physics'/><category scheme='http://www.blogger.com/atom/ns#' term='experiment'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='deteccion'/><category scheme='http://www.blogger.com/atom/ns#' term='animation'/><category scheme='http://www.blogger.com/atom/ns#' term='experimento'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='fisica'/><category scheme='http://www.blogger.com/atom/ns#' term='science'/><category scheme='http://www.blogger.com/atom/ns#' term='ciencia'/><title type='text'>JavaFX + Phys2D : JavaFX aprende sobre física (ojo, no solo ciencia)</title><content type='html'>Phys2D es una excelente API de física, que no solo sirve para simular descabellados experimentos de cientificos encerrados en sus laboratorios o estudiantes queriendo experimentar lo aprendido en clases, esta API es excelente para desarrollar JUEGOS. Si, porque con ella puedes hacer que los elementos del juego se comporten como elementos reales, que se deslicen por pendientes, reboten o se comporten de manera elástica, aceleren, frenen o colisionen.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/2JmNBzSkw00&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/2JmNBzSkw00&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Lo mejor es que es código abierto... para más información, &lt;a href="http://www.cokeandcode.com/phys2d/"&gt;visita el sitio web de Phys2D&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Este ejemplo comprende tres archivos:&lt;br /&gt;&lt;br /&gt;1) la biblioteca de Phys2D, que debe estar incluida en los libraries del proyecto (y que incluyo en el directorio lib).&lt;br /&gt;&lt;br /&gt;2) una clase que describe EL MODELO de elementos en la simulación... en este caso, incluye una BASE (o anchor, ancla en inglés... que es el elemento fijo en la parte superior), un RESORTE, una masa y un trozo rigido que lo une a la segunda masa. En otras palabras, es un péndulo doble que cuelga por un resorte. &lt;span style="font-weight: bold;"&gt;OJO: Porque el modelo es una CLASE JAVA... así que de pasada pueden ver lo simple que es integrar Java + JavaFX Script.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;3) la animación en JavaFX, que incluye un Timeline para generar los cálculos y el código que pinta los elementos dependiendo de las coordenadas recibidas desde el modelo físico. Bastante simple, como verán... pero no menos sofisticado.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;font-size:180%;" &gt;&lt;a href="http://sites.google.com/site/javafxscript/Home/Phys2D.rar?attredirects=0"&gt;Descarga el projecto Netbeans 6.5. DOWNLOAD the Netbeans project, here!&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-5333360043166664177?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/5333360043166664177/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=5333360043166664177' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/5333360043166664177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/5333360043166664177'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/02/javafx-phys2d-javafx-aprende-sobre.html' title='JavaFX + Phys2D : JavaFX aprende sobre física (ojo, no solo ciencia)'/><author><name>Mauro</name><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-114930265400628746.post-8976494241762182864</id><published>2009-02-04T01:07:00.000-08:00</published><updated>2009-02-15T09:54:35.792-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='value'/><category scheme='http://www.blogger.com/atom/ns#' term='grafica'/><category scheme='http://www.blogger.com/atom/ns#' term='input'/><category scheme='http://www.blogger.com/atom/ns#' term='adjust'/><category scheme='http://www.blogger.com/atom/ns#' term='codigo'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='source'/><category scheme='http://www.blogger.com/atom/ns#' term='graphic graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='ajustar'/><category scheme='http://www.blogger.com/atom/ns#' term='component'/><category scheme='http://www.blogger.com/atom/ns#' term='knob'/><category scheme='http://www.blogger.com/atom/ns#' term='example'/><category scheme='http://www.blogger.com/atom/ns#' term='ajuste'/><category scheme='http://www.blogger.com/atom/ns#' term='control'/><category scheme='http://www.blogger.com/atom/ns#' term='entrada'/><category scheme='http://www.blogger.com/atom/ns#' term='adjustment'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='valor'/><category scheme='http://www.blogger.com/atom/ns#' term='fuente'/><title type='text'>JavaFX: a Knob control - Un control "de perilla"</title><content type='html'>&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;&lt;span class="Apple-style-span" style="COLOR: rgb(255,255,51)"&gt;Update: Stage Controller hosted on &lt;a href="http://code.google.com/p/javafxknob/"&gt;Google Code&lt;/a&gt;, includes documentation for using the class. &lt;a href="http://javafxdemo.appspot.com/jfx/Knob.jnlp"&gt;Click Here&lt;/a&gt; for a Java Web Start example.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;English&lt;/span&gt;: Please, visit the &lt;a href="http://code.google.com/p/javafxknob/"&gt;Google Code hosted project&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;JavaFX me está convirtiendo realmente en una fábrica de componentes... este control lo desarrollé en menos de un día. Como verán es bastante sofisticado. No voy a entrar en detalles por ahora, pero el código del programa de ejemplo explota varias de sus funcionalidades.&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Cp2es9SGJVc&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/Cp2es9SGJVc&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Una de las cosas que dejo pendiente de demostrar, es cómo se pueden agregar nuevos tipos de perillas... basta con crear la gráfica en Adobe Illustrator y luego crear una clase que herede de la clase basicKnob (update: ver orangeKnob.fx). En esa nueva clase, pueden incluir detalles propios de la gráfica asociada... entre otras cosas, el nombre del archivo que contiene la grafica, las dimensiones de la nueva perilla (ancho y alto) y el radio inicial y final de las lineas del dial (la distancia al radio de la perilla), de manera que el componente pueda dibujar las lineas que le solicite el usuario y que estas lineas coincidan con la gráfica importada (update: ahora también incluye el radio inicial y final de las líneas cortas en el dial).&lt;br /&gt;&lt;br /&gt;Aquí va el código fuente del componente, el programa demostrativo, los archivos de gráficos, etc. Sólo tienen que abrirlo en Netbeans 6.5 y ejecutarlo ;D&lt;br /&gt;&lt;br /&gt;¡Ah! un detalle que me dió dolor de cabeza, hasta que recordé que lo había leído antes... si se fijan en el código, por cada control instancio la gráfica de la perilla ( ui: orangeKnob{} )... esto es así, porque si creo una sóla instancia y luego la enlazo desde varios lugares, solo queda activo el último enlace.... quizás debería ver si se puede crear algo como una versión "estática" con la gráfica... pero eso tengo que investigarlo y luego probar si funciona.&lt;br /&gt;&lt;a style="FONT-WEIGHT: bold" href="http://code.google.com/p/javafxknob/"&gt;&lt;span style="font-size:180%;"&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(255,0,0)"&gt;Descarga el proyecto completo de Netbeans 6.5... Download the complete Netbeans project... CLICK HERE.&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-8976494241762182864?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/8976494241762182864/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=8976494241762182864' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/8976494241762182864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/8976494241762182864'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/02/javafx-un-control-de-perilla.html' title='JavaFX: a Knob control - Un control &quot;de perilla&quot;'/><author><name>Mauro</name><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-114930265400628746.post-4500797634747398583</id><published>2009-02-02T03:10:00.000-08:00</published><updated>2009-02-11T22:52:55.330-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='how'/><category scheme='http://www.blogger.com/atom/ns#' term='ria'/><category scheme='http://www.blogger.com/atom/ns#' term='como'/><category scheme='http://www.blogger.com/atom/ns#' term='componente'/><category scheme='http://www.blogger.com/atom/ns#' term='floating'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='programacion'/><category scheme='http://www.blogger.com/atom/ns#' term='popupmenu'/><category scheme='http://www.blogger.com/atom/ns#' term='component'/><category scheme='http://www.blogger.com/atom/ns#' term='menu'/><category scheme='http://www.blogger.com/atom/ns#' term='flotante'/><category scheme='http://www.blogger.com/atom/ns#' term='hacer'/><category scheme='http://www.blogger.com/atom/ns#' term='popup'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='to'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>JavaFX: Menú flotante (popup menu)</title><content type='html'>Este código utiliza un menú flotante que implemente yo. Es un trabajo en progreso, así que tiene un par de detalles pendientes... pero, por ahora, quizás le puede servir a alguien para su aplicación o para aprender como funciona...&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/6_O_0ECW0_Q&amp;amp;hl=es&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/6_O_0ECW0_Q&amp;amp;hl=es&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Como he dicho, estoy aprendiendo JavaFX script, así que es probable que haga cosas de maneras inapropiadas, no se crean que soy un experto! ;) ... aun... en todo caso, implementar el menú flotante me tomó sólo un par de horas desde que comencé (de cero), para que vean lo productivo que puede ser este lenguaje.&lt;br /&gt;&lt;br /&gt;Por cierto, se pueden crear menús flotantes sin tanta configuración, sólo son necesarias las opciones (el texto de la opción [text:] y la función a las que están asociadas [call:]), las demás configuraciones son opcionales... y ojo, que hay bastantes opciones por probar y combinar.... por cierto, JavaFX script permite hacer combinaciones como el Timeline que agregué para que cambie el color del borde del menú flotante. Quizás puedes experimentar agregándole un Interpolador de resorte para que se vea más simpático al aparecer o elegir una opción, o que el menú aparezca rotando cuando es lanzado, etc.&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:180%;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;a href="http://sites.google.com/site/javafxscript/Home/popupMenu2.rar?attredirects=0"&gt;Aquí está el proyecto Netbeans 6.5 completo (Download the complete Netbeans project here, alpha version).&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;package popupmenu;&lt;br /&gt;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;import javafx.scene.*;&lt;br /&gt;import javafx.scene.text.*;&lt;br /&gt;import javafx.scene.paint.*;&lt;br /&gt;import javafx.scene.shape.*;&lt;br /&gt;import javafx.animation.*;&lt;br /&gt;import javafx.scene.input.*;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;var &lt;strong&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;screenWidth&lt;/span&gt;&lt;/strong&gt;=500.0;&lt;br /&gt;var &lt;span style="color: rgb(51, 255, 51);"&gt;&lt;strong&gt;screenHeight&lt;/strong&gt;&lt;/span&gt;=500.0;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Primer menu flotante&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;var popupmenu=&lt;span style="color: rgb(255, 102, 0);"&gt;popupMenu&lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;corner:20&lt;br /&gt;padding:8&lt;br /&gt;borderWidth:4&lt;br /&gt;&lt;strong&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;borderColor:bind dynamicColor&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// opciones del menu&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;content&lt;/span&gt;: [&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;    menuItem&lt;/span&gt; { text:"Say Hello!", call: &lt;span style="color: rgb(204, 51, 204);"&gt;hello&lt;/span&gt; },&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;menuItem&lt;/span&gt; { text:"Again, say Hello!", call: &lt;span style="color: rgb(204, 51, 204);"&gt;again&lt;/span&gt; },&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;//menuSeparator { },&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;    &lt;span style="color: rgb(255, 102, 0);"&gt;menuItem&lt;/span&gt; { text:"Say Bye!", call: &lt;span style="color: rgb(204, 51, 204);"&gt;bye&lt;/span&gt; }&lt;br /&gt;]&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Timeline anima el borde del primer menu flotante&lt;/span&gt;&lt;br /&gt;var dynamicColor:Color;&lt;br /&gt;&lt;strong&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Timeline&lt;/span&gt;&lt;/strong&gt; {&lt;br /&gt;repeatCount:Timeline.INDEFINITE&lt;br /&gt;autoReverse:true&lt;br /&gt;keyFrames: [&lt;br /&gt;at (0s) {&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;strong&gt;dynamicColor&lt;/strong&gt;&lt;/span&gt; =&amp;gt; Color.YELLOW }&lt;br /&gt;at (0.5s) {&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;strong&gt;dynamicColor&lt;/strong&gt;&lt;/span&gt; =&amp;gt; Color.DARKBLUE}&lt;br /&gt;at (1s) {&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;strong&gt;dynamicColor&lt;/strong&gt;&lt;/span&gt; =&amp;gt; Color.LIGHTSALMON}&lt;br /&gt;]&lt;br /&gt;}.play();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Segundo menu flotante&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;var popupCircle=&lt;span style="color: rgb(255, 102, 0);"&gt;popupMenu&lt;/span&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;font: Font { size:20 };&lt;br /&gt;gradient: LinearGradient { proportional: false&lt;br /&gt;startX: 125.0, startY: 0.0, endX: 225.0, endY: 0.0&lt;br /&gt;stops: [ Stop { offset: 0.0 color: Color.BLACK },&lt;br /&gt;     Stop { offset: 1.0 color: Color.RED } ] }&lt;br /&gt;fill:Color.TRANSPARENT&lt;br /&gt;stroke:Color.WHITE&lt;br /&gt;highlight: Color.YELLOW&lt;br /&gt;verticalSpacing:10&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// opciones del menu&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;content&lt;/span&gt;: [&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;menuItem&lt;/span&gt; { text:"Multiline options\n"&lt;br /&gt;           "for your menu!", call: &lt;span style="color: rgb(204, 51, 204);"&gt;helloCircle&lt;/span&gt; },&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;menuItem&lt;/span&gt; { text:"This is a second\n"&lt;br /&gt;           "multiline option!", call: &lt;span style="color: rgb(204, 51, 204);"&gt;helloCircle&lt;/span&gt; },&lt;br /&gt;]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Tercer menu flotante&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;var popupmenu2=&lt;span style="color: rgb(255, 102, 0);"&gt;popupMenu&lt;/span&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;font: Font { size: 18, name:"Verdana", embolden:true };&lt;br /&gt;gradient: LinearGradient { proportional: true&lt;br /&gt;stops: [ Stop { offset: 0.0 color: Color.GRAY },&lt;br /&gt;     Stop { offset: 1.0 color: Color.WHITE } ] }&lt;br /&gt;fill:Color.TRANSPARENT&lt;br /&gt;corner:20&lt;br /&gt;padding:16&lt;br /&gt;verticalSpacing:6&lt;br /&gt;rotation:-25&lt;br /&gt;highlight:Color.WHITE&lt;br /&gt;highlightStroke:Color.RED&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// opciones del menu&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;content&lt;/span&gt;: [&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;menuItem&lt;/span&gt; { text:"Say Hello!", call: &lt;span style="color: rgb(204, 51, 204);"&gt;hello&lt;/span&gt; },&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;menuItem&lt;/span&gt; { text:"Again, say Hello!", call: &lt;span style="color: rgb(204, 51, 204);"&gt;again&lt;/span&gt; },&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;menuItem&lt;/span&gt; { text:"Say Bye!", call: &lt;span style="color: rgb(204, 51, 204);"&gt;bye&lt;/span&gt; }&lt;br /&gt;]&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// funciones asignada a menus&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;function &lt;span style="color: rgb(204, 51, 204);"&gt;hello&lt;/span&gt;(e:MouseEvent):Void {&lt;br /&gt;println("hello {e.x},{e.y}");&lt;br /&gt;};&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;&lt;br /&gt;function &lt;span style="color: rgb(204, 51, 204);"&gt;helloCircle&lt;/span&gt;(e:MouseEvent):Void {&lt;br /&gt;println("hello Circle {e.x},{e.y}");&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;function &lt;span style="color: rgb(204, 51, 204);"&gt;again&lt;/span&gt;(e:MouseEvent):Void {&lt;br /&gt;println("hello, again {e.x},{e.y}");&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;function &lt;span style="color: rgb(204, 51, 204);"&gt;bye&lt;/span&gt;(e:MouseEvent):Void {&lt;br /&gt;println("bye! {e.x},{e.y}");&lt;br /&gt;};&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Stage {&lt;br /&gt;title: "Application title"&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;&lt;strong&gt;width: bind screenWidth with inverse&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;height: bind screenHeight with inverse&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;scene: Scene {&lt;br /&gt;content: [&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// agrega un fondo a la ventana&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;Rectangle&lt;/span&gt; {&lt;br /&gt;    fill: Color.BLUE&lt;br /&gt;    width: bind &lt;span style="color: rgb(51, 255, 51);"&gt;screenWidth&lt;/span&gt;&lt;br /&gt;    height: bind &lt;span style="color: rgb(51, 255, 51);"&gt;screenHeight&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(102, 102, 102);"&gt;// le asigna un menu flotante&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;        onMousePressed: function(e) {&lt;br /&gt;        &lt;span style="color: rgb(255, 102, 0);"&gt;popupmenu&lt;/span&gt;.event=e;&lt;br /&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;            },&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// crea un circulo&lt;/span&gt;&lt;br /&gt;Circle {&lt;br /&gt;    &lt;span style="color: rgb(102, 102, 102);"&gt;// bloquea el click para que no dispare el menu flotante del fondo&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;        blocksMouse:true&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;        centerX: 100,&lt;br /&gt;    centerY: 100&lt;br /&gt;    radius: 40&lt;br /&gt;    fill: Color.RED&lt;br /&gt;    &lt;span style="color: rgb(102, 102, 102);"&gt;// le asigna un menu flotante&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;        onMousePressed: function(e) {&lt;br /&gt;        &lt;span style="color: rgb(255, 102, 0);"&gt;popupCircle&lt;/span&gt;.event=e;&lt;br /&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;            },&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// crea un segundo circulo&lt;/span&gt;&lt;br /&gt;Circle {&lt;br /&gt;    &lt;span style="color: rgb(102, 102, 102);"&gt;// bloquea el click para que no dispare el menu flotante del fondo&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;        blocksMouse:true&lt;br /&gt;&lt;/span&gt;        centerX: 300,&lt;br /&gt;    centerY: 300&lt;br /&gt;    radius: 80&lt;br /&gt;    fill: Color.YELLOW&lt;br /&gt;    &lt;span style="color: rgb(102, 102, 102);"&gt;// le asigna un menu flotante&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;        onMousePressed: function(e) {&lt;br /&gt;        &lt;span style="color: rgb(255, 102, 0);"&gt;popupmenu2&lt;/span&gt;.event=e;&lt;br /&gt;    }&lt;br /&gt;&lt;/span&gt;            },&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// incluye los menus flotantes&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;    &lt;span style="color: rgb(255, 102, 0);"&gt;popupmenu&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;popupmenu2&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;popupCircle&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;        ]&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-4500797634747398583?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/4500797634747398583/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=4500797634747398583' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/4500797634747398583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/4500797634747398583'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/02/javafx-menu-flotante-popup-menu.html' title='JavaFX: Menú flotante (popup menu)'/><author><name>Mauro</name><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-114930265400628746.post-1525236766774258415</id><published>2009-01-31T16:47:00.000-08:00</published><updated>2009-02-12T11:29:35.317-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='controles'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='animacion'/><category scheme='http://www.blogger.com/atom/ns#' term='slider'/><category scheme='http://www.blogger.com/atom/ns#' term='rendimiento'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='ventana'/><category scheme='http://www.blogger.com/atom/ns#' term='barra'/><category scheme='http://www.blogger.com/atom/ns#' term='performace'/><category scheme='http://www.blogger.com/atom/ns#' term='tamaño'/><category scheme='http://www.blogger.com/atom/ns#' term='ajuste'/><category scheme='http://www.blogger.com/atom/ns#' term='animation'/><category scheme='http://www.blogger.com/atom/ns#' term='control'/><category scheme='http://www.blogger.com/atom/ns#' term='graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='graficos'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='resize'/><category scheme='http://www.blogger.com/atom/ns#' term='transparency'/><category scheme='http://www.blogger.com/atom/ns#' term='transparencia'/><category scheme='http://www.blogger.com/atom/ns#' term='grafico'/><title type='text'>JavaFX: ¿Cuantas bolitas? (test de rendimiento gráfico)</title><content type='html'>Este ejercicio contiene 3 controles de barra que permiten ajustar:&lt;br /&gt;&lt;br /&gt;1) El número de bolas rebotando en la ventana;&lt;br /&gt;2) La transparencia de las bolas;&lt;br /&gt;3) El radio de las bolas.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Vww21r4lmKc&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/Vww21r4lmKc&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Cada nueva bola que se agrega, lo hace con un efecto (cambia el radio un par de veces) y luego continua rebotando entre los márgenes de la ventana. Si se aumenta el tamaño de la ventana, el area de desplazamiento aumenta, si se reduce, las bolas que se encuentran más alla del nuevo margen, regresan al centro de la ventana.&lt;br /&gt;&lt;br /&gt;Un area de texto muestra el número de bolas en la ventana, el porcentaje de transparencia y el radio de los círculos.&lt;br /&gt;&lt;br /&gt;Una instrucción importante es "canSkip:true", en el Timeline que actualiza la posicion de las bolas (y que por lo tanto, las redibuja). Esta instrucción evita que la CPU se sobrecargue de trabajo y solo realiza la actualización de las bolas si hay capacidad de procesamiento disponible. Intenten con unas 200 bolas y quiten el canSkip y veran como el programa se "pega".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Archivo Maix.fx&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package howmany;&lt;br /&gt;&lt;br /&gt;import javafx.scene.*;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;import javafx.ext.swing.SwingSlider;&lt;br /&gt;import javafx.scene.layout.VBox;&lt;br /&gt;import javafx.scene.text.*;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// si cambia tamaño de la ventana&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// reposiciona los circulos mas alla del margen&lt;/span&gt;&lt;br /&gt;var &lt;span style="color: rgb(255, 102, 0);"&gt;maxX=250.0 on replace { circles.resetPos() }&lt;/span&gt;;&lt;br /&gt;var &lt;span style="color: rgb(255, 102, 0);"&gt;maxY=250.0 on replace { circles.resetPos() }&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// seleccion numero de bolas&lt;/span&gt;&lt;br /&gt;var &lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;selector &lt;/span&gt;= SwingSlider {&lt;br /&gt;minimum: 0&lt;br /&gt;maximum: 100&lt;br /&gt;value: 0&lt;br /&gt;vertical: false&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// transparencia de las bolas&lt;/span&gt;&lt;br /&gt;var &lt;span style="color: rgb(255, 255, 51); font-weight: bold;"&gt;transparency &lt;/span&gt;= SwingSlider {&lt;br /&gt;minimum: 0&lt;br /&gt;maximum: 100&lt;br /&gt;value: 50&lt;br /&gt;vertical: false&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// radio de las bolas&lt;/span&gt;&lt;br /&gt;var &lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;radius &lt;/span&gt;= SwingSlider {&lt;br /&gt;minimum: 0&lt;br /&gt;maximum: 40&lt;br /&gt;value: 20&lt;br /&gt;vertical: false&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// texto para desplegar valores&lt;/span&gt;&lt;br /&gt;var &lt;span style="color: rgb(255, 153, 255); font-weight: bold;"&gt;total &lt;/span&gt;= &lt;span style="color: rgb(255, 153, 255);"&gt;Text &lt;/span&gt;{&lt;br /&gt;font: Font { size: 18 }&lt;br /&gt;textOrigin:TextOrigin.TOP;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// componente que contiene los circulos&lt;/span&gt;&lt;br /&gt;var &lt;span style="color: rgb(255, 255, 51); font-weight: bold;"&gt;circles &lt;/span&gt;= element {&lt;br /&gt;balls:&lt;span style="color: rgb(51, 255, 51);"&gt;bind selector.value&lt;/span&gt;;&lt;br /&gt;radius:&lt;span style="color: rgb(51, 255, 51);"&gt;bind radius.value&lt;/span&gt;;&lt;br /&gt;level:&lt;span style="color: rgb(51, 255, 51);"&gt;bind transparency.value / 100.0&lt;/span&gt;;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 153, 255);"&gt;display: total&lt;/span&gt;&lt;br /&gt;maxX:&lt;span style="color: rgb(255, 102, 0);"&gt;bind maxX&lt;/span&gt;&lt;br /&gt;maxY:&lt;span style="color: rgb(255, 102, 0);"&gt;bind maxY&lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;Stage {&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// si cambia tamaño de la ventana&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    // actualiza variables con dimensiones&lt;/span&gt;&lt;br /&gt;width: &lt;span style="color: rgb(255, 102, 0);"&gt;bind maxX with inverse&lt;/span&gt;&lt;br /&gt;height: &lt;span style="color: rgb(255, 102, 0);"&gt;bind maxY with inverse&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;scene: Scene { content: [&lt;br /&gt; &lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;circles&lt;/span&gt;,&lt;br /&gt; VBox { content: [&lt;br /&gt;     &lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;selector&lt;/span&gt;,&lt;br /&gt;     &lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;transparency&lt;/span&gt;,&lt;br /&gt;     &lt;span style="color: rgb(255, 255, 51); font-weight: bold;"&gt;radius&lt;/span&gt;,&lt;br /&gt;     &lt;span style="color: rgb(255, 255, 51); font-weight: bold;"&gt;total &lt;/span&gt;]&lt;br /&gt; } ]&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Archivo element.fx&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;package howmany;&lt;br /&gt;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;import javafx.scene.*;&lt;br /&gt;import javafx.scene.text.*;&lt;br /&gt;import javafx.scene.shape.Circle;&lt;br /&gt;import javafx.scene.paint.Color;&lt;br /&gt;import javafx.animation.*;&lt;br /&gt;import java.lang.Math;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// clase que extiende circulos&lt;/span&gt;&lt;br /&gt;class &lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;ball extends Circle &lt;/span&gt;{&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// "sobreescribe" los parametros del circulo normal,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    // de manera de tener los valores en la nueva clase&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;override var stroke&lt;/span&gt; = null;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;override var fill&lt;/span&gt; = Color.RED;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;override var centerX&lt;/span&gt; = 100;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;override var centerY&lt;/span&gt; = 100;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;override var radius&lt;/span&gt; = 10;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;override var scaleX&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;override var scaleY&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;public var incx;&lt;br /&gt;public var incy;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// mueve el circulo en los incrementos de la instancia&lt;/span&gt;&lt;br /&gt;function &lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;move&lt;/span&gt;():Void {&lt;br /&gt; &lt;span style="color: rgb(51, 255, 51);"&gt;centerX &lt;/span&gt;+= incx;&lt;br /&gt; &lt;span style="color: rgb(51, 255, 51);"&gt;centerY &lt;/span&gt;+= incy;&lt;br /&gt; if (centerX&amp;lt;0 or centerX&amp;gt;maxX) then&lt;br /&gt;     incx = -incx;&lt;br /&gt; if (centerY&amp;lt;0 or centerY&amp;gt;maxY) then&lt;br /&gt;     incy = -incy;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// efecto para cuando crea el circulo&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    // cambia un par de veces de tamaño (como rebote)&lt;/span&gt;&lt;br /&gt;var dropIn = Timeline {&lt;br /&gt; repeatCount:5&lt;br /&gt; autoReverse:true&lt;br /&gt; keyFrames: [&lt;br /&gt;     at (0s) { scaleX =&amp;gt; 2.0; scaleY =&amp;gt; 2.0 }&lt;br /&gt;     at (0.3s) { scaleX =&amp;gt; 1.0; scaleY =&amp;gt; 1.0 }&lt;br /&gt; ]&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// al crear el circulo, dispara el efecto de rebote&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;postinit &lt;/span&gt;{&lt;br /&gt; dropIn.play();&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// clase que contiene a todos los circulos&lt;/span&gt;&lt;br /&gt;public &lt;span style="color: rgb(255, 255, 51); font-weight: bold;"&gt;class element extends CustomNode&lt;/span&gt; {&lt;br /&gt;&lt;br /&gt;public var &lt;span style="color: rgb(51, 255, 51);"&gt;balls &lt;/span&gt;= 50.0;&lt;br /&gt;public var &lt;span style="font-weight: bold; color: rgb(255, 153, 255);"&gt;display = Text { }&lt;/span&gt;;&lt;br /&gt;public var &lt;span style="color: rgb(51, 255, 51);"&gt;maxX&lt;/span&gt;;&lt;br /&gt;public var &lt;span style="color: rgb(51, 255, 51);"&gt;maxY&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// si cambia la transparencia&lt;/span&gt;&lt;br /&gt;public var &lt;span style="color: rgb(51, 255, 51);"&gt;level &lt;/span&gt;= 1.0 &lt;span style="color: rgb(51, 255, 255);"&gt;on replace&lt;/span&gt; {&lt;br /&gt; &lt;span style="color: rgb(102, 102, 102);"&gt;// actualiza la opacidad de todos los circulos&lt;/span&gt;&lt;br /&gt; for (obj in objs) obj.opacity = level; };&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// si cambia el radio&lt;/span&gt;&lt;br /&gt;public var &lt;span style="color: rgb(51, 255, 51);"&gt;radius &lt;/span&gt;= 10.0 &lt;span style="color: rgb(51, 255, 255);"&gt;on replace&lt;/span&gt; {&lt;br /&gt; &lt;span style="color: rgb(102, 102, 102);"&gt;// actualiza el radio de todos los circulos&lt;/span&gt;&lt;br /&gt; for (obj in objs) obj.radius = radius; };&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// arreglo que contiene todos los circulos&lt;/span&gt;&lt;br /&gt;var &lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;objs:ball&lt;/span&gt;[];&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// colores que asigna a los circulos&lt;/span&gt;&lt;br /&gt;var colors:Color[]=[&lt;br /&gt; Color.RED, Color.BLUE, Color.YELLOW,&lt;br /&gt; Color.PURPLE, Color.CYAN];&lt;br /&gt;&lt;br /&gt;var i=0;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// agrega nuevo circulo al componente&lt;/span&gt;&lt;br /&gt;function &lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;addBall&lt;/span&gt;():Void {&lt;br /&gt; var ix=Math.random()*15 - 7;&lt;br /&gt; var iy=Math.random()*15 - 7;&lt;br /&gt; var circ =&lt;span style="color: rgb(51, 255, 51);"&gt; ball &lt;/span&gt;{&lt;br /&gt;     centerX:maxX/2&lt;br /&gt;     centerY:maxY/2&lt;br /&gt;     incx: ix&lt;br /&gt;     incy:iy&lt;br /&gt;     radius:radius&lt;br /&gt;     fill: colors[i mod sizeof colors]&lt;br /&gt;     opacity:level&lt;br /&gt; };&lt;br /&gt; insert circ into objs;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// crea el componente con los circulos&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;override function create():Node&lt;/span&gt; {&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(102, 102, 102);"&gt;// chequea si debe agregar o quitar circulos&lt;/span&gt;&lt;br /&gt; Timeline {&lt;br /&gt;     repeatCount:Timeline.INDEFINITE&lt;br /&gt;     keyFrames: [&lt;br /&gt;         KeyFrame {&lt;br /&gt;             time: 0.2s&lt;br /&gt;             action: function():Void {&lt;br /&gt;                 &lt;span style="color: rgb(255, 153, 255);"&gt;display.content=&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 153, 255);"&gt;                            "{sizeof objs} / {(level*100) as Integer}% / {radius}"&lt;/span&gt;;&lt;br /&gt;                 if (sizeof objs &amp;lt; balls) then {&lt;br /&gt;                     &lt;span style="color: rgb(51, 255, 255);"&gt;addBall&lt;/span&gt;();&lt;br /&gt;                     i++;&lt;br /&gt;                 }&lt;br /&gt;                 if (sizeof objs &amp;gt; balls) then&lt;br /&gt;                     &lt;span style="color: rgb(51, 255, 255);"&gt;delete objs[0]&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;         }&lt;br /&gt;     ]&lt;br /&gt; }.play();&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(102, 102, 102);"&gt;// mueve los circulos&lt;/span&gt;&lt;br /&gt; Timeline {&lt;br /&gt;     repeatCount:Timeline.INDEFINITE&lt;br /&gt;     keyFrames: [&lt;br /&gt;         KeyFrame {&lt;br /&gt;             time: 0.04s&lt;br /&gt;             &lt;span style="color: rgb(102, 102, 102); font-weight: bold;"&gt;// para evitar que se sobrecargue de trabajo&lt;/span&gt;&lt;br /&gt;             &lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;canSkip: true&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;             action: function():Void {&lt;br /&gt;                 for (obj in objs)&lt;br /&gt;                     obj.&lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;move&lt;/span&gt;();&lt;br /&gt;             }&lt;br /&gt;         }&lt;br /&gt;     ]&lt;br /&gt; }.play();&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(102, 102, 102);"&gt;// retorna el componente con los circulos&lt;/span&gt;&lt;br /&gt; Group {&lt;br /&gt;     content: &lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;bind objs&lt;/span&gt;&lt;br /&gt; };&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// reposicion los circulos si excende el margen&lt;/span&gt;&lt;br /&gt;public function resetPos():Void {&lt;br /&gt; for (obj in objs) {&lt;br /&gt;     var pos = obj.boundsInScene;&lt;br /&gt;     if (pos.maxX &amp;gt; maxX) then&lt;br /&gt;         obj.&lt;span style="color: rgb(51, 255, 51);"&gt;centerX &lt;/span&gt;= maxX/2 ;&lt;br /&gt;     if (pos.maxY &amp;gt; maxY) then&lt;br /&gt;         obj.&lt;span style="color: rgb(51, 255, 51);"&gt;centerY &lt;/span&gt;= maxY/2 ;&lt;br /&gt; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-1525236766774258415?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/1525236766774258415/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=1525236766774258415' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/1525236766774258415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/1525236766774258415'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/01/javafx-cuantas-bolitas-test-de.html' title='JavaFX: ¿Cuantas bolitas? (test de rendimiento gráfico)'/><author><name>Mauro</name><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-114930265400628746.post-3460819503229193489</id><published>2009-01-28T11:51:00.001-08:00</published><updated>2009-02-11T22:54:39.224-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='juego'/><category scheme='http://www.blogger.com/atom/ns#' term='animaciones'/><category scheme='http://www.blogger.com/atom/ns#' term='animacion'/><category scheme='http://www.blogger.com/atom/ns#' term='codigo'/><category scheme='http://www.blogger.com/atom/ns#' term='juegos'/><category scheme='http://www.blogger.com/atom/ns#' term='source'/><category scheme='http://www.blogger.com/atom/ns#' term='audio'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><category scheme='http://www.blogger.com/atom/ns#' term='illustrator'/><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='sound'/><category scheme='http://www.blogger.com/atom/ns#' term='animation'/><category scheme='http://www.blogger.com/atom/ns#' term='sonido'/><category scheme='http://www.blogger.com/atom/ns#' term='mp3'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><category scheme='http://www.blogger.com/atom/ns#' term='fuente'/><title type='text'>Mi primer juego en JavaFX: Alunizaje</title><content type='html'>Al juego le falta un par de detalles, como que la nave aparezca inicialmente en cualquier area de la pantalla. Por ahora aparece al centro a una velocidad y dirección aleatoria. También me falta agregar que la "base" de alunizaje tenga una posición aleatoria y que detecte cuando aterriza fuera de ella. Son detalles menores que quizas hasta puedes terminar tú.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/64iAZx7fIvI&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/64iAZx7fIvI&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;El juego usa 4 teclas. La barra de espacio, para encender el motor principal. Las teclas de flecha hacia izquierda y derecha, que encienden los motos auxiliares para inclinar el módulo, y la tecla con la flecha hacia arriba, que enciende el piloto automático, para frenar la rotación del módulo (automáticamente).&lt;br /&gt;&lt;br /&gt;Está bastante realista, los retrocohetes se encienden cuando corresponde y dejan de operar cuando no hay mas combustible. También incluye alarmas visuales y sonoras para cuando se excede la velocidad de aterrizaje, la inclinación del módulo es incorrecta cuando esta cerca de alunizar o cuando el combustible baja de 1/3 del estanque.&lt;br /&gt;&lt;br /&gt;Me resultó entretenido hacer este juego y también descubrir LO INCREIBLEMENTE SIMPLE que es desarrollar cosas bastante decentes en tan poco tiempo (el grueso estaba operando en un par de horas... ¡y eso que estoy aprendiendo JavaFX script!).&lt;br /&gt;&lt;br /&gt;La facilidad de incluir gráficos desde Adobe Illustrator sin duda es una ventaja inmensa. Especialmente, porque puede ser reemplazada por el trabajo de un diseñador más experto, sin necesidad de tocar el código de JavaFX script ya desarrollado. De hecho, con poco trabajo adicional podría agregarse multiples "skins" o apariencias al juego... escenarios de distintos planetas y naves por ejemplo (pudiendo relocalizar las alarmas, botones, formas de la nave, motores, entorno, etc).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;a style="color: rgb(255, 0, 0);" href="http://sites.google.com/site/javafxscript/Home/lunarlander.rar?attredirects=0"&gt;El proyecto Netbeans 6.5 completo está disponible aquí&lt;/a&gt;&lt;a style="color: rgb(255, 0, 0);" href="http://sites.google.com/site/javafxscript/Home/lunarlander.rar?attredirects=0"&gt; (código fuente, gráfica, sonidos, etc).&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;"&gt;El código requiere que esté incluida la libreria JavaFX FXD 1.0 en el proyecto.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-3460819503229193489?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/3460819503229193489/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=3460819503229193489' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/3460819503229193489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/3460819503229193489'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/01/mi-primer-juego-en-javafx-alunizaje.html' title='Mi primer juego en JavaFX: Alunizaje'/><author><name>Mauro</name><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-114930265400628746.post-1726779203884200704</id><published>2009-01-26T15:35:00.000-08:00</published><updated>2009-02-11T22:55:01.131-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rebota'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='leccion'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='arrastrar'/><category scheme='http://www.blogger.com/atom/ns#' term='codigo fuente'/><category scheme='http://www.blogger.com/atom/ns#' term='rebotar'/><category scheme='http://www.blogger.com/atom/ns#' term='draggable'/><category scheme='http://www.blogger.com/atom/ns#' term='example'/><category scheme='http://www.blogger.com/atom/ns#' term='ejercicio'/><category scheme='http://www.blogger.com/atom/ns#' term='back'/><category scheme='http://www.blogger.com/atom/ns#' term='drag and drop'/><category scheme='http://www.blogger.com/atom/ns#' term='arrastrable'/><category scheme='http://www.blogger.com/atom/ns#' term='rebotan'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='bouce'/><title type='text'>JavaFX: Objetos que se devuelven a su origen si no caen en el destino</title><content type='html'>Esta es una versión modificada del ejercicio anterior. Si se arrastra un objeto y este no cae dentro del destino, entonces rebota hacia el punto de origen.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/yDxWpTsCZJY&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/yDxWpTsCZJY&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Lo único que agregué fue que al crear el objeto guarda su posicion inicial en las variables original_x y original_y, y si detecta que no cae dentro del destino, ejecuta un Timeline que lo hace volver a su posición de origen.&lt;br /&gt;&lt;br /&gt;Adicionalmente, hice algunos pequeños cambios para reemplazar el destino circular por un cuadrado de esquinas redondeadas.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/javafxscript/Home/placeObject2.rar?attredirects=0"&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Aquí hay una copia completa del proyecto Netbeans 6.5 (Download Complete Project)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-1726779203884200704?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/1726779203884200704/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=1726779203884200704' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/1726779203884200704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/1726779203884200704'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/01/javafx-objetos-que-se-devuelven-si-no.html' title='JavaFX: Objetos que se devuelven a su origen si no caen en el destino'/><author><name>Mauro</name><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-114930265400628746.post-3346478880798382171</id><published>2009-01-26T09:40:00.000-08:00</published><updated>2009-02-11T22:55:25.143-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drag'/><category scheme='http://www.blogger.com/atom/ns#' term='attracted'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='objetos'/><category scheme='http://www.blogger.com/atom/ns#' term='atrae'/><category scheme='http://www.blogger.com/atom/ns#' term='arrastrables'/><category scheme='http://www.blogger.com/atom/ns#' term='atraidos'/><category scheme='http://www.blogger.com/atom/ns#' term='attract'/><category scheme='http://www.blogger.com/atom/ns#' term='arrastrar'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='atraer'/><category scheme='http://www.blogger.com/atom/ns#' term='draggable'/><title type='text'>JavaFX: Objetos que son atraídos por su área de destino</title><content type='html'>Hola nuevamente, aquí va otro ejercicio entretenido e interesante. Probablemente se puede mejorar, pero por ahora, esta es la manera en que lo hice funcionar.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/mAlntM0bUTU&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/mAlntM0bUTU&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;En parte, se basa en el código de ejemplos anteriores. Por ejemplo, el Interpolador de resorte es el mismo código que había usado antes. La clase DraggableObj es una versión modificada de un ejemplo anterior. Hay dos pequeñas clases que sólo describen un par de objetos simples y la clase principal que tiene un par de cosillas interesantes.&lt;br /&gt;&lt;br /&gt;Por ejemplo, la clase principal tiene una lista de objetos para arrastrar, que sólo son "descritos" y que luego el programa transforma en los objetos gráficos definitivos, que el usuario manipula. También utiliza una función (toPaint) para consolidar todos los elementos gráficos que debe pintar y manipular.&lt;br /&gt;&lt;br /&gt;Respecto a los ajustes que hace en DraggableObj al detectar que el objeto se acercó al area de destino: Lo que ocurre es que los círculos son posicionados por el centro, mientras los rectángulos/cuadrados son posicionados por la esquina superior izquierda (creo que hay una forma de mover ese punto, pero no lo he probado ni me consta que realmente exista... sólo tengo la impresión que leí algo como eso).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/javafxscript/Home/placeObject.rar?attredirects=0"&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Aquí hay una copia del proyecto Netbeans 6.5 completo. (Download Complete Project)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Aquí va el código:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;archivo Main.fx&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;package placeobject;&lt;br /&gt;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;import javafx.scene.*;&lt;br /&gt;import javafx.scene.text.*;&lt;br /&gt;import javafx.scene.shape.*;&lt;br /&gt;import javafx.scene.paint.*;&lt;br /&gt;import javafx.scene.Node;&lt;br /&gt;&lt;br /&gt;var destinationMessage:Text;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// area de destino&lt;br /&gt;&lt;/span&gt;var &lt;span style="color: rgb(204, 51, 204); font-weight: bold;"&gt;destinationArea&lt;/span&gt;=Circle{&lt;br /&gt;opacity: 0.5&lt;br /&gt;centerX: Area.destination.x&lt;br /&gt;centerY: Area.destination.y&lt;br /&gt;radius: Area.destination.radius&lt;br /&gt;fill: Area.destination.color&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// mensaje para destino&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;destinationMessage&lt;/span&gt;=Text {&lt;br /&gt;font: Font { size: 24 }&lt;br /&gt;x: bind messagePosX, y: bind messagePosY&lt;br /&gt;content: "Destino"&lt;br /&gt;textOrigin:TextOrigin.TOP&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// calcula posicion para mensaje&lt;br /&gt;&lt;/span&gt;var messagePosX = Area.destination.x - destinationMessage.boundsInLocal.width/2;&lt;br /&gt;var messagePosY = Area.destination.y - destinationMessage.boundsInLocal.height/2;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// lista de objetos por arrastrar&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;var objects= [&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt; MyObject {type:"square", size:100, x:50, y:50, color:Color.BLUE},&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt; MyObject {type:"circle", size:100, x:250, y:50, color:Color.RED},&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt; MyObject {type:"square", size:80, x:50, y:250, color:Color.PURPLE},&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt; MyObject {type:"circle", size:120, x:200, y:200, color:Color.YELLOW}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// carga objetos en una secuencia (array)&lt;br /&gt;&lt;/span&gt;var list:Node[];&lt;br /&gt;for (obj in objects) {&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// si es un cuadrado&lt;/span&gt;&lt;br /&gt;if (obj.type=="&lt;span style="color: rgb(255, 255, 51); font-weight: bold;"&gt;square&lt;/span&gt;") then {&lt;br /&gt;var rect=DraggableObj{&lt;br /&gt;translateX:obj.x&lt;br /&gt;translateY:obj.y&lt;br /&gt;content: Rectangle{&lt;br /&gt;   width:obj.size&lt;br /&gt;   height:obj.size&lt;br /&gt;   fill:obj.color&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;insert rect as Node into list;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// si es un circulo&lt;/span&gt;&lt;br /&gt;if (obj.type=="&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;circle&lt;/span&gt;") then {&lt;br /&gt;var circ=DraggableObj{&lt;br /&gt;translateX: obj.x + obj.size/2&lt;br /&gt;translateY: obj.y + obj.size/2&lt;br /&gt;isCircle: true&lt;br /&gt;content: Circle{&lt;br /&gt;   radius: obj.size/2&lt;br /&gt;   fill:obj.color&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;insert circ as Node into list;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// obtiene los objetos a pintar&lt;br /&gt;&lt;/span&gt;function &lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;toPaint()&lt;/span&gt;:Node[] {&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// array para objetos&lt;/span&gt;&lt;br /&gt;var objs:Node[];&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// crea area de destino&lt;/span&gt;&lt;br /&gt;var dest=Group {&lt;br /&gt;content: [&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;destinationArea&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204); font-weight: bold;"&gt;destinationMessage&lt;/span&gt;&lt;br /&gt;]&lt;br /&gt;};&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// agrega destino a la lista&lt;/span&gt;&lt;br /&gt;insert dest into objs;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// agrega los objetos a la lista&lt;/span&gt;&lt;br /&gt;insert list into objs;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// retorna un array de objetos por pintar&lt;/span&gt;&lt;br /&gt;return objs;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;var stage=Stage {&lt;br /&gt;title: "Application title"&lt;br /&gt;width: 600&lt;br /&gt;height: 600&lt;br /&gt;scene: Scene {&lt;br /&gt;content:&lt;br /&gt;bind &lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;toPaint()&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;archivo DraggableObj.fx&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;package placeobject;&lt;br /&gt;&lt;br /&gt;import javafx.scene.*;&lt;br /&gt;import javafx.scene.shape.*;&lt;br /&gt;import javafx.scene.paint.*;&lt;br /&gt;import javafx.animation.Timeline;&lt;br /&gt;import javafx.animation.Timeline.*;&lt;br /&gt;import javafx.animation.Interpolator;&lt;br /&gt;import javafx.animation.Interpolator.*;&lt;br /&gt;import javafx.geometry.*;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def spring = SpringInterpolator { bounce: true};&lt;br /&gt;&lt;br /&gt;public class &lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;DraggableObj &lt;/span&gt;extends CustomNode {&lt;br /&gt;&lt;br /&gt;public var content: Node[];&lt;br /&gt;public var isCircle = false;&lt;br /&gt;&lt;br /&gt;var endX = 0.0;&lt;br /&gt;var endY = 0.0;&lt;br /&gt;var startX = 0.0;&lt;br /&gt;var startY = 0.0;&lt;br /&gt;&lt;br /&gt;var op:Number=100;&lt;br /&gt;var scale:Number=100;&lt;br /&gt;var final:Point2D;&lt;br /&gt;var origin:Point2D;&lt;br /&gt;var original_width=0.0;&lt;br /&gt;var original_height=0.0;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// vuelve escala a 100%&lt;/span&gt;&lt;br /&gt;var s=Timeline {&lt;br /&gt;keyFrames: [&lt;br /&gt;at (1.5s) { scale =&amp;gt; 100.0 tween spring},&lt;br /&gt;]&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// aumenta escala de 100% a 150%&lt;/span&gt;&lt;br /&gt;var i=Timeline {&lt;br /&gt;keyFrames: [&lt;br /&gt;at (0s) { scale =&amp;gt; 100.0 },&lt;br /&gt;at (0.3s) { scale =&amp;gt; 150.0},&lt;br /&gt;]&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// desplazamiento hacia el centro de destino&lt;/span&gt;&lt;br /&gt;var dxy=Timeline {&lt;br /&gt;keyFrames: [&lt;br /&gt;at (0s) { endX =&amp;gt; origin.x; endY =&amp;gt; origin.y },&lt;br /&gt;at (1s) { endX =&amp;gt; &lt;span style="color: rgb(255, 153, 255); font-weight: bold;"&gt;final&lt;/span&gt;.x tween spring; endY =&amp;gt; &lt;span style="color: rgb(255, 153, 255); font-weight: bold;"&gt;final&lt;/span&gt;.y tween spring},&lt;br /&gt;]&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;override function create() : Node {&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// crea objeto&lt;/span&gt;&lt;br /&gt;var &lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;newNode &lt;/span&gt;= Group {&lt;br /&gt;&lt;br /&gt;translateX: bind &lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;endX&lt;/span&gt;&lt;br /&gt;translateY: bind &lt;span style="color: rgb(255, 102, 0); font-weight: bold;"&gt;endY&lt;/span&gt;&lt;br /&gt;content: bind content&lt;br /&gt;opacity: bind op/100.0&lt;br /&gt;scaleX: bind scale/100.0&lt;br /&gt;scaleY: bind scale/100.0&lt;br /&gt;&lt;br /&gt;onMousePressed: function(e) {&lt;br /&gt;   startX = e.dragX-endX;&lt;br /&gt;   startY = e.dragY-endY;&lt;br /&gt;   dxy.stop();&lt;br /&gt;   s.stop();&lt;br /&gt;   i.playFromStart();&lt;br /&gt;}&lt;br /&gt;onMouseDragged: function(e) {&lt;br /&gt;   endX = e.dragX-startX;&lt;br /&gt;   endY = e.dragY-startY;&lt;br /&gt;}&lt;br /&gt;onMouseReleased: function(e) {&lt;br /&gt;   s.time=0s;&lt;br /&gt;   s.play();&lt;br /&gt;   &lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;checkDestination&lt;/span&gt;();&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// obtiene tamaño del objeto&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51);"&gt;      &lt;span style="font-weight: bold;"&gt;original_width=newNode.boundsInLocal.width;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51); font-weight: bold;"&gt;      original_height=newNode.boundsInLocal.height;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// retorna el objeto creado (la instruccion return es opcional)&lt;/span&gt;&lt;br /&gt;return &lt;span style="color: rgb(255, 255, 51); font-weight: bold;"&gt;newNode&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// chequea si esta proximo al destino&lt;/span&gt;&lt;br /&gt;function &lt;span style="color: rgb(204, 51, 204); font-weight: bold;"&gt;checkDestination&lt;/span&gt;() {&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// obtiene coordenadas y tamaño del destino&lt;/span&gt;&lt;br /&gt;var &lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;dest&lt;/span&gt;=Rectangle2D {&lt;br /&gt;minX:&lt;span style="color: rgb(51, 255, 255); font-weight: bold;"&gt;Area.destination.x - Area.destination.radius&lt;/span&gt;&lt;br /&gt;minY:&lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;Area.destination.y - Area.destination.radius&lt;/span&gt;&lt;br /&gt;width:&lt;span style="color: rgb(51, 255, 255); font-weight: bold;"&gt;Area.destination.radius*2&lt;/span&gt;&lt;br /&gt;height:&lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;Area.destination.radius*2&lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// verifica si el area del objeto arrastrado y el destino coinciden&lt;/span&gt;&lt;br /&gt;if (&lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;dest&lt;/span&gt;.intersects(&lt;span style="color: rgb(255, 102, 0);"&gt;this&lt;/span&gt;.boundsInScene)) then {&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// punto de origen para la animacion (posicion actual del objeto)&lt;/span&gt;&lt;br /&gt;origin=Point2D{x:&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;endX&lt;/span&gt;, y:&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;endY&lt;/span&gt;};&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// cuanto debe moverse el objeto para alcanzar el destino&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 153, 255);"&gt;final&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;=this.sceneToLocal(Area.destination.x, Area.destination.y);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// si no es un circulo (y el centro esta desplazado a la esquina&lt;br /&gt;// superior izquierda del rectangulo/cuadrado)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;if (not isCircle)&lt;/span&gt; {&lt;br /&gt;   &lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// ajusta cuanto debe moverse&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(255, 153, 255); font-weight: bold;"&gt;final&lt;/span&gt;=&lt;span style="font-weight: bold;"&gt;Point2D &lt;/span&gt;{&lt;br /&gt;       &lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// menos la mitad del ancho y alto&lt;/span&gt;&lt;br /&gt;       x: &lt;span style="color: rgb(255, 153, 255); font-weight: bold;"&gt;final&lt;/span&gt;.x - &lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;original_width&lt;/span&gt; / 2;&lt;br /&gt;       y: &lt;span style="font-weight: bold; color: rgb(255, 153, 255);"&gt;final&lt;/span&gt;.y - &lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;original_height&lt;/span&gt; / 2;&lt;br /&gt;   };&lt;br /&gt;};&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;// inicia animacion para alcanzar el centro del destino&lt;/span&gt;&lt;br /&gt;dxy.playFromStart();&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;archivo MyObject.fx&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;package placeobject;&lt;br /&gt;&lt;br /&gt;import javafx.scene.paint.Color;&lt;br /&gt;&lt;br /&gt;public class MyObject {&lt;br /&gt;public var type:String;&lt;br /&gt;public var size:Number;&lt;br /&gt;public var x:Number;&lt;br /&gt;public var y:Number;&lt;br /&gt;public var color:Color;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;archivo Area.fx&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;package placeobject;&lt;br /&gt;&lt;br /&gt;import javafx.scene.paint.Color;&lt;br /&gt;&lt;br /&gt;public class Area {&lt;br /&gt;public var x:Number;&lt;br /&gt;public var y:Number;&lt;br /&gt;public var radius:Number;&lt;br /&gt;public var color:Color;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;public var destination=Area {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;  x:400&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;  y:400&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;  radius:100&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;  color:Color.RED&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-3346478880798382171?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/3346478880798382171/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=3346478880798382171' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/3346478880798382171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/3346478880798382171'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/01/javafx-objetos-que-son-atraidos-por-su.html' title='JavaFX: Objetos que son atraídos por su área de destino'/><author><name>Mauro</name><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-114930265400628746.post-3310851532716935627</id><published>2009-01-24T23:13:00.000-08:00</published><updated>2009-02-11T22:55:46.072-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='escritorio'/><category scheme='http://www.blogger.com/atom/ns#' term='arrastrar'/><category scheme='http://www.blogger.com/atom/ns#' term='source code'/><category scheme='http://www.blogger.com/atom/ns#' term='header'/><category scheme='http://www.blogger.com/atom/ns#' term='lesson'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx 1.0'/><category scheme='http://www.blogger.com/atom/ns#' term='draggable'/><category scheme='http://www.blogger.com/atom/ns#' term='zone'/><category scheme='http://www.blogger.com/atom/ns#' term='navegador'/><category scheme='http://www.blogger.com/atom/ns#' term='area'/><category scheme='http://www.blogger.com/atom/ns#' term='barra'/><category scheme='http://www.blogger.com/atom/ns#' term='drag and drop'/><category scheme='http://www.blogger.com/atom/ns#' term='arrastrable'/><category scheme='http://www.blogger.com/atom/ns#' term='bar'/><category scheme='http://www.blogger.com/atom/ns#' term='desktop'/><category scheme='http://www.blogger.com/atom/ns#' term='encabezado'/><category scheme='http://www.blogger.com/atom/ns#' term='browser'/><title type='text'>JavaFX: Applet con area para arrastrarlo</title><content type='html'>Esta versión posee un area delimitada que permite arrastrar el applet fuera del navegador. La versión anterior permitía arrastrar el applet desde cualquier area del applet. El inconveniente de la versión anterior, es que no permite utilizar drag and drop (arrastrar elementos) dentro del applet, porque arrastraba el applet completo fuera del navegador.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/nCywy4NyGgE&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/nCywy4NyGgE&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;package advdragapplet;&lt;br /&gt;&lt;br /&gt;import javafx.stage.*;&lt;br /&gt;import javafx.scene.*;&lt;br /&gt;import javafx.scene.text.*;&lt;br /&gt;import javafx.scene.text.TextOrigin;&lt;br /&gt;import javafx.scene.shape.*;&lt;br /&gt;import javafx.scene.paint.*;&lt;br /&gt;import javafx.scene.input.MouseEvent;&lt;br /&gt;import javafx.animation.Timeline;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;import javafx.stage.AppletStageExtension;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;// area para arrastrar el applet&lt;/span&gt;&lt;br /&gt;var dragArea:Group;&lt;br /&gt;dragArea = Group {&lt;br /&gt;&lt;br /&gt;opacity: 0.5&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;// la barra solo aparece si es un applet y puede ser arrastrado&lt;/span&gt;&lt;br /&gt;visible: bind AppletStageExtension.appletDragSupported&lt;br /&gt;onMouseDragged:function(e:MouseEvent):Void {&lt;br /&gt; stage.x += e.dragX;&lt;br /&gt; stage.y += e.dragY;&lt;br /&gt;}&lt;br /&gt;content: [&lt;br /&gt; Rectangle {&lt;br /&gt;     x: 0&lt;br /&gt;     y: 0&lt;br /&gt;     width: 140&lt;br /&gt;     height: 20&lt;br /&gt;     fill: Color.YELLOW&lt;br /&gt; },&lt;br /&gt; Text {&lt;br /&gt;     font: Font {&lt;br /&gt;         size: 12&lt;br /&gt;     }&lt;br /&gt;     x: 10,&lt;br /&gt;     y: 5&lt;br /&gt;     textOrigin:TextOrigin.TOP&lt;br /&gt;     content: "Arrastrame / Drag me"&lt;br /&gt; }&lt;br /&gt;]&lt;br /&gt;};&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;var x:Number;&lt;br /&gt;Timeline {&lt;br /&gt;repeatCount: Timeline.INDEFINITE&lt;br /&gt;autoReverse: true&lt;br /&gt;keyFrames: [&lt;br /&gt; at(0.0s) { x =&amp;gt; 40}&lt;br /&gt; at(0.5s) { x =&amp;gt; 224}&lt;br /&gt;]&lt;br /&gt;}.play();&lt;br /&gt;&lt;br /&gt;var stage=Stage {&lt;br /&gt;title: "Draggable Applet"&lt;br /&gt;width: 280&lt;br /&gt;height: 116&lt;br /&gt;scene: Scene {&lt;br /&gt; fill:Color.PURPLE&lt;br /&gt; content: [&lt;br /&gt;     Circle {&lt;br /&gt;         centerX: bind x,&lt;br /&gt;         centerY: 40&lt;br /&gt;         radius: 40&lt;br /&gt;         fill: Color.CYAN&lt;br /&gt;     },&lt;br /&gt;     &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;dragArea,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; ]&lt;br /&gt;}&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt; extensions: [&lt;br /&gt; AppletStageExtension {&lt;br /&gt;     shouldDragStart: function(e): Boolean {&lt;br /&gt;         e.primaryButtonDown and dragArea.hover;&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;]&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-3310851532716935627?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/3310851532716935627/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=3310851532716935627' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/3310851532716935627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/3310851532716935627'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/01/javafx-applet-con-area-para-arrastrarlo.html' title='JavaFX: Applet con area para arrastrarlo'/><author><name>Mauro</name><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-114930265400628746.post-4945813090438018782</id><published>2009-01-24T17:10:00.000-08:00</published><updated>2009-02-11T22:56:08.690-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='distribuir'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='application'/><category scheme='http://www.blogger.com/atom/ns#' term='applet'/><category scheme='http://www.blogger.com/atom/ns#' term='escritorio'/><category scheme='http://www.blogger.com/atom/ns#' term='distribution'/><category scheme='http://www.blogger.com/atom/ns#' term='arrastrar'/><category scheme='http://www.blogger.com/atom/ns#' term='aplicacion'/><category scheme='http://www.blogger.com/atom/ns#' term='draggable'/><category scheme='http://www.blogger.com/atom/ns#' term='navegador'/><category scheme='http://www.blogger.com/atom/ns#' term='drag and drop'/><category scheme='http://www.blogger.com/atom/ns#' term='arrastrable'/><category scheme='http://www.blogger.com/atom/ns#' term='desktop'/><category scheme='http://www.blogger.com/atom/ns#' term='distribucion'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='instalar'/><category scheme='http://www.blogger.com/atom/ns#' term='browser'/><title type='text'>JavaFX: Applet Arrastrable</title><content type='html'>Una de las nuevas funcionalidades de Java 6 update 10 es la posibilidad de crear applets "arrastrables" (que el usuario puede "arrastrar" fuera de la página de su navegador, y convertir en una aplicación de escritorio). Esta funcionalidad también está disponible -con un mínimo de trabajo- para los applets JavaFX.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Sd7Rpa792gQ&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/Sd7Rpa792gQ&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Lo único que tienes que tienes que agregar a tu código es:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;import javafx.stage.AppletStageExtension;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Y posteriormente, incluir este trozo como atributo del Stage:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;extensions: AppletStageExtension {&lt;br /&gt;    shouldDragStart: function(e: MouseEvent): Boolean {&lt;br /&gt;        e.primaryButtonDown;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Listo, los usuarios de tu applet ya pueden arrastrarlo al escritorio y crear un short-cut (automáticamente) para re-lanzar el applet, sin siquiera tener que abrir su navegador.&lt;br /&gt;&lt;br /&gt;Nota: Para desinstalar desde Windows un applet convertido en aplicación de escritorio, tienes que ir al Panel de Control y desinstalarlo como cualquier otro programa.&lt;br /&gt;&lt;br /&gt;Aquí está el código del ejemplo en video:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;package draggableapplet;&lt;br /&gt;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;import javafx.scene.Scene;&lt;br /&gt;import javafx.scene.text.*;&lt;br /&gt;import javafx.scene.text.Font;&lt;br /&gt;import javafx.scene.input.MouseEvent;&lt;br /&gt;import javafx.animation.Timeline;&lt;br /&gt;import javafx.scene.shape.Circle;&lt;br /&gt;import javafx.scene.paint.Color;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;import javafx.stage.AppletStageExtension;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;var x:Number;&lt;br /&gt;&lt;br /&gt;Timeline {&lt;br /&gt;repeatCount: Timeline.INDEFINITE&lt;br /&gt;autoReverse: true&lt;br /&gt;keyFrames: [&lt;br /&gt;    at(0.0s) { x =&amp;gt; 40}&lt;br /&gt;    at(1.0s) { x =&amp;gt; 224}&lt;br /&gt;]&lt;br /&gt;}.play();&lt;br /&gt;&lt;br /&gt;Stage {&lt;br /&gt;&lt;br /&gt;title: "Application title"&lt;br /&gt;width: 270&lt;br /&gt;height: 116&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;    extensions: AppletStageExtension {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;            shouldDragStart: function(e: MouseEvent): Boolean {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;                e.primaryButtonDown;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;scene: Scene {&lt;br /&gt;    fill:Color.YELLOW&lt;br /&gt;    content: [&lt;br /&gt;        Circle {&lt;br /&gt;            centerX: bind x,&lt;br /&gt;            centerY: 40&lt;br /&gt;            radius: 40&lt;br /&gt;            fill: Color.RED&lt;br /&gt;        },&lt;br /&gt;        Text {&lt;br /&gt;            font: Font {&lt;br /&gt;                size: 24&lt;br /&gt;            }&lt;br /&gt;            x: 10,&lt;br /&gt;            y: 28&lt;br /&gt;            textOrigin:TextOrigin.TOP&lt;br /&gt;            content: "Arrastrame / Drag me"&lt;br /&gt;        }&lt;br /&gt;    ]&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-4945813090438018782?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/4945813090438018782/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=4945813090438018782' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/4945813090438018782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/4945813090438018782'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/01/javafx-applet-arrastrable.html' title='JavaFX: Applet Arrastrable'/><author><name>Mauro</name><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-114930265400628746.post-5069567974858357938</id><published>2009-01-21T22:56:00.000-08:00</published><updated>2009-02-11T22:56:31.137-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recurso'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='recursos'/><category scheme='http://www.blogger.com/atom/ns#' term='grafica'/><category scheme='http://www.blogger.com/atom/ns#' term='suite'/><category scheme='http://www.blogger.com/atom/ns#' term='imagenes'/><category scheme='http://www.blogger.com/atom/ns#' term='illustrator'/><category scheme='http://www.blogger.com/atom/ns#' term='resources'/><category scheme='http://www.blogger.com/atom/ns#' term='imagen'/><category scheme='http://www.blogger.com/atom/ns#' term='integration'/><category scheme='http://www.blogger.com/atom/ns#' term='production'/><category scheme='http://www.blogger.com/atom/ns#' term='integracion'/><category scheme='http://www.blogger.com/atom/ns#' term='resource'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='graficos'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='grafico'/><title type='text'>JavaFX: Integración con recursos Adobe Illustrator</title><content type='html'>JavaFX permite integrar fácilmente recursos gráficos en el código, permitiendo dar una apariencia más rica y atractiva a las aplicaciones y juegos desarrollados con JavaFX.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/u_YB8j3k4Ms&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/u_YB8j3k4Ms&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Para traspasar recursos de Adobe Illustrator a JavaFX, tienes que instalar el JavaFX Production Suite.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;a style="font-weight: bold;" href="http://sites.google.com/site/javafxscript/Home/animateCD.rar?attredirects=0"&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Una copia completa del proyecto Netbeans -con los recursos Adobe Illustrator- está aquí ... (Download Complete Project)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;archivo CDartUI.fx&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;package animatecd;&lt;br /&gt;&lt;br /&gt;import javafx.scene.Node;&lt;br /&gt;import javafx.fxd.UiStub;&lt;br /&gt;import javafx.scene.Group;&lt;br /&gt;&lt;br /&gt;public &lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;class CDartUI&lt;/span&gt; extends UiStub {&lt;br /&gt;&lt;br /&gt;override public var url = "&lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;{__DIR__}&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204); font-weight: bold;"&gt;CDart.fxz&lt;/span&gt;";&lt;br /&gt;public var Artwork: Node;&lt;br /&gt;&lt;br /&gt;override protected function update() {&lt;br /&gt;&lt;br /&gt;Artwork=getNode("&lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;Artwork&lt;/span&gt;");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Archivo Main.fx&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;package animatecd;&lt;br /&gt;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;import javafx.scene.Scene;&lt;br /&gt;import javafx.scene.text.Text;&lt;br /&gt;import javafx.scene.text.Font;&lt;br /&gt;import javafx.scene.Group;&lt;br /&gt;import javafx.animation.Timeline;&lt;br /&gt;&lt;br /&gt;// carga imagenes de Illustrator&lt;br /&gt;var &lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;ui &lt;/span&gt;= &lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;CDartUI {}&lt;/span&gt;;&lt;br /&gt;var scale:Number;&lt;br /&gt;&lt;br /&gt;Timeline {&lt;br /&gt;repeatCount: Timeline.INDEFINITE&lt;br /&gt;autoReverse: true&lt;br /&gt;keyFrames: [&lt;br /&gt;at(0s) { scale =&amp;gt; 0.1 }&lt;br /&gt;at(10s) { scale =&amp;gt; 12.0 }&lt;br /&gt;]&lt;br /&gt;}.play();&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: Group {&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;content:ui&lt;/span&gt;&lt;br /&gt;scaleX:bind scale&lt;br /&gt;scaleY:bind scale&lt;br /&gt;translateX:bind scale*80&lt;br /&gt;translateY:bind scale*80&lt;br /&gt;rotate:bind scale*36&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;{__DIR__}&lt;/span&gt; indica que el archivo &lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;CDart.fxz&lt;/span&gt; está en el mismo directorio que las clases compiladas (basta poner el archivo &lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;CDart.fxz&lt;/span&gt; en el directorio que contiene el código fuente para que Netbeans lo copie al directorio correspondiente con la copia para distribuir).&lt;br /&gt;&lt;br /&gt;Si el archivo de Adobe Illustrator contiene mas de un elemento (layers identificados con la etiqueda "&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;jfx:&lt;/span&gt;" y el nombre del elemento), puede acceder a las propiedades usando (en este caso) &lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;ui.Artwork.&lt;/span&gt;&lt;span style="color: rgb(255, 102, 0); font-style: italic;"&gt;nombre_de_la_propiedad&lt;/span&gt;. Esto le permitirá mover los elementos contenido en el archivo Adobe, de manera independiente. Otras propiedades que puede alterar son... cambiar su opacidad (transparencia), rotarlo, escalarlo, etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-5069567974858357938?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/5069567974858357938/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=5069567974858357938' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/5069567974858357938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/5069567974858357938'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/01/javafx-integracin-con-recursos-adobe.html' title='JavaFX: Integración con recursos Adobe Illustrator'/><author><name>Mauro</name><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-114930265400628746.post-6853442129122565352</id><published>2009-01-21T12:36:00.000-08:00</published><updated>2009-02-11T22:57:16.486-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='array'/><category scheme='http://www.blogger.com/atom/ns#' term='spanish'/><category scheme='http://www.blogger.com/atom/ns#' term='chile'/><category scheme='http://www.blogger.com/atom/ns#' term='español'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='functions'/><category scheme='http://www.blogger.com/atom/ns#' term='arreglos'/><title type='text'>JavaFX: Pintando un array (arreglo) de funciones y detectando el mouse encima</title><content type='html'>En este ejercicio es posible descubrir varias cosas interesantes:&lt;br /&gt;&lt;br /&gt;1) Como se puede crear un arreglo cuyos elementos son &lt;span style="font-weight: bold;"&gt;funciones&lt;/span&gt; que retornan figuras gráficas.&lt;br /&gt;&lt;br /&gt;2) Como se pueden consolidar en una sola figura los resultados de las funciones en el arreglo (bind for....)&lt;br /&gt;&lt;br /&gt;3) Como, sin hacer nada adicional, el programa es capaz de detectar cuando el mouse entra y sale de esta figura consolidada.&lt;br /&gt;&lt;br /&gt;4) Finalmente, como detalle gráfico, muestra como se puede aplicar un efecto de sombra sobre la figura consolidada.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bastante para tan poco código, ¿no?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/WEFeHVOh-8s&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/WEFeHVOh-8s&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;package experimentfunctions;&lt;br /&gt;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;import javafx.scene.*;&lt;br /&gt;import javafx.scene.shape.*;&lt;br /&gt;import javafx.scene.paint.*;&lt;br /&gt;import javafx.scene.text.*;&lt;br /&gt;import javafx.scene.effect.*;&lt;br /&gt;import javafx.animation.Timeline;&lt;br /&gt;&lt;br /&gt;var count:Integer=0;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;function circulo&lt;/span&gt;():Circle {&lt;br /&gt;Circle{&lt;br /&gt;radius:90&lt;br /&gt;fill:Color.RED&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51); font-weight: bold;"&gt;function rectangulo&lt;/span&gt;():Rectangle {&lt;br /&gt;Rectangle{&lt;br /&gt;width:100&lt;br /&gt;height:75&lt;br /&gt;fill:Color.BLUE&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51); font-weight: bold;"&gt;function texto()&lt;/span&gt;:Text {&lt;br /&gt;Text{&lt;br /&gt;translateX: -80&lt;br /&gt;translateY: -70&lt;br /&gt;font: Font{&lt;br /&gt;   name:"Verdana"&lt;br /&gt;   embolden:true;&lt;br /&gt;   size:24&lt;br /&gt;}&lt;br /&gt;content: "Prueba de texto"&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;var &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;functions&lt;/span&gt;=[&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;circulo(),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;    rectangulo(),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;    texto()&lt;/span&gt;&lt;br /&gt;];&lt;br /&gt;&lt;br /&gt;var shadow=0;&lt;br /&gt;&lt;br /&gt;var &lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;shadowAnim &lt;/span&gt;= Timeline {&lt;br /&gt;repeatCount: Timeline.INDEFINITE&lt;br /&gt;autoReverse: true&lt;br /&gt;keyFrames: [&lt;br /&gt;at(0s) { shadow =&amp;gt; 4 }&lt;br /&gt;at(0.3s) { shadow =&amp;gt; 10}&lt;br /&gt;]&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;Stage {&lt;br /&gt;title: "Application title"&lt;br /&gt;width: 250&lt;br /&gt;height: 250&lt;br /&gt;scene: Scene {&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;content&lt;/span&gt;: Group {&lt;br /&gt;   translateX:100&lt;br /&gt;   translateY:100&lt;br /&gt;   &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;content: bind for (&lt;span style="color: rgb(51, 255, 51);"&gt;shape &lt;/span&gt;in functions) &lt;span style="color: rgb(51, 255, 51);"&gt;shape&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0, 204, 204); font-weight: bold;"&gt;effect: DropShadow&lt;/span&gt; {&lt;br /&gt;       offsetY: bind shadow&lt;br /&gt;       offsetX: bind shadow&lt;br /&gt;   }&lt;br /&gt;   onMouseEntered: function(e) {&lt;br /&gt;       &lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;shadowAnim.stop();&lt;/span&gt;&lt;br /&gt;   }&lt;br /&gt;   onMouseExited: function(e) {&lt;br /&gt;       &lt;span style="color: rgb(204, 51, 204); font-weight: bold;"&gt;shadowAnim.play();&lt;/span&gt;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204); font-weight: bold;"&gt;shadowAnim.play();&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Una explicación más detallada sobre &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;bind for (shape in functions) shape&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Lo que hace esta instrucción es... obtener cada una de las funciones en el arreglo:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51); font-weight: bold;"&gt;for (shape in functions)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;... luego ejecutarlas y pasar ese resultado como parte del contenido a pintar.&lt;br /&gt;&lt;br /&gt;Una forma más ordenada de presentar el código sería:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51); font-weight: bold;"&gt;content:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51); font-weight: bold;"&gt;    bind&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51); font-weight: bold;"&gt;        for (shape in functions)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51); font-weight: bold;"&gt;            shape;&lt;/span&gt; &lt;-- ejecuta y retorna la figura    &lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-6853442129122565352?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/6853442129122565352/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=6853442129122565352' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/6853442129122565352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/6853442129122565352'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/01/javafx-pintando-un-array-arreglo-de.html' title='JavaFX: Pintando un array (arreglo) de funciones y detectando el mouse encima'/><author><name>Mauro</name><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-114930265400628746.post-588066259706862991</id><published>2009-01-19T13:58:00.001-08:00</published><updated>2009-02-11T22:57:39.913-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='minimo'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='maximum'/><category scheme='http://www.blogger.com/atom/ns#' term='detect'/><category scheme='http://www.blogger.com/atom/ns#' term='detection'/><category scheme='http://www.blogger.com/atom/ns#' term='bind with reverse'/><category scheme='http://www.blogger.com/atom/ns#' term='detectar'/><category scheme='http://www.blogger.com/atom/ns#' term='ventana'/><category scheme='http://www.blogger.com/atom/ns#' term='maximo'/><category scheme='http://www.blogger.com/atom/ns#' term='window'/><category scheme='http://www.blogger.com/atom/ns#' term='minimum'/><category scheme='http://www.blogger.com/atom/ns#' term='deteccion'/><category scheme='http://www.blogger.com/atom/ns#' term='tamaño'/><category scheme='http://www.blogger.com/atom/ns#' term='limits'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='cambio'/><category scheme='http://www.blogger.com/atom/ns#' term='resize'/><title type='text'>JavaFX: Limita el tamaño de la ventana (mínimo y máximo) - Bind with inverse</title><content type='html'>Esta es una variación del ejemplo anterior, que detectaba el tamaño de la ventana para ajustar el contenido (cómo descubrir el tamaño de la ventana). En este caso, fuerza dimensiones mínimas y máximas para la ventana.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/nd19-wGTDSw&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/nd19-wGTDSw&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Como vimos en el ejemplo anterior, la instrucción 'bind with inverse' permite iniciar el tamaño de la ventana unas ciertas dimensiones (300x300 pixeles), pero luego, las variables 'w' y 'h' reciben las variaciones del tamaño de la ventana, a través del mismo 'bind with inverse'. Esto, sumado a la instrucción 'on replace' (al definir las variables para el tamaño de la ventana), permite gatillar la validación del tamaño de la ventana.... y forzar su tamaño dentro de límites al asignar nuevos valores para las variables 'w' y 'h'.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 51);"&gt;En otras palabras, las variables 'w' y 'h' se hacen BIDIRECCIONALES... pues al modificar su valor, se afecta el tamaño de la ventana.... y al modificar el tamaño de la ventana, se actualiza los valores de las variables, con las nuevas dimensiones.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package experimentsize;&lt;br /&gt;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;import javafx.scene.Scene;&lt;br /&gt;import javafx.scene.shape.*;&lt;br /&gt;import javafx.scene.paint.*;&lt;br /&gt;import javafx.geometry.Rectangle2D;&lt;br /&gt;&lt;br /&gt;// borde horizontal de la ventana&lt;br /&gt;var bh=16.0;&lt;br /&gt;// borde vertical de la ventana (incluye titulo)&lt;br /&gt;var bv=36.0;&lt;br /&gt;// dimension minima de la ventana&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;var minSize=Rectangle2D{width:200 height:200};&lt;/span&gt;&lt;br /&gt;// dimension maxima de la ventana&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;var maxSize=Rectangle2D{width:500 height:500};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;// valida dimensiones de la ventana&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;function &lt;span style="color: rgb(51, 255, 51);"&gt;validateSize&lt;/span&gt;():Void {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;   if (w&amp;lt;minSize.width) then w=minSize.width;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;   if (h&amp;lt;minSize.height) then h=minSize.height;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;   if (w&amp;gt;maxSize.width) then w=maxSize.width;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;   if (h&amp;gt;maxSize.height) then h=maxSize.height;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;   println("ajusto ventana a {w} x {h}");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;// tamaño inicial de la ventana&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;var w=300.0 &lt;span style="color: rgb(51, 255, 51);"&gt;on replace&lt;/span&gt; {&lt;span style="color: rgb(51, 255, 51);"&gt;validateSize&lt;/span&gt;()};&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;var h=300.0 &lt;span style="color: rgb(51, 255, 51);"&gt;on replace&lt;/span&gt; {&lt;span style="color: rgb(51, 255, 51);"&gt;validateSize&lt;/span&gt;()};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Stage {&lt;br /&gt;title: "Ajusta a dimension de ventana"&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;width: bind w with inverse&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;  height: bind h with inverse&lt;/span&gt;&lt;br /&gt;scene: Scene {&lt;br /&gt;    content: {&lt;br /&gt;        Circle {&lt;br /&gt;            translateX: bind (w-bh)/2&lt;br /&gt;            translateY: bind (h-bv)/2&lt;br /&gt;            radius:bind if (w&amp;lt;h) then&lt;br /&gt;                        (w-50)/2&lt;br /&gt;                    else&lt;br /&gt;                        (h-80)/2&lt;br /&gt;            fill:Color.RED&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-588066259706862991?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/588066259706862991/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=588066259706862991' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/588066259706862991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/588066259706862991'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/01/limita-el-tamao-de-la-ventana-tamao.html' title='JavaFX: Limita el tamaño de la ventana (mínimo y máximo) - Bind with inverse'/><author><name>Mauro</name><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-114930265400628746.post-8248772698972094875</id><published>2009-01-19T02:21:00.000-08:00</published><updated>2009-02-11T22:58:00.791-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bind with inverse'/><category scheme='http://www.blogger.com/atom/ns#' term='width'/><category scheme='http://www.blogger.com/atom/ns#' term='height'/><category scheme='http://www.blogger.com/atom/ns#' term='ancho'/><category scheme='http://www.blogger.com/atom/ns#' term='window'/><category scheme='http://www.blogger.com/atom/ns#' term='ajustar'/><category scheme='http://www.blogger.com/atom/ns#' term='alto'/><category scheme='http://www.blogger.com/atom/ns#' term='como usar'/><category scheme='http://www.blogger.com/atom/ns#' term='frame'/><category scheme='http://www.blogger.com/atom/ns#' term='spanish'/><category scheme='http://www.blogger.com/atom/ns#' term='que es'/><category scheme='http://www.blogger.com/atom/ns#' term='tamaño'/><category scheme='http://www.blogger.com/atom/ns#' term='circle'/><category scheme='http://www.blogger.com/atom/ns#' term='circulo'/><category scheme='http://www.blogger.com/atom/ns#' term='español'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='dependencias'/><category scheme='http://www.blogger.com/atom/ns#' term='resize'/><category scheme='http://www.blogger.com/atom/ns#' term='explicacion'/><title type='text'>JavaFX: Bind with inverse. Ajusta tamaño de círculo a tamaño de la ventana</title><content type='html'>La instrucción BIND es una de las cosas interesantes de JavaFX Script. Esta permite declarar la DEPENDENCIA entre una variable y otros elementos del programa. Por ejemplo, si al declarar un circulo, se define que el color de este dependerá de una variable X, al cambiar el color asignado a X se produce la actualización automática del círculo en pantalla, sin necesidad de ordenar al programa que repinte.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/rXEObKbaNbQ&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/rXEObKbaNbQ&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre&gt;Circle {&lt;br /&gt; radius:20&lt;br /&gt; fill:&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;bind colorcirculo&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;Ahora bien, la instrucción BIND puede ir acompañada de la instrucción WITH INVERSE, por ejemplo:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;var a=&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;bind b with inverse;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Esto significa que cuando se cambie el valor de 'b' en algún lugar del programa, se asignará el nuevo valor de 'b' a 'a', pero también quiere decir que cuando se modifique el valor de 'a' también se traspasará el valor de 'a' a 'b'.&lt;br /&gt;&lt;br /&gt;¿Qué utilidad puede tener esta instrucción? ... pues, por ejemplo, se puede usar para ajustar el tamaño de un círculo al tamaño de la ventana que lo contiene... o para conocer las medidas de la ventana y cuando se cambia su tamaño.&lt;br /&gt;&lt;br /&gt;En el siguiente ejemplo, se usa 'bind with inverse' para asignar el tamaño inicial de la ventana (300x300 pixeles)... pero luego, cuando se ajusta manualmente el tamaño de la ventana, la misma instrucción 'bind with inverse' pasa de regreso el tamaño actualizado de la ventana a las variables 'h' y 'w' que originalmente definieron su tamaño (h=height=alto y w=width=ancho).&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package experimentsize;&lt;br /&gt;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;import javafx.stage.StageStyle;&lt;br /&gt;import javafx.scene.Scene;&lt;br /&gt;import javafx.scene.text.Text;&lt;br /&gt;import javafx.scene.text.Font;&lt;br /&gt;import javafx.scene.shape.*;&lt;br /&gt;import javafx.scene.paint.*;&lt;br /&gt;import java.lang.System;&lt;br /&gt;&lt;br /&gt;// tamaño inicial de la ventana&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;var w=300.0&lt;/span&gt; &lt;span style="color: rgb(51, 255, 255);"&gt;on replace {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;    println("ajusto ancho de la ventana a {w}");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;var h=300.0&lt;/span&gt;&lt;span style="color: rgb(51, 255, 255);"&gt; on replace {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;    println("ajusto alto de la ventana a {h}");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255);"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;// borde horizontal de la ventana&lt;br /&gt;var bh=16.0;&lt;br /&gt;// borde vertical de la ventana (incluye titulo)&lt;br /&gt;var bv=36.0;&lt;br /&gt;&lt;br /&gt;Stage {&lt;br /&gt;title: "Ajusta al tamaño de ventana"&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;width: bind w with inverse&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;    height: bind h with inverse&lt;/span&gt;&lt;br /&gt;scene: Scene {&lt;br /&gt;    content: {&lt;br /&gt;        &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Circle &lt;/span&gt;{&lt;br /&gt;            translateX: &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;bind &lt;/span&gt;(&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;w &lt;/span&gt;- bh) / 2&lt;br /&gt;            translateY: &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;bind &lt;/span&gt;(&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;h &lt;/span&gt;- bv) / 2&lt;br /&gt;            radius:&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;bind &lt;/span&gt;&lt;br /&gt;                if (&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;w &amp;lt; h&lt;/span&gt;) then (&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;w &lt;/span&gt;- 50) / 2 else ( &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;h &lt;/span&gt;- 80) / 2&lt;br /&gt;            fill:Color.RED&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-8248772698972094875?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/8248772698972094875/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=8248772698972094875' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/8248772698972094875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/8248772698972094875'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/01/bind-with-inverse-ajusta-tamao-de.html' title='JavaFX: Bind with inverse. Ajusta tamaño de círculo a tamaño de la ventana'/><author><name>Mauro</name><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-114930265400628746.post-984668273288020037</id><published>2009-01-18T08:38:00.000-08:00</published><updated>2009-02-11T22:58:39.283-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='como'/><category scheme='http://www.blogger.com/atom/ns#' term='boucing'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='arrastrar'/><category scheme='http://www.blogger.com/atom/ns#' term='codigo fuente'/><category scheme='http://www.blogger.com/atom/ns#' term='source code'/><category scheme='http://www.blogger.com/atom/ns#' term='draggable'/><category scheme='http://www.blogger.com/atom/ns#' term='efecto'/><category scheme='http://www.blogger.com/atom/ns#' term='elastico'/><category scheme='http://www.blogger.com/atom/ns#' term='example'/><category scheme='http://www.blogger.com/atom/ns#' term='efectos'/><category scheme='http://www.blogger.com/atom/ns#' term='drag and drop'/><category scheme='http://www.blogger.com/atom/ns#' term='arrastrable'/><category scheme='http://www.blogger.com/atom/ns#' term='resorte'/><category scheme='http://www.blogger.com/atom/ns#' term='bounce'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='objeto'/><category scheme='http://www.blogger.com/atom/ns#' term='contenedor'/><title type='text'>JavaFX: Objetos arrastrables con "efectos"</title><content type='html'>Este ejemplo incluye 3 clases:&lt;br /&gt;&lt;br /&gt;1) Una clase (SpringInterpolator) que define un nuevo tipo de "interpolador" que genera un movimiento "elástico" (de resorte)&lt;br /&gt;&lt;br /&gt;2) Una clase (DraggableObj) que permite que los elementos asignados sean "arrastrables" (drag and drop).&lt;br /&gt;&lt;br /&gt;3) La clase principal (Main) que implementa la aplicación y que agrega 4 elementos para arrastrar por la ventana.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/lodN_ElEfYI&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/lodN_ElEfYI&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;archivo SpringInterpolator.fx&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;package DraggableClass;&lt;br /&gt;&lt;br /&gt;import javafx.animation.SimpleInterpolator;&lt;br /&gt;import java.lang.Math;&lt;br /&gt;&lt;br /&gt;public class &lt;span style="font-weight: bold; color: rgb(255, 153, 255);"&gt;SpringInterpolator &lt;/span&gt;extends SimpleInterpolator {&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    // amplitud de la onda&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// controla que tan lejos puede llegar el objeto desde su punto final&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;public-init var amplitude:Number = 1.0;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// determina el peso del objeto&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// hace el movimiento de la onda mas grande y llega mas lejos&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;public-init var mass:Number = 0.058;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// rigidez del movimiento de la onda o resolte&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// hace la onda mas corta o ceñida&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;public-init var stiffness:Number = 12.0;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// hace la onda de fase, de modo que el objeto&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// no acabe en el lugar de descanso.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// esta variable generalmente no cambia&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;public-init var phase:Number = 0.0;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// si actua como un resorte normal o rebota&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;public-init var bounce:Boolean = false;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// usado para calculos internos&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;var pulsation:Number;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;init {&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;this.pulsation = Math.sqrt(stiffness / mass);&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// ecuacion del resorte&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;override public function curve(t: Number) : Number {&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;var t2 = -Math .cos(pulsation   *   t   +   phase   +   Math.PI) * (1 - t) * amplitude ;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// usa el valor absoluto de la distancia si rebota&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;if(bounce) {&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;    return 1 - Math.abs(t2);&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;} else {&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;    return 1 - t2;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    &lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;archivo DraggableObj.fx&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;package DraggableClass;&lt;br /&gt;&lt;br /&gt;import javafx.scene.Group;&lt;br /&gt;import javafx.scene.CustomNode;&lt;br /&gt;import javafx.scene.Node;&lt;br /&gt;import javafx.scene.shape.*;&lt;br /&gt;import javafx.scene.paint.*;&lt;br /&gt;import javafx.animation.Timeline;&lt;br /&gt;import javafx.animation.Timeline.*;&lt;br /&gt;import javafx.animation.Interpolator;&lt;br /&gt;import javafx.animation.Interpolator.*;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public &lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;class DraggableObj extends CustomNode&lt;/span&gt; {&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 204, 0); font-weight: bold;"&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;public var &lt;/span&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;content&lt;/span&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;: Node[];&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;var endX = 0.0;&lt;br /&gt;var endY = 0.0;&lt;br /&gt;var startX = 0.0;&lt;br /&gt;var startY = 0.0;&lt;br /&gt;&lt;br /&gt;var op:Number=100;&lt;br /&gt;var scale:Number=100;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// produce un parpadeo rapido al&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// al soltar los objetos arrastrados&lt;/span&gt;&lt;br /&gt;var &lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;t&lt;/span&gt; = Timeline {&lt;br /&gt;repeatCount: 3&lt;br /&gt;keyFrames: [&lt;br /&gt;at (0s) { op =&amp;gt; 100.0 },&lt;br /&gt;at (0.05s) { op =&amp;gt; 0.0 }&lt;br /&gt;]&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// instancia el interpolador de resorte&lt;/span&gt;&lt;br /&gt;def spring = &lt;span style="font-weight: bold; color: rgb(255, 153, 255);"&gt;SpringInterpolator &lt;/span&gt;{ bounce: true};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// escala objetos con efecto de resorte&lt;/span&gt;&lt;br /&gt;var &lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;s&lt;/span&gt; = Timeline {&lt;br /&gt;keyFrames: [&lt;br /&gt;at (1.5s) { scale =&amp;gt; 100.0 tween spring},&lt;br /&gt;]&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// escala objectos de tamano original&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// a tamano 50% mas grande al hacer&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// click sobre ellos&lt;/span&gt;&lt;br /&gt;var &lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;i&lt;/span&gt; = Timeline {&lt;br /&gt;keyFrames: [&lt;br /&gt;at (0s) { scale =&amp;gt; 100.0 },&lt;br /&gt;at (0.3s) { scale =&amp;gt; 150.0},&lt;br /&gt;]&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;override function create() : Node&lt;/span&gt; {&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// produce una variacion constante en la&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// opacidad de los elementos arrastrables&lt;/span&gt;&lt;br /&gt;Timeline {&lt;br /&gt;repeatCount: Timeline.INDEFINITE&lt;br /&gt;autoReverse: true&lt;br /&gt;keyFrames: [&lt;br /&gt;  at (0s) { op =&amp;gt; 70.0 },&lt;br /&gt;  at (0.3s) { op =&amp;gt; 100.0 tween Interpolator.EASEBOTH}&lt;br /&gt;]&lt;br /&gt;}.play();&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;Group &lt;/span&gt;{&lt;br /&gt;translateX: bind endX&lt;br /&gt;translateY: bind endY&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 204, 0);"&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;content: bind &lt;/span&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;content&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;  opacity: bind op/100.0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;  scaleX: bind scale/100.0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;  scaleY: bind scale/100.0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;onMouseDragged&lt;/span&gt;: function(e) {&lt;br /&gt;  endX = e.dragX-startX;&lt;br /&gt;  endY = e.dragY-startY;&lt;br /&gt;}&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;onMousePressed&lt;/span&gt;: function(e) {&lt;br /&gt;  startX = e.dragX-endX;&lt;br /&gt;  startY = e.dragY-endY;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;      &lt;span style="color: rgb(51, 255, 51);"&gt;s&lt;/span&gt;.stop();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;      &lt;span style="color: rgb(51, 255, 51);"&gt;i&lt;/span&gt;.playFromStart();&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;onMouseReleased&lt;/span&gt;: function(e) {&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;      &lt;/span&gt;&lt;span style="color: rgb(51, 255, 51); font-weight: bold;"&gt;t&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;.playFromStart();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;      &lt;/span&gt;&lt;span style="color: rgb(51, 255, 51); font-weight: bold;"&gt;s&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;.time=0s;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;      &lt;/span&gt;&lt;span style="color: rgb(51, 255, 51); font-weight: bold;"&gt;s&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;.play();&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;archivo Main.fx&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;package DraggableClass;&lt;br /&gt;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;import javafx.scene.Scene;&lt;br /&gt;import javafx.scene.image.*;&lt;br /&gt;import javafx.scene.paint.*;&lt;br /&gt;import javafx.scene.shape.*;&lt;br /&gt;import javafx.scene.input.MouseEvent;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var newCircle=&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;DraggableObj&lt;/span&gt;{&lt;br /&gt;translateX:700&lt;br /&gt;translateY:200&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;content&lt;/span&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;: Circle {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;        radius: 100&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;        fill: Color.RED&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;        opacity:0.75&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 204);"&gt;// este objeto incluye un ARRAY (arreglo) de figuras&lt;/span&gt;&lt;br /&gt;var newCircle2=&lt;span style="color: rgb(255, 255, 51); font-weight: bold;"&gt;DraggableObj&lt;/span&gt;{&lt;br /&gt;translateX:200&lt;br /&gt;translateY:200&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;content&lt;/span&gt;: &lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;[&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(255, 102, 0);"&gt;Circle &lt;/span&gt;{&lt;br /&gt;     opacity:0.5&lt;br /&gt;     fill:Color.BLUE&lt;br /&gt;     radius:70&lt;br /&gt; }&lt;span style="color: rgb(204, 51, 204); font-weight: bold;"&gt;,&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(255, 102, 0);"&gt;Rectangle &lt;/span&gt;{&lt;br /&gt;     translateX:-50&lt;br /&gt;     translateY:-50&lt;br /&gt;     width:100&lt;br /&gt;     height:100&lt;br /&gt;     rotate:45&lt;br /&gt;     fill:Color.GREEN&lt;br /&gt;     opacity:0.5&lt;br /&gt; }&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;]&lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;var newImage=&lt;span style="color: rgb(255, 255, 51); font-weight: bold;"&gt;DraggableObj&lt;/span&gt;{&lt;br /&gt;translateX:200&lt;br /&gt;translateY:500&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51); font-weight: bold;"&gt;content&lt;/span&gt;: &lt;span style="color: rgb(255, 102, 0);"&gt;ImageView &lt;/span&gt;{&lt;br /&gt; opacity:0.8&lt;br /&gt; preserveRatio:true&lt;br /&gt; fitWidth:200&lt;br /&gt; image: Image {&lt;br /&gt;//            url: "file:/C:/Users/myuser/Pictures/2008a.png"&lt;br /&gt;     url: "http://www.google.com/intl/en_ALL/images/logo.gif"&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var newRect=&lt;span style="color: rgb(255, 255, 51); font-weight: bold;"&gt;DraggableObj&lt;/span&gt;{&lt;br /&gt;translateX:700&lt;br /&gt;translateY:500&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;content&lt;/span&gt;: &lt;span style="color: rgb(255, 102, 0);"&gt;Rectangle &lt;/span&gt;{&lt;br /&gt; width:100&lt;br /&gt; height:100&lt;br /&gt; rotate:45&lt;br /&gt; fill:Color.PURPLE&lt;br /&gt; opacity:0.5&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Stage {&lt;br /&gt;title: "Application title"&lt;br /&gt;width: 1200&lt;br /&gt;height: 750&lt;br /&gt;scene: Scene {&lt;br /&gt; &lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;  // Incluye un ARRAY de objetos&lt;/span&gt;&lt;br /&gt;   content: &lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;[&lt;/span&gt;&lt;br /&gt;       newCircle&lt;span style="color: rgb(204, 51, 204); font-weight: bold;"&gt;,&lt;/span&gt;&lt;br /&gt;       newCircle2&lt;span style="color: rgb(204, 51, 204); font-weight: bold;"&gt;,&lt;/span&gt;&lt;br /&gt;       newImage&lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;,&lt;/span&gt;&lt;br /&gt;       newRect&lt;br /&gt; &lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;  ]&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-984668273288020037?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/984668273288020037/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=984668273288020037' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/984668273288020037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/984668273288020037'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/01/objetos-arrastrables-con-efectos.html' title='JavaFX: Objetos arrastrables con &quot;efectos&quot;'/><author><name>Mauro</name><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-114930265400628746.post-570341171724569865</id><published>2009-01-17T11:58:00.000-08:00</published><updated>2009-02-11T23:01:09.634-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clase'/><category scheme='http://www.blogger.com/atom/ns#' term='clases'/><category scheme='http://www.blogger.com/atom/ns#' term='class'/><category scheme='http://www.blogger.com/atom/ns#' term='componente'/><category scheme='http://www.blogger.com/atom/ns#' term='animacion'/><category scheme='http://www.blogger.com/atom/ns#' term='classes'/><category scheme='http://www.blogger.com/atom/ns#' term='component'/><category scheme='http://www.blogger.com/atom/ns#' term='spanish'/><category scheme='http://www.blogger.com/atom/ns#' term='compound'/><category scheme='http://www.blogger.com/atom/ns#' term='animation'/><category scheme='http://www.blogger.com/atom/ns#' term='español'/><category scheme='http://www.blogger.com/atom/ns#' term='compuestos'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='objects. object'/><title type='text'>JavaFX: Clases de clases... y dos Scene alternadas</title><content type='html'>Este ejemplo crea una clase que hace rotar un círculo. Luego, crea una nueva clase que utiliza varias instancias de la primera clase para hacer rotar varios círculos dentro del nuevo objeto. Finalmente, crea varias instancias de este último tipo de objeto y los pone en dos Scene que luego alterna... es decir, es un Stage con dos Scene.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/FF7DqOVHq2c&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/FF7DqOVHq2c&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;package experimentroam;&lt;br /&gt;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;import javafx.animation.*;&lt;br /&gt;import javafx.scene.*;&lt;br /&gt;import javafx.scene.text.*;&lt;br /&gt;import javafx.scene.shape.*;&lt;br /&gt;import javafx.scene.paint.*;&lt;br /&gt;&lt;br /&gt;// clase basica que dibuja circulo moviendose formando un cuadrado&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;class myObject extends CustomNode&lt;/span&gt; {&lt;br /&gt;&lt;br /&gt;var x:Number;&lt;br /&gt;var y:Number;&lt;br /&gt;&lt;br /&gt;public var ix=0;&lt;br /&gt;public var iy=0;&lt;br /&gt;public var dx=100;&lt;br /&gt;public var dy=100;&lt;br /&gt;public var radius=40;&lt;br /&gt;public var color=Color.RED;&lt;br /&gt;&lt;br /&gt;var roamingtimeline = Timeline {&lt;br /&gt;repeatCount: Timeline.INDEFINITE&lt;br /&gt;  keyFrames: [&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;        at(0s) { x =&amp;gt; ix+radius; y =&amp;gt; iy+radius }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;        at(0.3s) { x =&amp;gt; dx-radius; y =&amp;gt; iy+radius }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;        at(0.6s) { x =&amp;gt; dx-radius; y =&amp;gt; dy-radius }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;        at(0.9s) { x =&amp;gt; ix+radius; y =&amp;gt; dy-radius }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;        at(1.2s) { x =&amp;gt; ix+radius; y =&amp;gt; iy+radius }&lt;/span&gt;&lt;br /&gt;   ]&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// mensaje desplegado (compuesto por texto y rectangulo a su alrededor)&lt;br /&gt;&lt;span style="color: rgb(255, 255, 51); font-weight: bold;"&gt;override protected function create():Node&lt;/span&gt; {&lt;br /&gt;  roamingtimeline.play();&lt;br /&gt;  Group {&lt;br /&gt;      content: [&lt;br /&gt;          Circle {&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;                centerX: bind x&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;                centerY: bind y&lt;/span&gt;&lt;br /&gt;               radius: bind radius&lt;br /&gt;              fill: bind color&lt;br /&gt;          }&lt;br /&gt;      ]&lt;br /&gt;  }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// clase compuesta por objetos de la clase precedente&lt;br /&gt;&lt;span style="color: rgb(255, 153, 255); font-weight: bold;"&gt;class myBigObject extends CustomNode&lt;/span&gt; {&lt;br /&gt;&lt;br /&gt;var fig:myObject=&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;myObject&lt;/span&gt;{&lt;br /&gt;  ix: 0&lt;br /&gt;  iy: 0&lt;br /&gt;  radius:55&lt;br /&gt;  dx:250&lt;br /&gt;  dy:250&lt;br /&gt;  color:Color.PURPLE&lt;br /&gt;}&lt;br /&gt;var fig2:myObject=&lt;span style="color: rgb(255, 255, 51); font-weight: bold;"&gt;myObject&lt;/span&gt;{&lt;br /&gt;  ix: 40&lt;br /&gt;  iy: 40&lt;br /&gt;  radius:40&lt;br /&gt;  dx:210&lt;br /&gt;  dy:210&lt;br /&gt;  color:Color.RED&lt;br /&gt;}&lt;br /&gt;var fig3:myObject=&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;myObject&lt;/span&gt;{&lt;br /&gt;  ix: 80&lt;br /&gt;  iy: 80&lt;br /&gt;  radius:30&lt;br /&gt;  dx:170&lt;br /&gt;  dy:170&lt;br /&gt;  color:Color.GREEN&lt;br /&gt;}&lt;br /&gt;var fig4:myObject=&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;myObject&lt;/span&gt;{&lt;br /&gt;  ix: 120&lt;br /&gt;  iy: 120&lt;br /&gt;  radius:20&lt;br /&gt;  dx:130&lt;br /&gt;  dy:130&lt;br /&gt;  color:Color.BLUE&lt;br /&gt;}&lt;br /&gt;var fig5:myObject=&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;myObject&lt;/span&gt;{&lt;br /&gt;  ix: 160&lt;br /&gt;  iy: 160&lt;br /&gt;  radius:10&lt;br /&gt;  dx:90&lt;br /&gt;  dy:90&lt;br /&gt;  color:Color.YELLOW&lt;br /&gt;}&lt;br /&gt;var fig6:myObject=&lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;myObject&lt;/span&gt;{&lt;br /&gt;  ix: 190&lt;br /&gt;  iy: 190&lt;br /&gt;  radius:5&lt;br /&gt;  dx:60&lt;br /&gt;  dy:60&lt;br /&gt;  color:Color.ORANGE&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 153, 255);"&gt;override protected function create():Node&lt;/span&gt; {&lt;br /&gt;  Group {&lt;br /&gt;      content: [&lt;br /&gt;          fig,&lt;br /&gt;          fig2,&lt;br /&gt;          fig3,&lt;br /&gt;          fig4,&lt;br /&gt;          fig5,&lt;br /&gt;          fig6&lt;br /&gt;      ]&lt;br /&gt;  }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// instancia de clase compuesta&lt;br /&gt;var bigFig:myBigObject=&lt;span style="font-weight: bold; color: rgb(255, 153, 255);"&gt;myBigObject&lt;/span&gt;{};&lt;br /&gt;&lt;br /&gt;// instancia de clase compuesta desplazada en la pantalla&lt;br /&gt;var bigFig2:myBigObject=&lt;span style="font-weight: bold; color: rgb(255, 153, 255);"&gt;myBigObject&lt;/span&gt;{&lt;br /&gt;translateX:250&lt;br /&gt;translateY:0&lt;br /&gt;};&lt;br /&gt;// instancia de clase compuesta desplazada en la pantalla&lt;br /&gt;var bigFig3:myBigObject=&lt;span style="font-weight: bold; color: rgb(255, 153, 255);"&gt;myBigObject&lt;/span&gt;{&lt;br /&gt;translateX:250&lt;br /&gt;translateY:250&lt;br /&gt;};&lt;br /&gt;// instancia de clase compuesta desplazada en la pantalla&lt;br /&gt;var bigFig4:myBigObject=&lt;span style="font-weight: bold; color: rgb(255, 153, 255);"&gt;myBigObject&lt;/span&gt;{&lt;br /&gt;translateX:0&lt;br /&gt;translateY:250&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;var &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;myScene&lt;/span&gt;:Scene=Scene {&lt;br /&gt;  fill:Color.BLACK&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;     content: [&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;         bigFig,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;         bigFig2,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;         bigFig3,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;         bigFig4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;     ]&lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;var &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;myScene2&lt;/span&gt;:Scene=Scene {&lt;br /&gt;  fill:Color.BLACK&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;     content: [&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;         bigFig,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;         bigFig3,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;     ]&lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;var &lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;scenes=[myScene, myScene2];&lt;/span&gt;&lt;br /&gt;var activeScene:Integer;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Timeline &lt;/span&gt;{&lt;br /&gt;repeatCount: Timeline.INDEFINITE&lt;br /&gt;keyFrames: [&lt;br /&gt;  at(0s) { &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;activeScene&lt;/span&gt; =&amp;gt; 0 }&lt;br /&gt;  at(1s) { &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;activeScene&lt;/span&gt; =&amp;gt; 1 }&lt;br /&gt;]&lt;br /&gt;}.play();&lt;br /&gt;&lt;br /&gt;Stage {&lt;br /&gt;  title: "Application title"&lt;br /&gt;  width: 500+16&lt;br /&gt;  height: 500+36&lt;br /&gt;  &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;scene: bind &lt;span style="color: rgb(51, 255, 51);"&gt;scenes&lt;/span&gt;[activeScene]&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-570341171724569865?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/570341171724569865/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=570341171724569865' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/570341171724569865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/570341171724569865'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/01/clases-de-clases.html' title='JavaFX: Clases de clases... y dos Scene alternadas'/><author><name>Mauro</name><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-114930265400628746.post-7279469869532387431</id><published>2009-01-17T04:22:00.000-08:00</published><updated>2009-02-11T23:02:49.831-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='texto'/><category scheme='http://www.blogger.com/atom/ns#' term='objetos'/><category scheme='http://www.blogger.com/atom/ns#' term='calling'/><category scheme='http://www.blogger.com/atom/ns#' term='rotate'/><category scheme='http://www.blogger.com/atom/ns#' term='rotacion'/><category scheme='http://www.blogger.com/atom/ns#' term='call'/><category scheme='http://www.blogger.com/atom/ns#' term='function'/><category scheme='http://www.blogger.com/atom/ns#' term='instancias'/><category scheme='http://www.blogger.com/atom/ns#' term='text'/><category scheme='http://www.blogger.com/atom/ns#' term='timeline'/><category scheme='http://www.blogger.com/atom/ns#' term='llamar'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='funcion'/><category scheme='http://www.blogger.com/atom/ns#' term='ejecutar'/><title type='text'>JavaFX: Textos que giran y cambian de tamaño</title><content type='html'>Este ejercicio lo desarrollé para crear una clase que contiene sus propios timeline y que modifica el tamaño del font mientras gira el mensaje. Quizas lo más interesante de este ejercicio es la manera en que se modifica el tamaño del font desde el timeline. Otra cosa interesante es cómo el programa obtiene las dimensiones del texto para pintar el area que lo contiene (para ello es necesario que el texto sea definido en una variable y luego incluida en el contenido).&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/3LI5IYZER90&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/3LI5IYZER90&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;package experimenttext;&lt;br /&gt;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;import javafx.animation.*;&lt;br /&gt;import javafx.scene.*;&lt;br /&gt;import javafx.scene.text.*;&lt;br /&gt;import javafx.scene.shape.Rectangle;&lt;br /&gt;import javafx.scene.paint.Color;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 255, 255); font-weight: bold;"&gt;class myObject&lt;/span&gt; extends CustomNode {&lt;br /&gt;&lt;br /&gt; // texto en el mensaje&lt;br /&gt; public var message = "Nada aun";&lt;br /&gt; // color del mensaje&lt;br /&gt; public var color = Color.BLACK;&lt;br /&gt; // color borde&lt;br /&gt; public var stroke = Color.BLACK;&lt;br /&gt; // color fondo&lt;br /&gt; public var fill = Color.WHITE;&lt;br /&gt; // tamaño maximo del font&lt;br /&gt; public var max_size = 64.0;&lt;br /&gt;&lt;br /&gt; // angulo de la rotacion&lt;br /&gt; var angle: Number;&lt;br /&gt; // tamaño del font&lt;br /&gt; var &lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;size&lt;/span&gt;: Number;&lt;br /&gt; // font del texto&lt;br /&gt; &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;var varfont = function(&lt;span style="color: rgb(255, 255, 51);"&gt;size&lt;/span&gt;:Number):&lt;span style="color: rgb(204, 51, 204);"&gt;Font &lt;/span&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;        &lt;span style="color: rgb(204, 51, 204);"&gt;Font&lt;/span&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;            name:"Verdana"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;            oblique:true;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;            size:&lt;span style="color: rgb(255, 255, 51);"&gt;size&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;    };&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; // mensaje desplegado&lt;br /&gt; var &lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;geomText = Text&lt;/span&gt; {&lt;br /&gt;     content: bind message&lt;br /&gt;     &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;font : &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;bind varfont(&lt;/span&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;size&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;     fill: bind color&lt;br /&gt;     textOrigin: TextOrigin.TOP&lt;br /&gt; };&lt;br /&gt;&lt;br /&gt; // rotacion del mensaje (un giro en 2 segundos)&lt;br /&gt; var rotatetimeline = Timeline {&lt;br /&gt;  repeatCount: Timeline.INDEFINITE&lt;br /&gt;     keyFrames: [&lt;br /&gt;         at(0s) { angle =&amp;gt; 0 }&lt;br /&gt;         at(2s) { angle =&amp;gt; 360 }&lt;br /&gt;     ]&lt;br /&gt; };&lt;br /&gt;&lt;br /&gt; // variacion del tamaño del font (de 12 a MAX_SIZE en 1 segundos)&lt;br /&gt; var fontsize = &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Timeline &lt;/span&gt;{&lt;br /&gt;  repeatCount: Timeline.INDEFINITE&lt;br /&gt;     autoReverse: true&lt;br /&gt;     keyFrames: [&lt;br /&gt;         at(0s) { &lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;size &lt;/span&gt;=&amp;gt; 12 }&lt;br /&gt;         at(0.3s) { &lt;span style="color: rgb(51, 255, 51); font-weight: bold;"&gt;size &lt;/span&gt;=&amp;gt; max_size tween Interpolator.EASEBOTH}&lt;br /&gt;     ]&lt;br /&gt; };&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; // mensaje desplegado (compuesto por texto y rectangulo a su alrededor)&lt;br /&gt; override protected function create():Node {&lt;br /&gt;&lt;br /&gt;     // inicia los timelines de la instancia&lt;br /&gt;     rotatetimeline.play();&lt;br /&gt;     fontsize.play();&lt;br /&gt;&lt;br /&gt;     Group {&lt;br /&gt;         content: [&lt;br /&gt;             // rectangulo&lt;br /&gt;             &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Rectangle &lt;/span&gt;{&lt;br /&gt;                 &lt;span style="color: rgb(51, 255, 255); font-weight: bold;"&gt;width: bind geomText.boundsInLocal.width&lt;/span&gt;&lt;br /&gt;                 &lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;height: bind geomText.boundsInLocal.height&lt;/span&gt;&lt;br /&gt;                 stroke: bind stroke&lt;br /&gt;                 fill: bind fill&lt;br /&gt;             },&lt;br /&gt;             // mensaje&lt;br /&gt;             geomText&lt;br /&gt;         ]&lt;br /&gt;         // rotacion del conjunto (rect+mensaje)&lt;br /&gt;         rotate:bind angle&lt;br /&gt;     }&lt;br /&gt; };&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// primera instancia de mensaje&lt;br /&gt;var msg=&lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;myObject&lt;/span&gt;{&lt;br /&gt; translateX: 200&lt;br /&gt; translateY: 150&lt;br /&gt; message: "Primer mensaje"&lt;br /&gt;};&lt;br /&gt;// segunda instancia de mensaje&lt;br /&gt;var msg2=&lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;myObject&lt;/span&gt;{&lt;br /&gt; translateX: 300&lt;br /&gt; translateY: 250&lt;br /&gt; message: "Segundo mensaje"&lt;br /&gt; color: Color.RED&lt;br /&gt; stroke: Color.GREEN&lt;br /&gt; fill: Color.YELLOW&lt;br /&gt; max_size: 40.0&lt;br /&gt;};&lt;br /&gt;// tercera instancia de mensaje&lt;br /&gt;var msg3=&lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;myObject&lt;/span&gt;{&lt;br /&gt; translateX: 100&lt;br /&gt; translateY: 350&lt;br /&gt; message: "Tercer mensaje"&lt;br /&gt; color: Color.WHITE&lt;br /&gt; stroke: Color.BLUE&lt;br /&gt; fill: Color.BLUE&lt;br /&gt; max_size: 90.0&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// aplicacion&lt;br /&gt;Stage {&lt;br /&gt; title: "Application title"&lt;br /&gt; width: 800&lt;br /&gt; height: 600&lt;br /&gt; scene: Scene {&lt;br /&gt;     content: [&lt;br /&gt;         msg,&lt;br /&gt;         msg2,&lt;br /&gt;         msg3&lt;br /&gt;     ]&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-7279469869532387431?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/7279469869532387431/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=7279469869532387431' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/7279469869532387431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/7279469869532387431'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2009/01/textos-que-giran-y-cambian-de-tamao.html' title='JavaFX: Textos que giran y cambian de tamaño'/><author><name>Mauro</name><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-114930265400628746.post-5202543218914762053</id><published>2008-12-08T12:49:00.000-08:00</published><updated>2009-02-11T23:03:28.259-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drag and drop'/><category scheme='http://www.blogger.com/atom/ns#' term='arrastrable'/><category scheme='http://www.blogger.com/atom/ns#' term='on replace'/><category scheme='http://www.blogger.com/atom/ns#' term='arrastrar'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='objeto'/><category scheme='http://www.blogger.com/atom/ns#' term='draggable'/><title type='text'>JavaFX: Circulo arrastrable que cambia de color</title><content type='html'>&lt;div&gt;Este ejemplo dibuja un circulo de radio "rad=60", que cambia de color y que puede ser arrastrado con el mouse. Además, incluye una función que se "dispara" al cambiar el color del círculo (&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;color=0 on replace oldColor {}&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Gs1R0uJs1s0&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/Gs1R0uJs1s0&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;package javafxclasses;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;import javafx.stage.Stage;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;import javafx.scene.Scene;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;import javafx.scene.paint.Color;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;import javafx.scene.text.*;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;import javafx.scene.input.*;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;import javafx.scene.shape.Circle;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;import javafx.scene.transform.Transform;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;def rad=60.0;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;var x1=rad;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;var y1=rad;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;var dx:Number;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;var dy:Number;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;var colors = [Color.RED, Color.BLUE, Color.GREEN, Color.YELLOW];&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;var color=0 &lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;on replace&lt;/span&gt; oldColor {&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;    println("\nALERT! El color cambio!");&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;    println("Antiguo color: {oldColor}");&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;    println("Nuevo color: {color}");&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Stage {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;    title: "Application title"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;    width: 400&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;    height: 400&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;    scene: Scene {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;        content: [&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;            Circle {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;                centerX: bind x1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;                centerY: bind y1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;                radius: rad&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;                fill: &lt;span class="Apple-style-span" style="color: rgb(255, 255, 0);"&gt;bind colors[color]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;                &lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;onMousePressed:&lt;/span&gt; function(e) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;                    &lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;// obtiene distancia entre el centro del círculo&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-weight: bold;"&gt;                    // arrastrado y la posición del mouse al hacer click&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;                    dx = x1 - e.x;  &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;                    dy = y1 - e.y;   &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;                    if (&lt;span class="Apple-style-span" style="color: rgb(255, 255, 0);"&gt;++color&lt;/span&gt;==sizeof colors)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;                        color=0;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;                }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;                &lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;onMouseDragged :&lt;/span&gt; function(e) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;                    &lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;// calcula el centro del círculo aplicando la &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;                    // diferencia &lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;respecto al centro del círculo al &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;                    // comenzar a arrastrarlo&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;                    x1 = e.x + dx;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;                    y1 = e.y + dy;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;                }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;            }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;        ]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-5202543218914762053?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/5202543218914762053/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=5202543218914762053' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/5202543218914762053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/5202543218914762053'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2008/12/circulo-arrastrable-que-cambia-de-color.html' title='JavaFX: Circulo arrastrable que cambia de color'/><author><name>Mauro</name><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-114930265400628746.post-76002911842396142</id><published>2008-12-06T10:59:00.000-08:00</published><updated>2009-02-05T18:00:09.247-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='basico'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='animaciones'/><category scheme='http://www.blogger.com/atom/ns#' term='animacion'/><category scheme='http://www.blogger.com/atom/ns#' term='codigo'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='aprendiendo'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos'/><category scheme='http://www.blogger.com/atom/ns#' term='scrips'/><category scheme='http://www.blogger.com/atom/ns#' term='español'/><category scheme='http://www.blogger.com/atom/ns#' term='timeline'/><category scheme='http://www.blogger.com/atom/ns#' term='aprender'/><category scheme='http://www.blogger.com/atom/ns#' term='graficos'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>JavaFX: La rueda de la fortuna</title><content type='html'>Este ejemplo genera una "rueda" de colores de distinta intensidad y que gira... el ejemplo original viene incluido con Netbeans 6.5, yo sólo le agregué el giro. Pueden modificar la velocidad del giro cambiando el tiempo en el Timeline (0.5s, o medio segundo para una vuelta completa).&lt;br /&gt;&lt;br /&gt;Básicamente, lo único que agregué fue un &lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;rotate: bind angle;&lt;/span&gt; asociado a la rueda ya generada incluida en la escena (Scene) y una "linea de tiempo" (&lt;span style="color: rgb(51, 255, 255);"&gt;Timeline&lt;/span&gt;) que incrementa el ángulo entre 0º y 360º, en el tiempo especificado. Una vez que llega a 360º, comienza por el ángulo 0º. Así queda la impresión que la ruega gira indefinidamente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_esUBlqKjDzk/STrNSfNw6hI/AAAAAAAAAkY/UQxtSB5OYzM/s1600-h/wheel.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 213px; height: 229px;" src="http://2.bp.blogspot.com/_esUBlqKjDzk/STrNSfNw6hI/AAAAAAAAAkY/UQxtSB5OYzM/s400/wheel.png" alt="" id="BLOGGER_PHOTO_ID_5276755630918527506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;div&gt;package color;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;import javafx.scene.Group;&lt;/div&gt;&lt;div&gt;import javafx.scene.CustomNode;&lt;/div&gt;&lt;div&gt;import javafx.scene.Node;&lt;/div&gt;&lt;div&gt;import javafx.scene.paint.Color;&lt;/div&gt;&lt;div&gt;import javafx.scene.shape.Arc;&lt;/div&gt;&lt;div&gt;import javafx.scene.shape.ArcType;&lt;/div&gt;&lt;div&gt;import javafx.stage.Stage;&lt;/div&gt;&lt;div&gt;import javafx.scene.Scene;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;import javafx.animation.Timeline;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;import javafx.lang.FX;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;class ColorWheelNode extends CustomNode {&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;    var segments : Number = 12;&lt;/div&gt;&lt;div&gt;    var steps : Number = 6;&lt;/div&gt;&lt;div&gt;    var radius : Number = 95;&lt;/div&gt;&lt;div&gt;    var stripes : Arc[];&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;    override function create() : Node {&lt;/div&gt;&lt;div&gt;        return Group {&lt;/div&gt;&lt;div&gt;            content: bind stripes&lt;/div&gt;&lt;div&gt;};&lt;/div&gt;&lt;div&gt;    }&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;        init {&lt;/div&gt;&lt;div&gt;        // Set radius&lt;/div&gt;&lt;div&gt;        var r = radius;&lt;/div&gt;&lt;div&gt;        var rStep = radius / steps;&lt;/div&gt;&lt;div&gt;        var colors : Color[];&lt;/div&gt;&lt;div&gt;        for( i in [1..&lt;/div&gt;&lt;div&gt;        segments + 1] ) {&lt;/div&gt;&lt;div&gt;            insert Color.rgb( 255, 255, 0 ) into colors;&lt;/div&gt;&lt;div&gt;        }&lt;/div&gt;&lt;div&gt;        for( i in [0..&lt;/div&gt;&lt;div&gt;        steps - 1] ) {&lt;/div&gt;&lt;div&gt;            colors[1] = Color.rgb( 255 - ( 255 / steps * i ), 255 - ( 255 / steps * i ), 0 );&lt;/div&gt;&lt;div&gt;            colors[2] = Color.rgb( 255 - ( 255 / steps ) * i, ( 255 / 1.5 ) - (( 255 / 1.5 ) / steps ) * i, 0 );&lt;/div&gt;&lt;div&gt;            colors[3] = Color.rgb( 255 - ( 255 / steps ) * i, ( 255 / 2 ) - ( ( 255 / 2 ) / steps ) * i, 0 );&lt;/div&gt;&lt;div&gt;            colors[4] = Color.rgb( 255 - ( 255 / steps ) * i, ( 255 / 2.5 ) - (( 255 / 2.5 ) / steps ) * i, 0 );&lt;/div&gt;&lt;div&gt;            colors[5] = Color.rgb( 255 - ( 255 / steps ) * i, 0, 0 );&lt;/div&gt;&lt;div&gt;            colors[6] = Color.rgb( 255 - ( 255 / steps ) * i, 0, ( 255 / 2 ) - (( 255 / 2 ) / steps ) * i );&lt;/div&gt;&lt;div&gt;            colors[7] = Color.rgb( 255 - ( 255 / steps ) * i, 0, 255 - ( 255 / steps ) * i );&lt;/div&gt;&lt;div&gt;            colors[8] = Color.rgb(( 255 / 2 ) - (( 255 / 2 ) / steps ) * i, 0, 255 - ( 255 / steps ) * i );&lt;/div&gt;&lt;div&gt;            colors[9] = Color.rgb( 0, 0, 255 - ( 255 / steps ) * i );&lt;/div&gt;&lt;div&gt;            colors[10] = Color.rgb( 0, 255 - ( 255 / steps ) * i, ( 255 / 2.5 ) - (( 255 / 2.5 ) / steps ) * i );&lt;/div&gt;&lt;div&gt;            colors[11] = Color.rgb( 0 , 255 - ( 255 / steps ) * i, 0 );&lt;/div&gt;&lt;div&gt;            colors[12] = Color.rgb(( 255 / 2 ) - (( 255 / 2 ) / steps ) * i, 255 - ( 255 / steps ) * i, 0 );&lt;/div&gt;&lt;div&gt;            for( j in [1..segments] ) {&lt;/div&gt;&lt;div&gt;                var c = colors[&lt;/div&gt;&lt;div&gt;                j.intValue()];&lt;/div&gt;&lt;div&gt;                insert Arc {&lt;/div&gt;&lt;div&gt;                    centerX: 100,&lt;/div&gt;&lt;div&gt;                    centerY: 100&lt;/div&gt;&lt;div&gt;                    radiusX: r ,&lt;/div&gt;&lt;div&gt;                    radiusY: r&lt;/div&gt;&lt;div&gt;                    startAngle: 360 / segments * ( segments - j - 0.5)&lt;/div&gt;&lt;div&gt;                    length: 360 / segments&lt;/div&gt;&lt;div&gt;                    fill: c&lt;/div&gt;&lt;div&gt;                    type: ArcType.ROUND&lt;/div&gt;&lt;div&gt;                } into stripes;&lt;/div&gt;&lt;div&gt;            }&lt;/div&gt;&lt;div&gt;            r -= rStep;&lt;/div&gt;&lt;div&gt;        }&lt;/div&gt;&lt;div&gt;    }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;var angle:Integer;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;Timeline {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;    repeatCount: Timeline.INDEFINITE&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;    autoReverse: false&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;    keyFrames: [&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;at (0s) {angle =&gt; 0},&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;at (0.5s) {angle =&gt; 360},&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;    ]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;}.play();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Stage {&lt;/div&gt;&lt;div&gt;    scene: Scene {&lt;/div&gt;&lt;div&gt;        fill: Color.GRAY &lt;/div&gt;&lt;div&gt;        content: ColorWheelNode {&lt;/div&gt;&lt;div&gt;            &lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;rotate: bind angle;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        }&lt;/div&gt;&lt;div&gt;    }&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;    width: 216&lt;/div&gt;&lt;div&gt;    height: 232&lt;/div&gt;&lt;div&gt;    title: "Color Wheel"&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-76002911842396142?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/76002911842396142/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=76002911842396142' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/76002911842396142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/76002911842396142'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2008/12/la-rueda-de-la-fortunafx.html' title='JavaFX: La rueda de la fortuna'/><author><name>Mauro</name><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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_esUBlqKjDzk/STrNSfNw6hI/AAAAAAAAAkY/UQxtSB5OYzM/s72-c/wheel.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-114930265400628746.post-1294837748509541777</id><published>2008-12-06T00:36:00.000-08:00</published><updated>2009-02-11T23:04:26.822-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='cool'/><category scheme='http://www.blogger.com/atom/ns#' term='rebota'/><category scheme='http://www.blogger.com/atom/ns#' term='shadow'/><category scheme='http://www.blogger.com/atom/ns#' term='bouncing'/><category scheme='http://www.blogger.com/atom/ns#' term='source code'/><category scheme='http://www.blogger.com/atom/ns#' term='rebote'/><category scheme='http://www.blogger.com/atom/ns#' term='bola'/><category scheme='http://www.blogger.com/atom/ns#' term='sombra'/><category scheme='http://www.blogger.com/atom/ns#' term='example'/><category scheme='http://www.blogger.com/atom/ns#' term='pelota'/><category scheme='http://www.blogger.com/atom/ns#' term='rebotando'/><category scheme='http://www.blogger.com/atom/ns#' term='3d'/><category scheme='http://www.blogger.com/atom/ns#' term='bounce'/><category scheme='http://www.blogger.com/atom/ns#' term='español'/><category scheme='http://www.blogger.com/atom/ns#' term='ball'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>JavaFX: Pelota 3D con sombra rebotando sobre video</title><content type='html'>Ok, solo para que vayan descubriendo el poder de JavaFX. Ayer yo no sabía NADA de JavaFX script. Luego de jugar unas pocas horas, ya tengo este ejemplo: Una "habitación" que tiene en el piso un VIDEO y sobre el cual rebota una bola de apariencia 3D, que incluso se aleja del frente de la pantalla y que proyecta una sombra que varia tanto en intensidad como tamaño dependiendo de la altura a la que se encuentra la bola.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/nJhNROw2e48&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/nJhNROw2e48&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Por ahora sólo les dejo el código. Más adelante postearé otro artículo con la explicación del mismo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Atención:&lt;/span&gt; este ejemplo requiere el &lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;mediacomponent.jar&lt;/span&gt; entre los Libraries del proyecto. Si crean un proyecto demo basado en el SimpleMediaPlayer (incluido con Netbeans 6.5) y luego reemplanzan el código de Main.fx, la biblioteca mediacomponent.jar quedará incluida en el proyecto automáticamente. Si no, tienen que buscar donde se encuentra en su disco la biblioteca e incluirla entre los libraries del proyecto haciendo click con el botón derecho del mouse en Libraries (a la izquierda en Netbeans) y seleccionado Add Library... (ahí tienen que decirle donde está el archivo). Pero como les digo, lo más fácil es comenzar con un proyecto de ejemplo de mediaplayer y reemplazar el código de Main.fx por el código que incluyo a continuación:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;package simplevideoplayer;&lt;br /&gt;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;import javafx.scene.Scene;&lt;br /&gt;import com.sun.fxmediacomponent.*;&lt;br /&gt;import javafx.scene.Group;&lt;br /&gt;import javafx.scene.shape.Circle;&lt;br /&gt;import javafx.scene.paint.Color;&lt;br /&gt;import javafx.animation.Interpolator;&lt;br /&gt;import javafx.animation.Timeline;&lt;br /&gt;import javafx.scene.paint.Stop;&lt;br /&gt;import javafx.scene.effect.PerspectiveTransform;&lt;br /&gt;import javafx.scene.shape.Ellipse;&lt;br /&gt;import javafx.scene.paint.*;&lt;br /&gt;import javafx.scene.effect.*;&lt;br /&gt;import javafx.scene.transform.*;&lt;br /&gt;import javafx.scene.shape.Line;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;var mediaUrl:String = "http://sun.edgeboss.net/download/sun/media/1460825906/1460825906_2956241001_big-buck-bunny-640x360.flv";&lt;/span&gt;&lt;br /&gt;if(FX.getArgument("mediaURL")!=null) {&lt;br /&gt;  mediaUrl = FX.getArgument("mediaURL").toString();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;def vidWidth = 1024;&lt;br /&gt;def vidHeight = 576;&lt;br /&gt;&lt;br /&gt;var X=0;&lt;br /&gt;var Y=1;&lt;br /&gt;var Z=0;&lt;br /&gt;var VX=230; // perspectiva horizontal para video&lt;br /&gt;var VY=376; // perspectiva vertical para video&lt;br /&gt;var S:Number;&lt;br /&gt;&lt;br /&gt;Timeline {&lt;br /&gt;repeatCount: Timeline.INDEFINITE&lt;br /&gt;autoReverse: true&lt;br /&gt;keyFrames: [&lt;br /&gt;  at (0s) {X =&amp;gt; 100},&lt;br /&gt;  at (2.3s) {X =&amp;gt; 924 tween Interpolator.LINEAR},&lt;br /&gt;]&lt;br /&gt;}.play();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Timeline {&lt;br /&gt;repeatCount: Timeline.INDEFINITE&lt;br /&gt;autoReverse: true&lt;br /&gt;keyFrames: [&lt;br /&gt;  at (0s) {Y =&amp;gt; 100},&lt;br /&gt;  at (0.5s) {Y =&amp;gt; 476 tween Interpolator.EASEIN},&lt;br /&gt;]&lt;br /&gt;}.play();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Timeline {&lt;br /&gt;repeatCount: Timeline.INDEFINITE&lt;br /&gt;autoReverse: true&lt;br /&gt;keyFrames: [&lt;br /&gt;  at (0s) {Z =&amp;gt; 40},&lt;br /&gt;  at (10s) {Z =&amp;gt; 100 tween Interpolator.LINEAR},&lt;br /&gt;]&lt;br /&gt;}.play();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Timeline {&lt;br /&gt;repeatCount: Timeline.INDEFINITE&lt;br /&gt;autoReverse: true&lt;br /&gt;keyFrames: [&lt;br /&gt;  at (0s) {S =&amp;gt; 0.5},&lt;br /&gt;  at (0.5s) {S =&amp;gt; 1 tween Interpolator.EASEIN},&lt;br /&gt;]&lt;br /&gt;}.play();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var mediaBox:MediaComponent = MediaComponent {&lt;br /&gt;  // set the media and make the component visible&lt;br /&gt;  mediaSourceURL : mediaUrl&lt;br /&gt;  visible:true&lt;br /&gt;  // the position and size of the media on screen&lt;br /&gt;  translateX: 0&lt;br /&gt;  translateY: 0&lt;br /&gt;  mediaViewWidth : vidWidth&lt;br /&gt;  mediaViewHeight: vidHeight&lt;br /&gt;  // determines if the control bar is below the media or on top with a fade in&lt;br /&gt;  staticControlBar: false&lt;br /&gt;  // make the movie play as soon as it's loaded&lt;br /&gt;  mediaPlayerAutoPlay: true&lt;br /&gt;  // set the volume&lt;br /&gt;  volume: 1.0&lt;br /&gt;&lt;br /&gt;  effect: PerspectiveTransform {&lt;br /&gt;      ulx: bind VX        uly: bind VY&lt;br /&gt;      urx: bind 1024-VX   ury: bind VY&lt;br /&gt;      lrx: 1024           lry: 576&lt;br /&gt;      llx: 0              lly: 576&lt;br /&gt;  }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Currently these variables have to be set after the component is created&lt;br /&gt;&lt;br /&gt;// Description to be displayed when the mouse is over the component&lt;br /&gt;mediaBox.mediaDescriptionStr = "A well-tempered rabbit finds his day spoiled by the rude actions of the...";&lt;br /&gt;// Duration to be displayed when the mouse is over the component&lt;br /&gt;mediaBox.mediaDurationStr = "9:56";&lt;br /&gt;// Title to be displayed when the mouse is over the component&lt;br /&gt;mediaBox.mediaTitleStr = "Big Buck Bunny";&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Stage {&lt;br /&gt;&lt;br /&gt; title: "Simple Media Player"&lt;br /&gt;&lt;br /&gt; scene: Scene{&lt;br /&gt;&lt;br /&gt;     width: vidWidth&lt;br /&gt;     height: vidHeight&lt;br /&gt;&lt;br /&gt;     stylesheets: [&lt;br /&gt;        MediaComponent.css_skins&lt;br /&gt;     ]&lt;br /&gt;&lt;br /&gt;     content: [&lt;br /&gt;&lt;br /&gt;         mediaBox,&lt;br /&gt;&lt;br /&gt;         Line {&lt;br /&gt;              strokeWidth: 3.0&lt;br /&gt;              stroke: Color.BLACK&lt;br /&gt;              startX: bind VX&lt;br /&gt;              startY: bind VY&lt;br /&gt;              endX:   0&lt;br /&gt;              endY:   576&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        Line {&lt;br /&gt;              strokeWidth: 3.0&lt;br /&gt;              stroke: Color.BLACK&lt;br /&gt;              startX: bind VX&lt;br /&gt;              startY: bind VY&lt;br /&gt;              endX:   bind VX&lt;br /&gt;              endY:   0&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        Line {&lt;br /&gt;              strokeWidth: 3.0&lt;br /&gt;              stroke: Color.BLACK&lt;br /&gt;              startX: bind VX&lt;br /&gt;              startY: bind VY&lt;br /&gt;              endX:   bind 1024-VX&lt;br /&gt;              endY:   bind VY&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        Line {&lt;br /&gt;              strokeWidth: 3.0&lt;br /&gt;              stroke: Color.BLACK&lt;br /&gt;              startX: bind 1024-VX&lt;br /&gt;              startY: bind VY&lt;br /&gt;              endX:   bind 1024-VX&lt;br /&gt;              endY:   0&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        Line {&lt;br /&gt;              strokeWidth: 3.0&lt;br /&gt;              stroke: Color.BLACK&lt;br /&gt;              startX: bind 1024-VX&lt;br /&gt;              startY: bind VY&lt;br /&gt;              endX:   1024&lt;br /&gt;              endY:   576&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;         Ellipse {&lt;br /&gt;             centerX: 0, centerY: 0 radiusX: 100 radiusY: 30&lt;br /&gt;             fill: Color.BLACK&lt;br /&gt;             opacity: bind S - 0.2&lt;br /&gt;             fill: RadialGradient {&lt;br /&gt;                 proportional: false  radius: 100&lt;br /&gt;                 centerX: 0  centerY: 0&lt;br /&gt;                 focusX: 0  focusY: 0&lt;br /&gt;                 stops: [&lt;br /&gt;                     Stop { offset: 0.0  color: Color.web("#333333", 1.0) },&lt;br /&gt;                     Stop { offset: 0.4  color: Color.web("#444444", 1.0) },&lt;br /&gt;                     Stop { offset: 1.0 color: Color.web("#FFFFFF", 0.0) }&lt;br /&gt;                 ]&lt;br /&gt;             }&lt;br /&gt;             transforms: bind [&lt;br /&gt;                 Transform.translate(X , 476 + Z - 100 + Z / 2)&lt;br /&gt;                 Transform.scale(S * Z / 100.0, S * Z / 100.0)&lt;br /&gt;             ]&lt;br /&gt;         }&lt;br /&gt;&lt;br /&gt;         Circle {&lt;br /&gt;             centerX: 0  centerY: 0  radius: 100&lt;br /&gt;             stroke: Color.BLACK&lt;br /&gt;             fill: RadialGradient {&lt;br /&gt;                 proportional: false  radius: 100&lt;br /&gt;                 centerX: 0  centerY: 0&lt;br /&gt;                 focusX: 20  focusY: -50&lt;br /&gt;                 stops: [&lt;br /&gt;                     Stop { offset: 0.0  color: Color.WHITE },&lt;br /&gt;                     Stop { offset: 0.85 color: Color.RED },&lt;br /&gt;                     Stop { offset: 1.0  color: Color.BLACK }&lt;br /&gt;                 ]&lt;br /&gt;             }&lt;br /&gt;             transforms: bind [&lt;br /&gt;                 Transform.translate(X , Y + Z - 100)&lt;br /&gt;                 Transform.scale(Z/100.0, Z/100.0)&lt;br /&gt;             ]&lt;br /&gt;&lt;br /&gt;         }&lt;br /&gt;&lt;br /&gt;    ]&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-1294837748509541777?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/1294837748509541777/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=1294837748509541777' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/1294837748509541777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/1294837748509541777'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2008/12/pelota-3d-con-sombra-rebotando-sobre.html' title='JavaFX: Pelota 3D con sombra rebotando sobre video'/><author><name>Mauro</name><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-114930265400628746.post-508226624285694948</id><published>2008-12-05T21:31:00.000-08:00</published><updated>2009-09-11T13:01:27.077-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='basico'/><category scheme='http://www.blogger.com/atom/ns#' term='circulo'/><category scheme='http://www.blogger.com/atom/ns#' term='español'/><category scheme='http://www.blogger.com/atom/ns#' term='color'/><category scheme='http://www.blogger.com/atom/ns#' term='secuencias'/><category scheme='http://www.blogger.com/atom/ns#' term='listas'/><category scheme='http://www.blogger.com/atom/ns#' term='bind'/><category scheme='http://www.blogger.com/atom/ns#' term='colores'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='variables'/><category scheme='http://www.blogger.com/atom/ns#' term='arreglos'/><title type='text'>Mi primer post sobre JavaFX... se va la bolita</title><content type='html'>&lt;div&gt;La verdad es que no tengo mucha idea sobre JavaFX, mi primer contacto con este nuevo lenguaje de programación fue ayer, así que podrán imaginar cuanto sé del tema.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mi intención es sólo compartir lo que vaya descubriendo, de manera de facilitarle la vida a otros que vengan después de mi ;D&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;De lo que ví, creo que hay cosas que me han gustado bastante. Para comenzar, me sorprendió un par de cosas:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) El poco código que se requiere para hacer "algo" que haga algo ;D ... si saben programar en Java o C# sabrán cuanto código se necesita sólo para escribir el típico "Hola Mundo!!". Con JavaFX es tan corto como:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;println("Hola Mundo");&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;¿Van captando los beneficios? ;D&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2) Descubrí la instrucción BIND, algo que por lo menos no tiene ningún otro lenguaje de programación que conozca.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;¿Qué hace esta instrucción?&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En palabras simples, permite "amarrar" los cambios de estados (por ejemplo) de las variables y disparar "eventos" a través del código, sin hacer nada. Aquí les va un ejemplo muy básico:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/-8i9-FkRKdk&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/-8i9-FkRKdk&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;package myfirstjavafx;&lt;br /&gt;&lt;br /&gt;import javafx.stage.Stage;&lt;br /&gt;import javafx.scene.Scene;&lt;br /&gt;import javafx.ext.swing.SwingButton;&lt;br /&gt;import javafx.scene.shape.Circle;&lt;br /&gt;import javafx.scene.paint.Color;&lt;br /&gt;&lt;br /&gt;var &lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;count=0&lt;/span&gt;;&lt;br /&gt;var &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;colors &lt;/span&gt;= [Color.RED, Color.BLUE, Color.YELLOW];&lt;br /&gt;var &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;newcolors &lt;/span&gt;= [Color.PURPLE, Color.GREEN, Color.CYAN];&lt;br /&gt;&lt;br /&gt;Stage {&lt;br /&gt;title: "Application title"&lt;br /&gt;width:250&lt;br /&gt;height:250&lt;br /&gt;&lt;br /&gt;scene: Scene {&lt;br /&gt;   content: [&lt;br /&gt;&lt;br /&gt;       Circle {&lt;br /&gt;           centerX: 100&lt;br /&gt;           centerY: 100&lt;br /&gt;           radius: 100&lt;br /&gt;           &lt;span style="font-weight: bold; color: rgb(255, 255, 51);"&gt;fill: bind colors[&lt;span style="color: rgb(51, 255, 51);"&gt;count&lt;/span&gt;];&lt;/span&gt;&lt;br /&gt;       },&lt;br /&gt;&lt;br /&gt;       SwingButton {&lt;br /&gt;           text: "&lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;Rota colores&lt;/span&gt;"&lt;br /&gt;           rotate:20&lt;br /&gt;           translateX:100&lt;br /&gt;           translateY:100&lt;br /&gt;&lt;br /&gt;           action: function() {&lt;br /&gt;               if (&lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;++count&lt;/span&gt; == sizeof colors)&lt;br /&gt;                   &lt;span style="font-weight: bold; color: rgb(51, 255, 51);"&gt;count=0&lt;/span&gt;;&lt;br /&gt;           }&lt;br /&gt;       },&lt;br /&gt;&lt;br /&gt;       SwingButton {&lt;br /&gt;           text: "&lt;span style="color: rgb(51, 255, 255); font-weight: bold;"&gt;Agrega nuevo color&lt;/span&gt;"&lt;br /&gt;           rotate:20&lt;br /&gt;           translateX:100&lt;br /&gt;           translateY:130&lt;br /&gt;&lt;br /&gt;           action: function() {&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;                  if (sizeof newcolors &amp;gt; 0) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;                      var col=newcolors[0];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;                      delete newcolors[0];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;                      insert col into colors;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;                      println("Adding {col} to the current list")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;                  }&lt;/span&gt;&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;   ]&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;De este ejemplo se pueden aprender un par de cosas: ¿Qué hace?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Esta "aplicación" tiene tres elementos visibles. Un &lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;CIRCULO &lt;/span&gt;y dos &lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;BOTONES&lt;/span&gt;. Cuenta además con dos listas de colores (arreglos o &lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;SECUENCIAS&lt;/span&gt;). Al oprimir el primer botón, rota los colores aplicados al círculo, contenidos en la primera secuencia (&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;COLORS&lt;/span&gt;). Cuando llega al último color disponible, regresa al primero. Si se oprime el segundo botón, "trasvasija" el primer color de la secuencia NEWCOLORS a la lista de colores aplicados al circulo (COLORS). Hace eso mientras haya nuevos colores disponibles en la secuencia (&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;NEWCOLORS&lt;/span&gt;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) Al definir el escenario (&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;Stage&lt;/span&gt;), se está creando una ventana o area de ejecución de la aplicación. Con Width y Height se declara el tamaño de esa ventana o espacio de ejecución (en caso que sea un applet, supongo)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2) La escena (&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;Scene&lt;/span&gt;) viene siendo el interior de la ventana que alberga los contenidos (&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;content&lt;/span&gt;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3) &lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 255, 0);"&gt;Define el círculo con su tamaño y radio, y aquí viene algo interesante. DEFINE con BIND que... el color usado para rellenar el círculo, es el color en la secuencia COLORS al que apunta COUNT. Lo interesante es que luego basta que en alguna parte del programa cambies el valor de COUNT para que actualice el círculo con el nuevo color. No es necesario hacer nada adicional.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4) Define el primer botón (el rotate sólo GIRA el botón en 20º, lo hice únicamente para probar que las interfaces pueden ser mas "divertidas" y de manera muy sencilla), y le asigna una ACCION al botón (&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;action&lt;/span&gt;), que se ejecutará al ser oprimido.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;¿Qúe hace este botón? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Simplemente incrementa COUNT hasta alcanzar el número máximo de colores disponibles en la lista COLORS. Al hacerlo, el color del círculo cambia (si te fijas, al incrementar COUNT no ejecuta ninguna rutina adicional o método, basta con cambiar el puntero y este actualiza el color del círculo [&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;obteniendo el nuevo color al que apunta COUNT en la lista COLORS&lt;/span&gt;]).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Una vez que llega al último color de la lista, regresa al primer color (&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;COUNT=0&lt;/span&gt;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5) Define el segundo botón y le asigna la siguiente acción: primero, verifica si hay nuevos colores disponibles en la segunda lista (secuencia NEWCOLORS), con un simple "&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;sizeof newcolors&gt; 0&lt;/span&gt;", es decir, valida si hay un color disponible en la lista newcolors antes de proseguir.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A continuación, obtiene el primer color disponible en la lista newcolors (&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;var col=newcolors[0];&lt;/span&gt;) y lo borra de la lista (&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;delete newcolors[0];&lt;/span&gt;). Acto seguido, agrega el color obtenido de newcolors y lo agrega al final de la lista COLORS (&lt;span class="Apple-style-span" style="color: rgb(51, 255, 255);"&gt;insert col into colors;&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Listo. Funciona.... sólo tienes que oprimir el botón PLAY (&gt;) en la barra de Netbeans.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;PD: Si da algún error, anda al nombre del proyecto en la columna izquierda (arriba) y haz click con el botón derecho del mouse y selecciona SET AS MAIN PROJECT (en caso que tengas otro proyecto abierto).&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/114930265400628746-508226624285694948?l=aprendiendo-javafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-javafx.blogspot.com/feeds/508226624285694948/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=114930265400628746&amp;postID=508226624285694948' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/508226624285694948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/114930265400628746/posts/default/508226624285694948'/><link rel='alternate' type='text/html' href='http://aprendiendo-javafx.blogspot.com/2008/12/mi-primer-post-sobre-javafx-se-va-la.html' title='Mi primer post sobre JavaFX... se va la bolita'/><author><name>Mauro</name><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></feed>
