¿Quieres registrarte?

Cómo personalizar los iconos en componentes Tree de Flex

Por: Zguillez
20 de Julio del 2008
7273 de clabLevel
Otros artículos de Zguillez
5,480 visitas

En este tip mostraré como podemos personalizar los iconos de las carpetas y de los objetos que se visualizan en un componente Tree en Flex.

Para empezar veremos que automáticamente Flex coloca unos iconos por defecto al visualizar un componente Tree. Un icono de carpete abierta o cerrada segun sea el caso, y una hoja de papel en blanco para los objetos:



Ahora veremos cómo podemos utilizar nuestros propios iconos.

Para este ejemplo he utilizado el siguiente dataProvider de base, que consta de un XMLList que coloca a los diferentes Claber en nodos según su grupo.

Código :

<mx:XMLList id="listado">
   <group name="admin">
      <claber name="Freddie" level="43458"/>
   </group>
   <group name="Bofh">
      <claber name="_Conejo" level="7203"/>
      <claber name="Zguillez" level="4120"/>
      <claber name="Mariux" level="2921"/>
   </group>
   <group name="swat">
      <claber name="Eldervaz" level="3123"/>
      <claber name="Zah" level="2906"/>
   </group>
   <group name="pda">
      <claber name="XKlibur" level="4713"/>
   </group>
   <group name="claber">
      <claber name="Elecash" level="7289"/>
      <claber name="Bleend" level="2016"/>
      <claber name="Carmen Vivas" level="610"/>
   </group>
</mx:XMLList>


Este XMLList añadido a un componente Tree daría el resultado estándar.

Código :

<mx:Tree id="listadoClabers"
   horizontalCenter="0" verticalCenter="0" 
   width="200" height="200" 
   dataProvider="{listado}"
   labelField="@name">
</mx:Tree>


Para poder asignarle unos nuevos iconos al componente lo primero que hay que hacer es incorporar a la aplicación los archivos bitmap de los iconos e incluirlos como Clases. Para ello crearemos las variables dentro del tag <mx:script>, embederemos los bitmaps y haremos las variables Blindables.

Código :

<mx:Script>
   <![CDATA[
      [Bindable]
      [Embed(source="img/ico1.png")]
      private var ico1:Class;      
      
      [Bindable]
      [Embed(source="img/ico2.png")]
      private var ico2:Class;
      
      [Bindable]
      [Embed(source="img/ico3.png")]
      private var ico3:Class;
   ]]>
</mx:Script>


Ahora asignaremos estas clases que contienen los bitmaps a los iconos personalizados del componente. Para ello utilizaremos las propiedades del componente folderClosedIcon, folderOpenIcon, defaultLeafIcon para los diferentes casos.

Código :

<mx:Tree id="listadoClabers"
   horizontalCenter="0" verticalCenter="0" 
   width="200" height="200" 
   dataProvider="{listado}"
   labelField="@name"
   folderClosedIcon="{ico1}"
   folderOpenIcon="{ico2}"
   defaultLeafIcon="{ico3}">
</mx:Tree>


Solo con esto al publicar la aplicación ya hemos personalizado los iconos:



Ahora vamos a ver un caso algo más complejo, imaginemos que necesitamos un icono diferente para diferentes grupos de objetos, por ejemplo un icono para los clabers hombre y otro para las clabers mujeres. para realizar esto ya deberemos echar mano de actionscript.

lo primero será asignar una función que controlará los iconos el componente. Si realizamos esta acción podemos eliminar las propiedades de iconos personalizados ya que esos valores se sobreescribirán con los de la función actionscript. En este caso crearemos una función llamada setGeneroIcon.

Código :

<mx:Tree id="listadoClabers"
   horizontalCenter="0" verticalCenter="0" 
   width="200" height="200" 
   dataProvider="{listado}"
   labelField="@name"
   iconFunction="setGeneroIcon">
</mx:Tree>


Ahora bien, para conseguir el mismo efecto de iconos de carpeta abierta y cerrada, y el nuevo icono diferenciado segun el genero del claber, deberemos modificar un poco el XMLList, añadiéndole unos parámetros a los nodos. Añadiremos un parametro que nos indique que el nodo en cuestión es una carpeta (folder="true"), y añadiremos un parámetro a los nodos de los clabers que nos indique su genero (genero="M" o genero="F").

Código :

<mx:XMLList id="listado">
   <group name="admin" folder="true">
      <claber name="Freddie" level="43458" genero="M"/>
   </group>
   <group name="Both" folder="true">
      <claber name="_Conejo" level="7203" genero="M"/>
      <claber name="Zguillez" level="4120" genero="M"/>
      <claber name="Mariux" level="2921" genero="F"/>
   </group>
   <group name="swat" folder="true">
      <claber name="Eldervaz" level="3123" genero="M"/>
      <claber name="Zah" level="2906" genero="M"/>
   </group>
   <group name="pda" folder="true">
      <claber name="XKlibur" level="4713" genero="F"/>
   </group>
   <group name="claber" folder="true">
      <claber name="Elecash" level="7289" genero="M"/>
      <claber name="Bleend" level="2016" genero="M"/>
      <claber name="Carmen Vivas" level="610" genero="F"/>
   </group>
</mx:XMLList>


Ahora toca crear la función que asigne los iconos según corresponda.

Empezaremos por los iconos de carpeta abierta o cerrada. Para ello realizaremos una comprobación según si el nodo corresponde a una carpeta, y en tal caso realizaremos una segunda comprobación según si la carpeta está abierta o cerrada (isItemOpen).

Código :

private function setGeneroIcon(i:Object):Class
{
   var isFolder:String = String(i.@folder);            
   if (isFolder == "true")
   {
      if (listadoClabers.isItemOpen(i))
      {
         return ico2;
      }
      else
      {
         return ico1;
      }
   }



En caso de no tratarse de una carpeta realizaremos la comprobación de la propiedad genero de los nodos y según sea uno u otro colocaremos el icono que le corresponda.

Código :

   else
   {
      var genero:String = String(i.@genero);
      if (genero == "M")
      {
         return ico3;
      }
      else if (genero == "F")
      {
         return ico4;
      }
      else
      {
         return null;
      }
   }
}
]]>
</mx:Script>


NOTA: el icono ico4 es un icono nuevo para los clabers mujeres que deberemos haber creado de la misma manera que los vistos anteriormente.

Este es el resultado:



Este es el código completo y el swf funcional:

Código :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

   <mx:Script>
      <![CDATA[
         [Bindable]
         [Embed(source="img/ico1.png")]
         private var ico1:Class;         
         
         [Bindable]
         [Embed(source="img/ico2.png")]
         private var ico2:Class;
         
         [Bindable]
         [Embed(source="img/ico3.png")]
         private var ico3:Class;

         [Bindable]
         [Embed(source="img/ico4.png")]
         private var ico4:Class;
         
         private function setGeneroIcon(i:Object):Class
         {
            var isFolder:String = String(i.@folder);            
            if (isFolder == "true")
            {
               if (listadoClabers.isItemOpen(i))
               {
                  return ico2;
               }
               else
               {
                  return ico1;
               }
            }
            else
            {
               var genero:String = String(i.@genero);
               if (genero == "M")
               {
                  return ico3;
               }
               else if (genero == "F")
               {
                  return ico4;
               }
               else
               {
                  return null;
               }
            }
         }
      ]]>
   </mx:Script>
   
   <mx:XMLList id="listado">
      <group name="admin" folder="true">
         <claber name="Freddie" level="43458" genero="M"/>
      </group>
      <group name="Both" folder="true">
         <claber name="_Conejo" level="7203" genero="M"/>
         <claber name="Zguillez" level="4120" genero="M"/>
         <claber name="Mariux" level="2921" genero="F"/>
      </group>
      <group name="swat" folder="true">
         <claber name="Eldervaz" level="3123" genero="M"/>
         <claber name="Zah" level="2906" genero="M"/>
      </group>
      <group name="pda" folder="true">
         <claber name="XKlibur" level="4713" genero="F"/>
      </group>
      <group name="claber" folder="true">
         <claber name="Elecash" level="7289" genero="M"/>
         <claber name="Bleend" level="2016" genero="M"/>
         <claber name="Carmen Vivas" level="610" genero="F"/>
      </group>
   </mx:XMLList>
   
   <mx:Tree id="listadoClabers"
      horizontalCenter="0" verticalCenter="0" 
      width="200" height="200" 
      dataProvider="{listado}"
      labelField="@name"
      folderClosedIcon="{ico1}"
      folderOpenIcon="{ico2}"
      defaultLeafIcon="{ico3}"
      iconFunction="setGeneroIcon">
   </mx:Tree>
   
</mx:Application>



Enviar a twitter Enviar a facebook


También te interesa


Etiquetas flex

Comentarios | Enviar un comentario
maestro Z, sin duda U_U buen tip
Por: eldervaz
Excelente Tip y muy útil... :o
Por: Blackdragon
que bien me parecia un poco mas complicado no se porque pasarme del a.s. a mxml pero en realidad parece ser mas sencillo incluso...¿¿que ventajas y que desventajas o la diferencia entre hacer aplicaciones en flash o en flex consideran q hay?????
Por: hellrider-blog
Oh! Está maravillosamente bien explicado y muy bien los ejemplos. Gracias!
Por: Carmen
amigo hellrider-blog, no soy un experto ni mucho menos en mxml, en ActionScript todavia me defiendo un poquillo mas, ;) pero a lo que he entendido en base a mi propia experimentacion, no es que tengas que pasarte de ActionScript a MXML, sino que, tienes que implementar "ambos", para que vayan tomados de la mano y asi realizar las funciones o procedimientos necesarios, la misma documentacion te lo dice, en flex se utilizan dos lenguajes, MXML para elementos visuales, asi como otro tanto para funciones de servidor y esas cosas de transferencia como los protocolos HTTP, y todo eso, y ActionScript para la logica de programacion, es decir, para darle funcionalidad a los elementos que agregaste con el lenguaje MXML.
Ahora, diferencia entre aplicaciones flash y flex, la unica diferencia que he notado es que flex ya tiene muchas librerias enteramente compiladas, pero no te confundas, flex de hecho, son peliculas hechas con el mismo lenguaje que produce flash, solo que los de adobe se hicieron a la tarea de realizar, pues, digamos la mayor parte del trabajo que tendrias que se tendria que hacer en flash para asi lograr que los programadores se propongan nuevos retos, es decir, RIAS mas impresionantes que les roben el sueño de poder llegar a ser algun dia grandes desarrolladores web a novatos como yo :(
Espero poder haber ayudado en tus dudas, y si me equivoco (que es muy posible) alguien me saque de mi error, y no dejar las cosas en ese estado.
Hasta luego.
Y Gracias ZGuilles, es un excelente tip, me ha gustado mucho, pero... ¿Hay un limite de tamaño para los iconos? ¿Que formato deben de ser? ¿Alguna otra aclaracion que al momento de crear nuestros iconos nos sea valiosa?
Por: Señor Oz-blog
Como hago para cargar el arbol con todos sus nodos extendidos ?
Por: Daniel-blog
Muy buen tip gracias
Por: Ditmar-blog
Nada que ver respecto al tema, pero ... ¿habían notado que en los ejemplos y en el tip en general dice both y no bofh?
Por: M@U

M@U :

Nada que ver respecto al tema, pero ... ¿habían notado que en los ejemplos y en el tip en general dice both y no bofh?
Eso es un efecto óptico debido a la tipografía utilizada, que hace que las F parezcan T... U_U

*sale corriendo
Por: Zguillez

Zguillez :

M@U :

Nada que ver respecto al tema, pero ... ¿habían notado que en los ejemplos y en el tip en general dice both y no bofh?
Eso es un efecto óptico debido a la tipografía utilizada, que hace que las F parezcan T
Que tonto he sido, todo se arreglo acercandome un poco mucho más al monitor, buen efecto...
:wtf:
Por: M@U
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.