Apache Adobe Flex TutorialTutoriaux Adobe Flex & AIR en Français

26mar/091

Flex Tips – Afficher un texte par défaut dans une ComboBox sans l'ajouter au dataProvider

Quand vous remplissez une ComboBox Flex, le premier élément est affiché par défaut. Par exemple, admettons que vous ayez une liste d'états américains, l'Alabama (premier sur la liste il me semble) sera affiché et sélectionné par défaut. Un choix est donc imposé à l'utilisateur. Mais il est souvent plus commun, dans les formulaires surtout, d'afficher un message "User Friendly" comme "Choisissez votre état de résidence". Pour cela, il y a une méthode simple, ajouter un item ayant pour label "Choisissez votre état de résidence" dans le dataProvider de votre ComboBox en position 0. C'est donc la valeur qui sera affichée en premier.

Cette solution pose pas mal de problèmes ensuite. Tout d'abord, pour tester le choix de l'utilisateur, on doit regarder si le selectedIndex est > 0, ce qui est un peu génant car on a plutôt l'habitude de dire selectedItem != -1.  La comparaision à -1 est utilisée pour les recherches dans les Array et ArrayCollection par exemple, notre code perd donc de sa cohérence. Ensuite, cela se complique encore si vous appliquez un Sort (tri) sur votre ArrayCollection, par exemple un tri alphabétique.  La valeur "Choisissez votre état de résidence" va se faufiler dans les éléments de votre tableau et vous devrez la remettre en position 0.

Le composant Flex possède une propriété "prompt" permettant d'indiquer un message tant que l'utilisateur n'a pas fait de sélection. Cet élément ne fait pas partie du dataProvider de la <mx:ComboBox>, vous pourrez donc faire vos tests tranquillement.

Une fois que vous avez fait une sélection, vous ne pourrez donc plus sélectionner cet élément. Si vous voulez vraiment revenir sur cet élément de non-sélection, il faut fixer la propriété selectedIndex à -1 (logique).

Voici un exemple de son utilisation:

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

    <mx:Array id="arr">
        <mx:Object abbrev="AL" name="Alabama" />
        <mx:Object abbrev="AK" name="Alaska" />
        <mx:Object abbrev="AZ" name="Arizona" />
        <mx:Object abbrev="AR" name="Arkansas" />
        <mx:Object abbrev="CA" name="California" />
        <mx:Object abbrev="CO" name="Colorado" />
        <mx:Object abbrev="CT" name="Connecticut" />
    </mx:Array>

    <mx:ApplicationControlBar dock="true">
        <mx:Button id="button"
                label="Reset ComboBox"
                click="comboBox.selectedIndex = -1;" />
    </mx:ApplicationControlBar>

    <mx:ComboBox id="comboBox"
            dataProvider="{arr}"
            labelField="name"
            prompt="Choisissez votre état de résidence.." />

</mx:Application>

Flex Source Code Download: Télécharger le code source complet de l'application

This movie requires Flash Player 11

26mar/092

Flex Tips – Valider automatiquement un Formulaire Flex (mx:Form) avec la touche Entrée

Voici le premier tutorial/article sur les Flex Tips, ces petits trucs que vous ne connaissez pas forcement et qui peuvent grandement vous faciliter la vie. Le framework Flex est très riche en fonctionnalités (on ne va pas s'en plaindre) et il est difficile de tout connaître. Ces Flex Tips sont des petits trucs que j'ai découvert au fur et à mesure de mon apprentissage de Flex, et je suis sûr qu'ils vous sauveront souvent pas mal de temps et de lignes de code.

Le premier porte sur la validation des formulaires Flex. La plupart du temps, quand vous avez un formulaire Flex,  vous avez un certain nombre de champs, des combobox etc. Et la plupart du temps, quelques boutons (Valider, Annuler, Reset, ...). Quand un utilisateur complète un formulaire HTML (login par exemple), il a l'habitude de valider en faisant Entrée car le HTML permet de faire cette validation de <form> de manière automatique. Avec Flex en revanche, pas de comportement par défaut. Si vous voulez répondre aux évènements clavier, vous devrez le coder vous-même. Cela permet bien sûr plus de fonctionnalités et de personnalisation car vous pouvez valider votre formulaire de manière quelconque.

Si vous voulez valider un formulaire avec la touche Entrée (pratique  pour un login par exemple), il va vous falloir ajouter un event listener global, traiter chaque évènement clavier et si la touche Entrée est détectée, exécuter la même action que l'appui sur le bouton. Cela est un peu laborieux, d'autant plus que si vous changez la fonction handler de l'évènement "click" du bouton, il faut aller modifier votre code dans le keyUpListener.

Heureusement, le composant <mx:Form> de Flex contient une propriété "defaultButton" qui va vous sauver de toutes ces lignes de code. La propriété "defaultButton" prend un id de composant (Button) en valeur. Une fois cette propriété fixée, vous n'avez plus rien à faire, la validation du formulaire se fera automatiquement sur pression de la touche Entrée. Vous remarquerez aussi que dès que le formulaire a le focus, le bouton par défaut est mis en valeur (emphasized).

Voici un exemple pour vous montrer sa facilité d'utilisation:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
	<mx:Script>
		<![CDATA[
			import mx.controls.Alert;
		]]>
	</mx:Script>
	<mx:Form defaultButton="{validButton}">
		<mx:FormHeading label="Identification (Appuyer sur Entrée pour valider)"/>
		<mx:FormItem label="Login">
			<mx:TextInput text="monlogin"/>
		</mx:FormItem>
		<mx:FormItem label="Password">
			<mx:TextInput text="monmdp"/>
		</mx:FormItem>
		<mx:FormItem direction="horizontal">
			<mx:Button id="validButton" label="Valider" click="Alert.show('Formulaire identification validé !')"/>
			<mx:Button id="cancelButton" label="Annuler"/>
		</mx:FormItem>
	</mx:Form>
</mx:Application>

Flex Source Code Download: Télécharger le code source complet de l'application

This movie requires Flash Player 11

26mar/097

Composant Flex – Texte Défilant type Marquee (ScrollingText)

Vous avez sûrement déjà vu sur des sites ayant des design type sites des années 80, ces textes défilants "Bienvenue sur mon site!". Pour cela, soit un peu de JavaScript, soit du html avec la balise marquee: <marquee>Bienvenue sur mon site!</marquee>. C'était plutôt affreux (à mon goût) mais admettons que vous vouliez créer le même effet dans votre application Flex, pour lui donner un air vintage peut-être.

Et bien Peter Ent a crée un composant permettant de faire ce texte défilant sous Flex. Ce composant est baptisé ScrollingFlex, voici un exemple de son utilisation:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
	xmlns:controls="com.keaura.controls.*"
	creationComplete="{scrollinText.start();scrollinText2.start();}">
	<controls:ScrollingText id="scrollinText" text="De gauche à droite" direction="leftToRight" speed="2" width="100%" height="30"/>
	<controls:ScrollingText id="scrollinText2" text="De haut en bas" direction="topToBottom" speed="3" width="100%" height="30"/>
</mx:Application>

Flex Source Code Download: Télécharger le code source complet de l'application

This movie requires Flash Player 11

Plusieurs paramètres sont à disposition:

  • direction: les 4 directions sont possibles (gauche à droite, haut en bas ...)
  • speed: vitesse de déplacement du texte
  • text: le texte à faire défiler

Attention, n'oubliez pas de donner une height à votre composant, la hauteur de base est de 0 sinon et vous ne verrez rien. N'oubliez pas non plus de lancer le défilement avec la méthode start()

26mar/092

Flex Item Renderer – Un itemRenderer optimisé en héritant de UIComponent

Héritez de la classe UICompenent est de loin la manière la plus optimale d'écrire un itemRenderer. Vous aurez le contrôle complet de votre code et le renderer sera aussi rapide que possible.

On va prendre l'exemple utilisé dans l'article sur l'optimisation des itemRenderer Flex pour le réécrire en se basant sur UIComponent. Cet itemRenderer fait simplement un changement de styles.

On crée donc une classe PriceItemRenderer.as qui va hériter d'UIComponent:

package renderers{
      import mx.controls.listClasses.IListItemRenderer;
      import mx.core.UIComponent;

      public class PriceItemRenderer extends UIComponent implements IListItemRenderer{
           public function PriceItemRenderer(){
                 super();
           }
      }
}

Vous avez du remarquer qu'en plus d'hériter d'UIComponent, on la fait implémenter l'interface IListItemRenderer. Il est nécessaire de le faire car un composant List va attendre des renderers qu'il implémentent cette interface. Si vous ne le faîtes pas, vous aurez une RTE (RunTime Error) car la liste tente de caster votre renderer en cette interface.

25mar/092

Flex Item Renderer – Optimiser les performances des ItemRenderer

Si vous affichez un grand nombre d'itemRenerers  (que ce soit dans une DataGrid ou dans une AdvancedDataGrid), les performances de votre application Flex pourraient être affectées si vous ne codez pas ces itemRenderer de manière optimale.

Voici quelques conseils qui pourraient vous aider:

  • Limitez le nombre de colonnes utilisant des itemRenderer. Est-ce que vous avez vraiment besoin que chacun colonne utilise un itemRenderer personnalisé? Parfois ce sera le cas mais il faut savoir peser le pour et le contre...
  • Essayer de ne pas changer les styles des éléments de votre itemRenderer trop souvent. Si vous avez besoin de changer de styles (par exemple, afficher du vert pour une valeur positive et du rouge pour une valeur négative), pensez à avoir 2 composants préparés avec ces styles et d'en afficher/cacher un. Le changement de style est une des tâches les plus lourdes en Flex.
  • N'utilisez pas de Container comme base pour votre itemRenderer. Les conteneurs ajoutent beaucoup de code qui ne vous sera pas forcement utile (positionnement des composants automatique). Ils sont ok pour une utilisation limitée, mais il est plus optimal d'écrire vos itemRenderer en se basant sur UIComponent.