<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>I.T. aware &#187; RIA-RDA-RWA</title>
	<atom:link href="http://www.itaware.eu/category/francais/ria-2/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.itaware.eu</link>
	<description>Sébastien Letélié and Cyril Balit weblog</description>
	<lastBuildDate>Sun, 20 Nov 2011 20:12:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>Des outils pour Flexer&#8230;.</title>
		<link>http://www.itaware.eu/2009/01/25/des-outils-pour-flexer/</link>
		<comments>http://www.itaware.eu/2009/01/25/des-outils-pour-flexer/#comments</comments>
		<pubDate>Sun, 25 Jan 2009 20:42:54 +0000</pubDate>
		<dc:creator>Cyril Balit</dc:creator>
				<category><![CDATA[RIA-RDA-RWA]]></category>
		<category><![CDATA[cairngorm]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[kapinspect]]></category>
		<category><![CDATA[puremvc]]></category>

		<guid isPermaLink="false">http://www.itaware.eu/?p=405</guid>
		<description><![CDATA[KapIT propose dans sa section lab plusieurs utilitaires pour les technologies Flex parmi lesquels on retrouve: KapInspect KapInspect est l’équivalent Flex de la célèbre console Firebug. Activée sur un simple clic elle permet d’inspecter l’ensemble des composants flex présent sur la page, de visualiser et de modifier leurs propriétés. Cairngorm console et purMVC console Ces [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.kapit.fr/">KapIT</a> propose dans sa section <a href="http://lab.kapit.fr/display/kaplabhome/Home">lab</a> plusieurs utilitaires pour les technologies Flex parmi lesquels on retrouve:</p>
<ul>
<li><strong>KapInspect</strong></li>
</ul>
<p><a href="http://lab.kapit.fr/display/kapinspect/Kap%20Inspect">KapInspect</a> est l’équivalent Flex de la célèbre console Firebug. Activée sur un simple clic elle permet d’inspecter l’ensemble des composants flex présent sur la page, de visualiser et de modifier leurs propriétés.<br />
<img class="alignnone size-full wp-image-406" title="kapi" src="http://www.itaware.eu/wp-content/uploads/2009/01/kapi.gif" alt="kapi" width="695" height="433" /></p>
<ul>
<li><strong><a href="http://lab.kapit.fr/display/cairngormconsole/Cairngorm+Console">Cairngorm</a> console et <a href="http://lab.kapit.fr/display/puremvcconsole/PureMVC+Console">purMVC</a> console<br />
</strong></li>
</ul>
<p class="MsoNormal">Ces consoles permettent de visualiser à l’exécution les différents composants du framework.</p>
<p><img class="alignnone size-full wp-image-406" title="kapi" src="http://www.itaware.eu/wp-content/uploads/2009/01/mvc.gif" alt="mvc" width="695" height="433" /></p>
<p>L&#8217;intégration est très simple. Après avoir inclus les .swc dans le classpath de votre projet il suffit d&#8217;insérer les tags correspondants dans votre fichier mxml</p>
<p>Par exemple :</p>
<p><code>
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" xmlns:kapit="fr.kapit.*"&gt;
	...
	&lt;kapit:KapInspect/&gt;	
&lt;/mx:Application&gt;
</code></p>
<p>A l&#8217;exécution il suffit d&#8217;enchainer la combinaison Ctrl+Alt+Click pour voir apparaitre la console. A noter que on peut utiliser en parallèle les différentes consoles.<br />
L&#8217;intégration de la console pureMVC est un peu plus couteuse car elle nécessite de modifier le code de votre Facade afin d&#8217;étendre la classe DebugFacade. Tout est expliqué <a href="http://lab.kapit.fr/display/puremvcconsole/Integration+Guide">la</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.itaware.eu/2009/01/25/des-outils-pour-flexer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>RIA et usabilité</title>
		<link>http://www.itaware.eu/2008/11/13/ria-et-usabilite/</link>
		<comments>http://www.itaware.eu/2008/11/13/ria-et-usabilite/#comments</comments>
		<pubDate>Thu, 13 Nov 2008 13:46:04 +0000</pubDate>
		<dc:creator>Sébastien Letélié</dc:creator>
				<category><![CDATA[.NET,WPF,WCF,Silverlight]]></category>
		<category><![CDATA[Français]]></category>
		<category><![CDATA[RIA-RDA-RWA]]></category>
		<category><![CDATA[collaboration]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[graphiste]]></category>
		<category><![CDATA[rda]]></category>
		<category><![CDATA[silverlight]]></category>
		<category><![CDATA[usabilité]]></category>

		<guid isPermaLink="false">http://www.itaware.eu/?p=378</guid>
		<description><![CDATA[Les <a href="http://www.worldusabilityday.org/" target="_blank">journées de l'utilisabilité</a> organisées par <a href="http://www.fredcavazza.net/" target="_blank">Fred Cavazza</a> pour Paris ont été l'occasion d'aborder les thèmes importants des applications riches. Des présentations intéressantes qui m'ont conforté dans ma vision du RIA et notamment de la relation <a href="http://www.itaware.eu/2008/08/12/lapproche-tetra-dveloppeur-designer-ergonome-et-orchestrateur/" target="_blank">développeur/graphiste/ergonome/utilisateur</a>.
Ce que j'en retient : <a href="http://www.itaware.eu/2008/11/13/ria-et-usabilite/">[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Les <a href="http://www.worldusabilityday.org/" target="_blank">journées de l&#8217;utilisabilité</a> organisées par <a href="http://www.fredcavazza.net/" target="_blank">Fred Cavazza</a> pour Paris ont été l&#8217;occasion d&#8217;aborder les thèmes importants des applications riches. Des présentations intéressantes qui m&#8217;ont conforté dans ma vision du RIA et notamment de la relation <a href="http://www.itaware.eu/2008/08/12/lapproche-tetra-dveloppeur-designer-ergonome-et-orchestrateur/" target="_blank">développeur/graphiste/ergonome/utilisateur</a>.<br />
Ce que j&#8217;en retient :<br />
<span id="more-378"></span></p>
<ul>
<li> Un public apparemment plutôt issu du monde &laquo;&nbsp;marketing&nbsp;&raquo;, dommage je pense qu&#8217;il est temps que le monde du services et des éditeurs d&#8217;applications d&#8217;entreprises s&#8217;intéressent à ce sujet.</li>
<li> Heureusement la présentation de <a href="http://www.piaction.com/" target="_blank">People In Action</a> a apportée une vision du RIA dans l&#8217;entreprise. Bien que le domaine de l&#8217;entreprise soit à différencier des domaines marketings et divertissements, il est tout de même intéressant de constater que les méthodes de conception sont similaires et que les composants visuels et notamment ceux de navigation peuvent être utilisés partout.</li>
<li> Le secteur du jeu est une source d&#8217;information prolifique en terme d&#8217;ergonomie, il faut vraiment continuer à regarder ce qu&#8217;ils font et s&#8217;en inspirer</li>
<li> Un projet d&#8217;interface riche ne peut réussir que si le système d&#8217;information est bien organisé, c&#8217;est à dire selon moi proche d&#8217;une architecture SOA. <a href="http://www.tequilarapido.com/" target="_blank">TequilaRapido</a> a du stopper un projet car le socle métier n&#8217;était pas adapté.</li>
<li> Il ne faut pas attendre tout des utilisateurs, celui-ci à plutôt tendance à éviter d&#8217;avoir mal plutôt que de risquer quelque chose de nouveau comme le dit très justement <a href="http://www.navigation-web.com/" target="_blank">Patricia GALLOT-LAVALLEE</a>. Mais il faut tout de même le remettre au centre du projet.</li>
<li> Les interaction design pattern doivent être utilisés, c&#8217;est un fait. Je pense personnellement que l&#8217;approche &laquo;&nbsp;Event Driven&nbsp;&raquo; est la meilleure pour ce type d&#8217;application avec les pattern qui en découle.</li>
<li> A la grande déception de Fred il n&#8217;existe toujours pas d&#8217;outils de conception, d&#8217;après les gars d&#8217;Adobe <a href="http://labs.adobe.com/wiki/index.php/Thermo" target="_blank">Thermo</a> devrait s&#8217;améliorer sur ce point on en saura plus après l&#8217;<a href="http://max.adobe.com/" target="_blank">Adobe MAX</a>.</li>
<li> Il n&#8217;y a pas de secret la réussite des projets RIA passe par les méthodes agiles. On ne sait pas tout dès le début, les besoins évoluent au cours du projet au fur et à mesure que les utilisateurs découvrent l&#8217;application à travers les différentes présentations à la fin de chaque itération. C&#8217;est vraiment ce type méthode qui doit être utilisée.</li>
<li> Le RIA ce n&#8217;est pas que via le navigateur comme je le <a href="http://www.itaware.eu/2008/11/05/ria-interieur-exterieur-navigateur/" target="_blank">répète</a> souvent et que le dit très bien <a href="http://blogs.microsoft.fr/dicklant/">Dick LANTIM</a> de Microsoft. Le panel est large. Les nouveaux périphériques (surface, touch wall, capteur de mouvement, tablet pc, mobile &#8230;) changent aussi la façon d&#8217;appréhender les applications et doivent faire partie prenante de la réflexion lors de la conception. Microsoft a son mot à dire sur le sujet et je constate qu&#8217;ils sont bel et bien dans la course, il faudra penser avec eux désormais (comme me le disait <a href="http://www.dgirard.eu" target="_blank">Didier</a> en revenant de la PDC).</li>
<li> Microsoft et Adobe toujours présents pour ce type de rendez-vous, on se demande où malheureusement est Sun, je crois pourtant en JavaFX techniquement parlant.</li>
</ul>
<p>C&#8217;est la 4ème année qu&#8217;ont lieu ces journées de l&#8217;utilisabilité partout dans le monde (43 pays). Personnellement je découvre cet évènement et je remercie Fred Cavazza de le promouvoir.<br />
Penser les RIA en terme d&#8217;utilisabilité est bien le défi qui fera le succès du &laquo;&nbsp;riche&nbsp;&raquo;. Bien connaître les possibilités des technologies tant matérielles que logicielles et repositionner l&#8217;utilisateur au cœur du projet sont des éléments essentiels.</p>
<p>Les présentations seront bientôt disponibles en vidéo sur le site <a href="http://www.worldusabilityday.org" target="_blank">worldusabilityday.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.itaware.eu/2008/11/13/ria-et-usabilite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SINGLETON en as3</title>
		<link>http://www.itaware.eu/2008/11/08/singleton-en-as3/</link>
		<comments>http://www.itaware.eu/2008/11/08/singleton-en-as3/#comments</comments>
		<pubDate>Sat, 08 Nov 2008 12:24:46 +0000</pubDate>
		<dc:creator>Cyril Balit</dc:creator>
				<category><![CDATA[Français]]></category>
		<category><![CDATA[RIA-RDA-RWA]]></category>
		<category><![CDATA[action script]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[pattern]]></category>
		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://www.itaware.eu/?p=361</guid>
		<description><![CDATA[Pour implémenter le pattern singleton en action script on se heurte rapidement à une limitation du langage: on ne peut pas rendre un constructeur privé or il s&#8217;agit de la base du pattern. En regardant sur internet on trouve plusieurs solutions plus ou moins évoluées qui permettent de protéger l&#8217;usage du constructeur. Souvent une exception [...]]]></description>
			<content:encoded><![CDATA[<p>Pour implémenter le pattern <a href="http://en.wikipedia.org/wiki/Singleton_pattern">singleton</a> en action script on se heurte rapidement à une limitation du langage: <strong>on ne peut pas rendre un constructeur privé</strong> or il s&#8217;agit de la base du pattern. En regardant sur internet on trouve plusieurs solutions plus ou moins évoluées qui permettent de protéger l&#8217;usage du constructeur. Souvent une exception est levée si le constructeur n&#8217;est pas invoqué par la méthode static <em>getInstance</em>. L&#8217;inconvénient de cette approche est que l&#8217;erreur est visible uniquement à l&#8217;exécution et non à la compilation. Dans le livre <a href="http://www.amazon.fr/ActionScript-Design-Patterns-William-Sanders/dp/0596528469">&laquo;&nbsp;ActionScript 3.0 Design Patterns&nbsp;&raquo;</a> l&#8217;auteur propose une autre approche.<br />
<span id="more-361"></span><br />
Le principe est d&#8217;utiliser une classe privée décrite dans notre classe Singleton mais à l&#8217;extérieure du package:</p>
<div style="white-space:pre;">
<code>
package
{
public class Singleton
{
private static var _instance:Singleton;
public function Singleton(pvt:PrivateClass){
}
public static function getInstance():Singleton
{
if(Singleton._instance==null){
Singleton._instance=new Singleton(new PrivateClass()};
}
return Singleton._instance;
}
}
}
//END OF PACKAGE
//Private class
class PrivateClass
{
public function PrivateClass(){}
}</code>
</div>
<p>L&#8217;avantage est que la classe privée utilisée dans le constructeur n&#8217;est visible que dans le classe Singleton car elle est définit hors du package.<br />
En effet le code suivant dans une autre classe  provoque une erreur à la compilation</p>
<p><code>
Singleton s=new Singleton(new PrivateClass())};
</code><br />
Voila une façon élégante d&#8217;implémenter ce pattern.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.itaware.eu/2008/11/08/singleton-en-as3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RIA : a l&#8217;intérieur ou à l&#8217;extérieur du navigateur ?</title>
		<link>http://www.itaware.eu/2008/11/05/ria-interieur-exterieur-navigateur/</link>
		<comments>http://www.itaware.eu/2008/11/05/ria-interieur-exterieur-navigateur/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 17:16:34 +0000</pubDate>
		<dc:creator>Sébastien Letélié</dc:creator>
				<category><![CDATA[.NET,WPF,WCF,Silverlight]]></category>
		<category><![CDATA[Français]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[RIA-RDA-RWA]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[rda]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[rwa]]></category>

		<guid isPermaLink="false">http://www.itaware.eu/?p=348</guid>
		<description><![CDATA[Le <a href="http://www.parisjug.org/" target="_blank">Paris JUG</a> était cette fois ci consacré à <a href="http://code.google.com/webtoolkit/" target="_blank">GWT</a> et à l'implémentation de <a href="http://www.restlet.org/" target="_blank">Restlet</a> pour GWT. Deux présentations rondement menée par <a href="http://blog.dgirard.eu">Didier Girard</a> et Jerome Louvel. J'ai été impressionné par le nombre de participant, pensant que GWT était déjà dans les moeurs. Bravo à Didier de continuer à promouvoir cette technologie innovante et à Jérôme d'y apporter le concept <a href="http://en.wikipedia.org/wiki/Representational_State_Transfer" target="_blank">REST</a>.
Reste que je m'étonne de la vision que les gens ont du RIA. Pour beaucoup j'ai l'impression que RIA veut dire application web riche. <a href="http://www.itaware.eu/2008/11/05/ria-interieur-exterieur-navigateur/" target="_blank">[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Le <a href="http://www.parisjug.org/" target="_blank">Paris JUG</a> était cette fois ci consacré à <a href="http://code.google.com/webtoolkit/" target="_blank">GWT</a> et à l&#8217;implémentation de <a href="http://www.restlet.org/" target="_blank">Restlet</a> pour GWT. Deux présentations rondement menée par <a href="http://blog.dgirard.eu" target="_blank">Didier Girard</a> et Jerome Louvel. J&#8217;ai été impressionné par le nombre de participant, pensant que GWT était déjà dans les moeurs. Bravo à Didier de continuer à promouvoir cette technologie innovante et à Jérôme d&#8217;y apporter le concept <a href="http://en.wikipedia.org/wiki/Representational_State_Transfer" target="_blank">REST</a>.<br />
Reste que je m&#8217;étonne de la vision que les gens ont du RIA. Pour beaucoup j&#8217;ai l&#8217;impression que RIA veut dire application web riche. Or la notion de &laquo;&nbsp;riche&nbsp;&raquo; est simplement une reconsidération de l&#8217;expérience utilisateur et cela ne passe pas obligatoirement par le navigateur. GWT, Ajax, AppletFX, Flex ou Silverlight n&#8217;ont pas le monopole du RIA simplement parce qu&#8217;ils s&#8217;exécutent dans un navigateur.<br />
Javascript a permis de dépasser les limites de HTML dans le navigateur et a donné une nouvelle dimension aux applications web. Le navigateur devient maintenant un runtime Javascript et utilise comme bibliothèque graphique le HTML. Comme Java avec Swing, C# avec WPF ou Silverlight, AS3 avec Flash et Flex.<br />
iTunes est surement une des premières RIA et ce n&#8217;est pas une application web. Comme je le disais déjà il faut simplement différencier <a href="http://www.itaware.eu/2007/03/28/ria-desktop-ou-web/" target="_blank">Rich Web Application et Rich Desktop Application</a>. Une RWA s&#8217;éxecute dans le navigateur, une RDA s&#8217;éxecute dans un OS.<br />
Il y a avantages et inconvénients dans les deux approches mais la diffusion et la maintenance qui ont longtemps été les points forts des applications web ne sont plus vrais aujourd&#8217;hui.<br />
Comme vous ne vous étonnez plus d&#8217;avoir votre Windows automatiquement mis à jour il est aujourd&#8217;hui tout à fait possible pour une RDA d&#8217;être diffusée et maintenu via le Web. Java Web Start en est un bel exemple et Adobe AIR sait le faire aussi. Mais vous me direz que pour faire tourner du Java ou du Air il faut installer respectivement la JVM et le runtime AIR. Oui c&#8217;est vrai comme récemment vous avez installé Chrome ou il y a plus longtemps Firefox. La différence se fait avec Windows qui embarque son navigateur IE et que dès lors que vous achetez un PC en Windows vous l&#8217;avez. A un moment donné on installe un runtime et a moins d&#8217;être terriblement fainéant personne n&#8217;est obligé de se contenter de Windows/IE.<br />
La où il faut être vigilant avec une RDA c&#8217;est de ne pas retomber dans l&#8217;ancien modèle client/serveur. La RDA doit rester une couche client et ne pas embarquer de métier qui lui doit toujours se trouver coté serveur.<br />
Apple avait déjà expérimenté cela intelligemment avec <a href="http://www.webobjects.com" target="_blank">WebObjects</a> Java Client et continue aujourd&#8217;hui à proposer des API similaires pour Cocoa et maintenant IPhone SDK.<br />
Au slogan &laquo;&nbsp;the browser is the platform&nbsp;&raquo; je réponds &laquo;&nbsp;the browser is a platform&nbsp;&raquo;. Les architectures de demain ne doivent pas être dépendantes de la couche client car celle-ci doit être développée dans la meilleure technologie pour répondre aux objectifs de l&#8217;application et du besoin client en privilégiant ergonomie et performance.<br />
Notre application <a href="http://www.resurgences.com" target="_blank">ResUrgences</a> est en mode web depuis 8 ans maintenant dans un secteur (la santé) ou les applications sont souvent du client/serveur. Pourtant son extension du service d&#8217;urgences au SMUR nous oblige à reconsidérer le web car l&#8217;utilisation d&#8217;une application web sur tablette pc en mode déconnecté, bien que pas impossible, n&#8217;est pas adaptée. Notamment quant il s&#8217;agit de s&#8217;interconnecter avec du matériel de monitoring et d&#8217;électro-cardiogramme.<br />
Alors quel choix faire entre RWA et RDA ? La première étape c&#8217;est de penser RIA, donc d&#8217;avoir un métier coté serveur respectant une architecture SOA et accessible via des services diffusant des formats diverses via des protocoles diverses. A partir de là différents critères vont rentrer en jeu : ergonomie, performance, accessibilité, environnement (OS et matériel), ouverture, sécurité, compatibilité avec un existant &#8230; Il n&#8217;y a donc pas de réponse évidente. Je cherche depuis un moment faire un tableau qui définit quelle technologie pour quels besoins et au final je pense que c&#8217;est inutile.<br />
Ce qu&#8217;il faut considérer c&#8217;est que :</p>
<ul>
<li>l&#8217;accès aux resources locales (fichiers, applications, périphériques USB, serie, Bluetooth) est un argument pour pencher vers le RDA. Bien que cela peut être pallié avec un applet et de plus en plus avec <a href="http://gears.google.com/" target="_blank">Gears</a> (mais cela revient à <a href="http://www.itaware.eu/2007/07/15/interaction-entre-desktop-et-web/">mixer</a> RDA et RIA, pourquoi pas d&#8217;ailleurs c&#8217;est ce que je fais) et que le Flash plugin permet déjà l&#8217;accès à la caméra.</li>
<li> la notion de &laquo;&nbsp;push&nbsp;&raquo;, pour envoyer des données vers un client depuis le serveur est maintenant possible avec des RWA (<a href="http://en.wikipedia.org/wiki/Comet_(programming)" target="_blank">Comet</a>, reverse Ajax) et bientôt <a href="http://www.itaware.eu/2008/11/03/du-push-du-push-du-push/" target="_blank">standardisée</a> dans <a href="http://www.w3.org/html/wg/html5/" target="_blank">HTML 5</a> (<a href="http://www.w3.org/html/wg/html5/#the-web-socket-protocol" target="_blank">WebSocket</a>).</li>
<li> les échanges asynchrones via des <a href="http://fr.wikipedia.org/wiki/MOM" target="_blank">MOM</a> avec des queues coté client ne peuvent pas encore se faire en RWA. Gears devrait proposer une API et LifeCycle Data Service ne le propose pas reellement car la queue reste coté serveur.</li>
<li> l&#8217;uniformisation des applicatifs avec une même plate-forme de déploiement indépendante de l&#8217;OS est sûrement l&#8217;argument le plus percutant pour le SI pour choisir une RWA</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.itaware.eu/2008/11/05/ria-interieur-exterieur-navigateur/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Retour à JavaFX</title>
		<link>http://www.itaware.eu/2008/09/14/retour-a-javafx/</link>
		<comments>http://www.itaware.eu/2008/09/14/retour-a-javafx/#comments</comments>
		<pubDate>Sun, 14 Sep 2008 16:39:38 +0000</pubDate>
		<dc:creator>Sébastien Letélié</dc:creator>
				<category><![CDATA[Français]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[RIA-RDA-RWA]]></category>
		<category><![CDATA[Illustrator]]></category>
		<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[SVG]]></category>

		<guid isPermaLink="false">http://www.itaware.eu/?p=214</guid>
		<description><![CDATA[Dans un post précédent je disais que ce qui manquait à JavaFX était un outil de conception graphique pour permettre une collaboration graphiste/développeur selon moi indispensable à l&#8217;adhésion de la communauté à cette technologie. Sachant que les graphistes ne changeront pas d&#8217;outils facilement la meilleure approche serait de faire un pont entre les outils de [...]]]></description>
			<content:encoded><![CDATA[<p>Dans un <a href="http://www.itaware.eu/2007/05/18/java-on-the-ria-road/">post</a> précédent je disais que ce qui manquait à JavaFX était un outil de conception graphique pour permettre une collaboration graphiste/développeur selon moi indispensable à l&#8217;adhésion de la communauté à cette technologie. Sachant que les graphistes ne changeront pas d&#8217;outils facilement la meilleure approche serait de faire un pont entre les outils de design existants et JavaFX. C&#8217;est l&#8217;objectif de <a href="http://java.sun.com/javafx/reference/project_nile_installing/">Project NILE</a> en proposant un plugin Illustrator et un plugin Photoshop permettant d&#8217;exporter un FXD ou un fichier FX mais aussi un convertisseur SVG et un visualiseur graphique.<br />
C&#8217;est selon moi la bonne stratégie, je me suis donc lancé dans un test.<br />
<span id="more-214"></span><br />
Pour bien mettre en valeur la collaboration graphiste/développeur je suis allé chercher des travaux sur le net, j&#8217;ai trouvé des <a href="http://www.bittbox.com/freebies/72-free-vector-glass-buttons-and-bars/">boutons</a> &laquo;&nbsp;glossy&nbsp;&raquo; proposé en <em>.ai</em> et en <em>.svg</em>.<br />
<img src="/JavaFX/alphabet_glass_bars.png" alt="alphabet_glass_bars" /><br />
Le test SVG n&#8217;est pas concluant, la transformation ne reprend pas les effets et pas mal de corrections sont nécessaires pour arriver à compiler. Je bascule de suite sur une conversion via Illustrator. Le premier coup ne compile pas car je suis <a href="http://forums.sun.com/thread.jspa?threadID=5320845&#038;tstart=0">européen</a> <img src='http://www.itaware.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Au deuxième coup ça compile et le résultat est quasi identique au document <em>.ai</em>, juste un léger problème de couleur rapidement corrigé.<br />
Le <a href="http://www.itaware.eu/JavaFX/alphabet_glass_bars2.fx">script FX</a> est composé d&#8217;un ensemble de SVGPath, chaque caractère du clavier est aussi défini en un SVGPath. Un peu laborieux à exploiter tel quel il serait plus pratique d&#8217;extraire un composant et d&#8217;y appliquer des comportements comme typiquement un clic souris et en lui passant en paramètre sa position et le caractère à afficher.<br />
J&#8217;extrais donc du script la définition d&#8217;un bouton Je remplace le SVGPath du caractère par un composant Text. J&#8217;ajoute un évènement sur le clic souris et je modifie l&#8217;aspect quand le bouton de la souris est enfoncé. </p>
<p><strong>GlassButton.fx</strong></p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<span style="font-family: courier new; font-size: 10pt;"><span style="font-weight: bold; color: rgb(127,0,85);">package</span>&nbsp;<span style="color: rgb(0,0,0);">testfx1;</span></p>
<p><span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.geometry.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.image.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.paint.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.text.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.effect.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.input.MouseEvent;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.transform.*;</span>&nbsp;<br />
<span style="font-weight: bold; color: rgb(127,0,85);">public</span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">class</span>&nbsp;<span style="color: rgb(0,0,0);">GlassButton</span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">extends</span>&nbsp;<span style="color: rgb(0,0,0);">CustomNode</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">public</span>&nbsp;<span style="color: rgb(0,0,0);">attribute</span>&nbsp;<span style="color: rgb(0,0,0);">letter:String;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">public</span>&nbsp;<span style="color: rgb(0,0,0);">attribute</span>&nbsp;<span style="color: rgb(0,0,0);">onClick:function(t:String):Void;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">public</span>&nbsp;<span style="color: rgb(0,0,0);">attribute</span>&nbsp;<span style="color: rgb(0,0,0);">x:Integer;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">public</span>&nbsp;<span style="color: rgb(0,0,0);">attribute</span>&nbsp;<span style="color: rgb(0,0,0);">y:Integer;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">protected</span>&nbsp;<span style="color: rgb(0,0,0);">function</span>&nbsp;<span style="color: rgb(0,0,0);">create()</span>&nbsp;<span style="color: rgb(0,0,0);">:</span>&nbsp;<span style="color: rgb(0,0,0);">Node</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">var</span>&nbsp;<span style="color: rgb(0,0,0);">effect</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">DropShadow</span>&nbsp;<span style="color: rgb(0,0,0);">{</span>&nbsp;<span style="color: rgb(0,0,0);">offsetX:0.0,offsetY:1.0,color:Color.BLACK,radius:8.0};</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">return</span>&nbsp;<span style="color: rgb(0,0,0);">Group</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">translateX:</span>&nbsp;<span style="color: rgb(0,0,0);">x</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">translateY:</span>&nbsp;<span style="color: rgb(0,0,0);">y</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">content:</span>&nbsp;<span style="color: rgb(0,0,0);">[</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">SVGPath</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">effect:</span>&nbsp;<span style="color: rgb(0,0,0);">bind</span>&nbsp;<span style="color: rgb(0,0,0);">effect</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">fill:</span>&nbsp;<span style="color: rgb(0,0,0);">LinearGradient{proportional:</span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">false</span>&nbsp;<span style="color: rgb(0,0,0);">startX:</span>&nbsp;<span style="color: rgb(0,0,0);">21.00</span>&nbsp;<span style="color: rgb(0,0,0);">startY:35.00</span>&nbsp;<span style="color: rgb(0,0,0);">endX:</span>&nbsp;<span style="color: rgb(0,0,0);">21.00</span>&nbsp;<span style="color: rgb(0,0,0);">endY:</span>&nbsp;<span style="color: rgb(0,0,0);">5.00</span>&nbsp;<span style="color: rgb(0,0,0);">stops:</span>&nbsp;<span style="color: rgb(0,0,0);">[</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">Stop</span>&nbsp;<span style="color: rgb(0,0,0);">{offset:</span>&nbsp;<span style="color: rgb(0,0,0);">0.000</span>&nbsp;<span style="color: rgb(0,0,0);">color:</span>&nbsp;<span style="color: rgb(0,0,0);">Color.rgb(0xd2,0xd2,0xd2,1.0)},</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">Stop</span>&nbsp;<span style="color: rgb(0,0,0);">{offset:</span>&nbsp;<span style="color: rgb(0,0,0);">0.500</span>&nbsp;<span style="color: rgb(0,0,0);">color:</span>&nbsp;<span style="color: rgb(0,0,0);">Color.rgb(0x4e,0x4e,0x4e,1.0)},</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">Stop</span>&nbsp;<span style="color: rgb(0,0,0);">{offset:</span>&nbsp;<span style="color: rgb(0,0,0);">1.000</span>&nbsp;<span style="color: rgb(0,0,0);">color:</span>&nbsp;<span style="color: rgb(0,0,0);">Color.BLACK},</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">]}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">content:</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;M36.00,27.00&nbsp;C36.00,31.42&nbsp;32.42,35.00&nbsp;28.00,35.00&nbsp;L14.00,35.00&nbsp;C9.58,35.00&nbsp;6.00,31.42&nbsp;6.00,27.00&nbsp;L6.00,13.00&nbsp;C6.00,8.59&nbsp;9.58,5.00&nbsp;14.00,5.00&nbsp;L28.00,5.00&nbsp;C32.42,5.00&nbsp;36.00,8.59&nbsp;36.00,13.00&nbsp;Z&nbsp;&quot;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">},</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">SVGPath</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">fill:</span>&nbsp;<span style="color: rgb(0,0,0);">Color.GRAY</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">content:</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;M34.00,22.77&nbsp;L8.00,22.77&nbsp;L8.00,14.00&nbsp;C8.00,9.86&nbsp;11.55,6.50&nbsp;15.92,6.50&nbsp;L26.08,6.50&nbsp;C30.46,6.50&nbsp;34.00,9.86&nbsp;34.00,14.00&nbsp;Z&nbsp;&quot;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">},</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">Text</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">fill:</span>&nbsp;<span style="color: rgb(0,0,0);">Color.WHITE</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">font:</span>&nbsp;<span style="color: rgb(0,0,0);">Font</span>&nbsp;<span style="color: rgb(0,0,0);">{</span>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">size:</span>&nbsp;<span style="color: rgb(0,0,0);">18</span>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">style:</span>&nbsp;<span style="color: rgb(0,0,0);">FontStyle.BOLD</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">x:</span>&nbsp;<span style="color: rgb(0,0,0);">14,</span>&nbsp;<span style="color: rgb(0,0,0);">y:</span>&nbsp;<span style="color: rgb(0,0,0);">27</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">content</span>&nbsp;<span style="color: rgb(0,0,0);">:</span>&nbsp;<span style="color: rgb(0,0,0);">letter</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">]</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">onMouseClicked:</span>&nbsp;<span style="color: rgb(0,0,0);">function(</span>&nbsp;<span style="color: rgb(0,0,0);">e:</span>&nbsp;<span style="color: rgb(0,0,0);">MouseEvent</span>&nbsp;<span style="color: rgb(0,0,0);">):Void</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">onClick(letter);</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">onMousePressed:</span>&nbsp;<span style="color: rgb(0,0,0);">function(</span>&nbsp;<span style="color: rgb(0,0,0);">e:</span>&nbsp;<span style="color: rgb(0,0,0);">MouseEvent</span>&nbsp;<span style="color: rgb(0,0,0);">):Void</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">effect</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">null</span><span style="color: rgb(0,0,0);">;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">onMouseReleased:</span>&nbsp;<span style="color: rgb(0,0,0);">function(</span>&nbsp;<span style="color: rgb(0,0,0);">e:</span>&nbsp;<span style="color: rgb(0,0,0);">MouseEvent</span>&nbsp;<span style="color: rgb(0,0,0);">):Void</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">effect</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">DropShadow</span>&nbsp;<span style="color: rgb(0,0,0);">{</span>&nbsp;<span style="color: rgb(0,0,0);">offsetX:0.0,offsetY:1.0,color:Color.BLACK,radius:8.0};</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">};</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
<span style="color: rgb(0,0,0);">}</span><br />
</span>
</div>
</div>
<p>Je crée alors une deuxième classe qui va gérer la disposition des touches en bouclant sur un tableau de caractères.</p>
<p><strong>Keyboard.fx</strong></p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<span style="font-family: courier new; font-size: 10pt;"><span style="font-weight: bold; color: rgb(127,0,85);">package</span>&nbsp;<span style="color: rgb(0,0,0);">testfx1;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.text.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.paint.*;</span></p>
<p><span style="font-weight: bold; color: rgb(127,0,85);">public</span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">class</span>&nbsp;<span style="color: rgb(0,0,0);">Keyboard</span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">extends</span>&nbsp;<span style="color: rgb(0,0,0);">CustomNode</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">public</span>&nbsp;<span style="color: rgb(0,0,0);">function</span>&nbsp;<span style="color: rgb(0,0,0);">create():Node</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">java.lang.System.out.println(</span><span style="color: rgb(42,0,255);">&quot;BuildLetters&nbsp;&#8230;&quot;</span><span style="color: rgb(0,0,0);">);</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">var</span>&nbsp;<span style="color: rgb(0,0,0);">t:String;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">var</span>&nbsp;<span style="color: rgb(0,0,0);">letters</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">[</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(42,0,255);">&quot;A&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;B&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;C&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;D&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;E&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;F&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;G&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;H&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;I&quot;</span><span style="color: rgb(0,0,0);">,</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(42,0,255);">&quot;J&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;K&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;L&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;M&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;N&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;O&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;P&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;Q&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;R&quot;</span><span style="color: rgb(0,0,0);">,</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(42,0,255);">&quot;S&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;T&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;U&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;V&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;W&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;X&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;Y&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;Z&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;@&quot;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">];</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">var</span>&nbsp;<span style="color: rgb(0,0,0);">buttons:Node[]</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">[</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">Text</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">font:</span>&nbsp;<span style="color: rgb(0,0,0);">Font</span>&nbsp;<span style="color: rgb(0,0,0);">{</span>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">size:</span>&nbsp;<span style="color: rgb(0,0,0);">14</span>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">style:</span>&nbsp;<span style="color: rgb(0,0,0);">FontStyle.PLAIN</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">x:</span>&nbsp;<span style="color: rgb(0,0,0);">5,</span>&nbsp;<span style="color: rgb(0,0,0);">y:</span>&nbsp;<span style="color: rgb(0,0,0);">16</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">content:</span>&nbsp;<span style="color: rgb(0,0,0);">bind</span>&nbsp;<span style="color: rgb(0,0,0);">t;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">];</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">var</span>&nbsp;<span style="color: rgb(0,0,0);">posX:Integer</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">0;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">var</span>&nbsp;<span style="color: rgb(0,0,0);">posY:Integer</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">0;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">var</span>&nbsp;<span style="color: rgb(0,0,0);">incI:Integer</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">0;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">var</span>&nbsp;<span style="color: rgb(0,0,0);">incJ:Integer</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">0;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">for</span>&nbsp;<span style="color: rgb(0,0,0);">(i</span>&nbsp;<span style="color: rgb(0,0,0);">in</span>&nbsp;<span style="color: rgb(0,0,0);">letters)</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">if</span>&nbsp;<span style="color: rgb(0,0,0);">(</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">incI</span>&nbsp;<span style="color: rgb(0,0,0);">mod</span>&nbsp;<span style="color: rgb(0,0,0);">9</span>&nbsp;<span style="color: rgb(0,0,0);">==</span>&nbsp;<span style="color: rgb(0,0,0);">0)</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">posY</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">35</span>&nbsp;<span style="color: rgb(0,0,0);">*</span>&nbsp;<span style="color: rgb(0,0,0);">(incJ</span>&nbsp;<span style="color: rgb(0,0,0);">++</span>&nbsp;<span style="color: rgb(0,0,0);">);</span>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">posX</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">0;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">incI</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">0;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">else</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">posX</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">35</span>&nbsp;<span style="color: rgb(0,0,0);">*</span>&nbsp;<span style="color: rgb(0,0,0);">incI;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">insert</span>&nbsp;<span style="color: rgb(0,0,0);">GlassButton</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">x:</span>&nbsp;<span style="color: rgb(0,0,0);">posX</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">y:</span>&nbsp;<span style="color: rgb(0,0,0);">bind</span>&nbsp;<span style="color: rgb(0,0,0);">45</span>&nbsp;<span style="color: rgb(0,0,0);">+</span>&nbsp;<span style="color: rgb(0,0,0);">posY</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">letter</span>&nbsp;<span style="color: rgb(0,0,0);">:</span>&nbsp;<span style="color: rgb(0,0,0);">i</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">onClick</span>&nbsp;<span style="color: rgb(0,0,0);">:</span>&nbsp;<span style="color: rgb(0,0,0);">function(s:String)</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">t</span>&nbsp;<span style="color: rgb(0,0,0);">+=</span>&nbsp;<span style="color: rgb(0,0,0);">s;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span>&nbsp;<span style="color: rgb(0,0,0);">into</span>&nbsp;<span style="color: rgb(0,0,0);">buttons;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">incI++;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">java.lang.System.out.println(</span><span style="color: rgb(42,0,255);">&quot;OK.&quot;</span><span style="color: rgb(0,0,0);">);</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">return</span>&nbsp;<span style="color: rgb(0,0,0);">Group</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">content</span>&nbsp;<span style="color: rgb(0,0,0);">:</span>&nbsp;<span style="color: rgb(0,0,0);">buttons</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
<span style="color: rgb(0,0,0);">}</span></span>
</div>
</div>
<p>Et puis j&#8217;insère le tout dans un Applet en suivant les conseils de <a href="http://learnjavafx.typepad.com/weblog/2008/09/javafx-meets-google-chrome.html">James Weaver</a></p>
<p><strong>GlassButtonApplet.fx</strong></p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<span style="font-family: courier new; font-size: 10pt;"><span style="font-weight: bold; color: rgb(127,0,85);">package</span>&nbsp;<span style="color: rgb(0,0,0);">testfx1;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.application.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.text.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.paint.*;</span></p>
<p><span style="color: rgb(0,0,0);">Application</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">stage:</span>&nbsp;<span style="color: rgb(0,0,0);">Stage</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">content:</span>&nbsp;<span style="color: rgb(0,0,0);">Keyboard</span>&nbsp;<span style="color: rgb(0,0,0);">{}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
<span style="color: rgb(0,0,0);">}</span></span>
</div>
</div>
<p>Ci-dessous le résultat, cliquez sur les touches et pour le sortir du navigateur vous enfoncez la touche alt et déplacez l&#8217;Applet. Le temps de génération est long (30s) soyez patient, je ne comprends pas pourquoi, je vais demander à Sun.<br />
<applet code="javafx.application.Applet" width=320 height=220 archive="javafxrt.jar, Scenario.jar, javafxgui.jar, javafx-swing.jar, TestFX1.jar"></p>
<param name="ApplicationClass" value="testfx1.GlassButtonApplet"/>
<param name="jnlp_href" value="GlassButtonApplet.jnlp"/>
<param name="draggable" value="true">
<param name="codebase" value="http://www.itaware.eu/JavaFX/"/>
</applet><br />
Note : le fait de pouvoir sortir l&#8217;Applet du browser oblige à créer un JNLP et donc de signer tous les jars dépendant de l&#8217;Applet. Un peu laborieux il faut penser à automatiser cette tâche :</p>
<ol>
<li>création du certificat : keytool -genkey [-keystore &lt;cheminDuKeystore&gt;] -alias &lt;nomDuCertificat&gt;</li>
<li>signature de jat : jarsigner [-keystore &lt;cheminDuKeystore&gt;] &lt;monFichier&gt;.jar &lt;nomDuCertificat&gt;</li>
</ol>
<p>Bilan<br />
En mettant bout à bout le temps passé en développement pur on peut compter environ 4h, incluant la prise en main de JavaFX. C&#8217;est correct mais il serait bien de pouvoir réduire encore ce temps. Il est selon moi difficile de manipuler du JavaFX sans au moins un visualiseur temps réel digne de ce nom. Celui fournit dans NetBeans 6.1 est un peu lent. Enfin l&#8217;idée est là et elle est prometteuse car avec le <a href="http://java.sun.com/developer/technicalArticles/javase/java6u10/">Java Plugin</a> à 4Mo on pourra enfin avoir des applis riches full Java qui ont l&#8217;avantage d&#8217;être en mesure de faire plus que la concurrence : accès aux périphériques serie, Bluetooth, &#8230; du poste client, utilisation d&#8217;API Java existantes (ex : JMS), bascule en mode desktop, &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.itaware.eu/2008/09/14/retour-a-javafx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>L&#8217;approche TETRA : d&#233;veloppeur, designer, ergonome et orchestrateur</title>
		<link>http://www.itaware.eu/2008/08/12/lapproche-tetra-dveloppeur-designer-ergonome-et-orchestrateur/</link>
		<comments>http://www.itaware.eu/2008/08/12/lapproche-tetra-dveloppeur-designer-ergonome-et-orchestrateur/#comments</comments>
		<pubDate>Tue, 12 Aug 2008 21:22:06 +0000</pubDate>
		<dc:creator>Sébastien Letélié</dc:creator>
				<category><![CDATA[Français]]></category>
		<category><![CDATA[RIA-RDA-RWA]]></category>
		<category><![CDATA[client riche]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[ergonomie]]></category>

		<guid isPermaLink="false">http://www.itaware.eu/?p=200</guid>
		<description><![CDATA[L&#8217; adoption du client riche n&#8217;est pas que l&#8217; engouement pour une nouvelle mode, c&#8217;est une réponse à une demande utilisateur pour qui l&#8217;informatique se doit d&#8217;être simple et intuitive. Les technologies et les outils se mettent en place, mais nous avons besoin de repenser la manière de concevoir les applications en impliquant plus l&#8217;utilisateur [...]]]></description>
			<content:encoded><![CDATA[<p>L&#8217; adoption du client riche n&#8217;est pas que l&#8217; engouement pour une nouvelle mode, c&#8217;est une réponse à une demande utilisateur pour qui l&#8217;informatique se doit d&#8217;être simple et intuitive. Les technologies et les outils se mettent en place, mais nous avons besoin de repenser la manière de concevoir les applications en impliquant plus l&#8217;utilisateur dans l&#8217;interface visuelle. Le client riche nous permet aujourd&#8217;hui de réaliser tous ce que peuvent imaginer les utilisateurs et c&#8217;est cette capacité qui rend ce concept innovant. Le problème c&#8217;est que l&#8217;utilisateur n&#8217;a pas toujours les moyens d&#8217;imaginer ce qui serait le mieux, il faut faire intervenir des personnes qui connaissent le métier, maîtrise les concepts d&#8217;ergonomie, ont une connaissance du design et de ce que tout cela peut coûter en terme de développement. C&#8217;est cet ensemble de compétences qu&#8217;il faut coordonner face à l&#8217;expression des besoins utilisateurs. On peut résumer cette approche sous forme d&#8217;un tetraèdre :</p>
<p><a href="http://www.itaware.eu/wp-content/uploads/2008/08/tetra.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://www.itaware.eu/wp-content/uploads/2008/08/tetra-thumb.png" border="0" alt="tetra" width="240" height="187" /></a></p>
<p>L&#8217;<a href="http://fr.wikipedia.org/wiki/Orchestrateur" target="_blank">ochestrateur</a> à le rôle bien particulier de mettre en harmonie le technique et le visuel avec le métier. Toute la difficulté réside à trouver la personne qui maîtrise les trois concepts précités et est capable de comprendre les subtilités de différents métiers. A mon avis la réussite d&#8217;un projet client riche passe par cette approche.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.itaware.eu/2008/08/12/lapproche-tetra-dveloppeur-designer-ergonome-et-orchestrateur/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>FLEX vs AJAX vs GWT sur le Grid</title>
		<link>http://www.itaware.eu/2008/05/13/flex-vs-ajax-vs-gwt-sur-le-grid/</link>
		<comments>http://www.itaware.eu/2008/05/13/flex-vs-ajax-vs-gwt-sur-le-grid/#comments</comments>
		<pubDate>Tue, 13 May 2008 19:13:42 +0000</pubDate>
		<dc:creator>Cyril Balit</dc:creator>
				<category><![CDATA[Français]]></category>
		<category><![CDATA[RIA-RDA-RWA]]></category>

		<guid isPermaLink="false">http://www.itaware.eu/2008/05/13/flex-vs-ajax-vs-gwt-sur-le-grid/</guid>
		<description><![CDATA[Le titre est un peu racoleur je vous l’accorde mais l’objectif de ce billet est plutôt de se familiariser avec 3 façons de faire du RIA et de les comparer au travers d’un composant central d’une application : le grid. Je me suis donc employé à recréer un écran simple contenant un label, un bouton [...]]]></description>
			<content:encoded><![CDATA[<p>Le titre est un peu racoleur je vous l’accorde mais l’objectif de ce billet est plutôt de se familiariser avec 3 façons de faire du RIA et de les comparer au travers d’un composant central d’une application : le grid.<br />
Je me suis donc employé à recréer un écran simple contenant un label, un bouton et un grid.<br />
<span id="more-177"></span><br />
<a href='http://www.itaware.eu/wp-content/uploads/2008/05/ecran.jpg' title='flexExtGwt'><img src='http://www.itaware.eu/wp-content/uploads/2008/05/ecran.jpg' alt='flexExtGwt' /></a></p>
<p>En cliquant sur le bouton on charge dans le grid un nombre variable d’enregistrements et on affiche dans le label le temps nécessaire en secondes pour ce chargement. Le test à été réalisé avec 10, 50, 100, 500 et 1000 enregistrements.<br />
Les temps sont mesurés à la fois dans Internet Explorer 7 et dans Firefox.<br />
Dans un souci de transparence j’ai également effectué les mesures avec <a href="http://rialto.improve-technologies.com/wiki/">Rialto</a>.</p>
<p><strong>FLEX</strong></p>
<p>J’ai tout d’abord essayé l’environnement d’Adobe.  Après s’être créé un compte, il faut télécharger et installer <a href="http://www.adobe.com/products/flex/">Flex Builder 3</a><br />
Ensuite tout est assez intuitif de la création de projet, à l’exécution de notre fichier mxml de test. </p>
<pre><code>
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"&gt;
	&lt;mx:Script&gt;
        &lt;![CDATA[
            import mx.collections.ArrayCollection;
            import mx.rpc.events.ResultEvent;			     
		    [Bindable]
		    private var gamesData:ArrayCollection; 
			private function initDataGridData():void
			{
			  var gamesData:ArrayCollection = new ArrayCollection();
			  var date=new Date();
			  var start = date.getTime();
				for (var i=0;i&lt;10;i++){
			  		gamesData.addItem({ID: i, Data1: start, Data2: "Data2"});
			  	}
                                grid.dataProvider = gamesData;
				date = new Date;
				var end = date.getTime();
				var sec = (end-start)/1000;
				lab.text="Load in:"+sec; 
			}
         ]]&gt;
    &lt;/mx:Script&gt;
 	&lt;mx:Button y="10" x="400" click="initDataGridData()" label="load"/&gt;
     &lt;mx:Label x="490" y="10" id="lab"
      text="Wait:"
      fontSize="16" fontWeight="bold"/&gt;
    &lt;mx:DataGrid id="grid" x="10" y="5"  
      width="300" height="250" selectedIndex="0"&gt;
      &lt;mx:columns&gt;
        &lt;mx:DataGridColumn dataField="ID" headerText="ID" width="100"/&gt;
        &lt;mx:DataGridColumn dataField="Data1" headerText="Data1" width="100"/&gt;
        &lt;mx:DataGridColumn dataField="Data2" headerText="Data2" width="100"/&gt;
      &lt;/mx:columns&gt;
    &lt;/mx:DataGrid&gt;
&lt;/mx:Application&gt;
</code></pre>
<p><a href="http://livedocs.adobe.com/flex/2/langref/mx/controls/DataGrid.html">La documentation</a> est assez claire.<br />
Avec Flex le rechargement du Grid se fait en modifiant la propriété <strong>dataProvider</strong> du composant.</p>
<p><code>grid.dataProvider = gamesData</code></p>
<p><strong>Ext js</strong></p>
<p>Pour réaliser les test dans un environnement javascript j’ai opté pour la librairie la plus en vue du moment (en bien et en mal <img src='http://www.itaware.eu/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  )<br />
J’ai utilisé <a href="http://extjs.com/">Ext 2.0.2</a>. Je trouve la prise en main un peu plus « compliquée ». Il faut un fichier HMTL qui contient les inclusions des différents fichiers js et css nécessaires à Ext. Puis on crée un fichier javascript contenant le code de notre application.</p>
<pre>
Ext.onReady(function() {
	 var oData=new Array;
	 for (var i=0;i<1000;i++){
  		oData.push([i,"data1","data2"]);
  	}

	 Ext.get('myButton').on('click', function(){
       var date = new Date;
		start = date.getTime();
		var d =new Ext.data.Store({data:oData,reader: myReader});
		grid.reconfigure(d,grid.getColumnModel());
		date = new Date;
		end = date.getTime();
		var sec = (end-start)/1000;
	    var myDiv = Ext.get('lab');
	    myDiv.dom.innerHTML="Load in: "+sec;
    });

	var myData = [['','','','']];

	var myReader = new Ext.data.ArrayReader({}, [
		{name: 'id'},
		{name: 'd1'},
		{name: 'd2'}
	]);

	var grid = new Ext.grid.GridPanel({
		store: new Ext.data.Store({
			data: myData,
			reader: myReader
		}),
		columns: [
			{header: 'ID', width: 100, sortable: true, dataIndex: 'id'},
			{header: 'Data1', width: 100, sortable: true, dataIndex: 'd1'},
			{header: 'Data2', width: 100, sortable: true, dataIndex: 'd2'}
		],
		viewConfig: {
			forceFit: false
		},
		renderTo: 'content',
		title: 'My First Grid',
		width: 300,
		height: 300,
		frame: true
	});

	grid.getSelectionModel().selectFirstRow();
});
</pre>
<p><a href="http://extjs.com/deploy/dev/docs/?class=Ext.grid.GridPanel">La documentation</a> est très bien faite et on sent la richesse du composant. Par contre pour une utilisation simple le code devient lourd à manipuler.</p>
<p>Le rechargement du Grid se fait en modifiant l’objet <strong>Store</strong> et en appelant la méthode <strong>reconfigure</strong></p>
<pre>var d =new Ext.data.Store({data:oData,reader: myReader});
grid.reconfigure(d,grid.getColumnModel());
</pre>
<p><strong>GWT-Ext</strong></p>
<p>Au départ je voulais tester l’environnement GWT uniquement mais le composant Grid natif est trop simple et s’apparente plus à un simple tableau HTML. J’ai donc testé le composant Grid dans le wrapping <a href="http://gwt-ext.com/">GWT-Ext</a>. Le code ressemble donc beaucoup à celui indiqué ci-dessus.</p>
<pre>Panel panel = new Panel();
panel.setBorder(false);
panel.setPaddings(15);
lab=new Label("Load");
panel.add(lab);
Button but = new Button("Load", new ButtonListenerAdapter() {
public void onClick(Button button, EventObject e) {
		   Date now = new Date();
		   long start = now.getTime();
		   //treatment
		   Object[][] data = getData(1000);
		   MemoryProxy proxy = new MemoryProxy(data);
		   ArrayReader reader = new ArrayReader(recordDef);
		   Store store = new Store(proxy, reader);
		   store.load();
		   grid.reconfigure(store, columnModel);
		   now = new Date();
		   long end = now.getTime();
		   float sec = (new Float((end-start)).floatValue())/1000;
		   lab.setText("Load in: "+sec);
}
});  

panel.add (but);

recordDef = new RecordDef(
		 new FieldDef[]{
		 new StringFieldDef("id"),
		 new StringFieldDef("data1"),
		 new StringFieldDef("data2")
		 }
);  

		         grid = new GridPanel();  

		         Object[][] data =new Object[][]{new Object[]{"", "", ""}};
		         //Object[][] data= getData(1);
		         MemoryProxy proxy = new MemoryProxy(data);  

		         ArrayReader reader = new ArrayReader(recordDef);
		         Store store = new Store(proxy, reader);
		         store.load();
		         grid.setStore(store);  

		         ColumnConfig[] columns = new ColumnConfig[]{
		                 new ColumnConfig("ID", "id", 100),
		                 new ColumnConfig("Data 1", "data1", 100),
		                 new ColumnConfig("Data 2", "data2", 100)
		         };  

		         columnModel = new ColumnModel(columns);
		         grid.setColumnModel(columnModel);  

		         grid.setFrame(true);
		         grid.setStripeRows(true);
		         grid.setHeight(350);
		         grid.setWidth(600);
		         grid.setTitle("Array Grid");  

		         panel.add(grid);  

		         RootPanel.get().add(panel);
		     }  

		     private Object[][] getData(int numberElmt) {
		    	 Object[][] data =new Object[numberElmt][2];
		    	 for (int i=0;i<numberElmt;i++){
		    		 data[i]=new Object[]{i+"", "data1","data2"};
		    	 }
		    	 return data;
		     }
</pre>
<p>Le site officiel regroupe des informations utiles, un très beau <a href="http://www.gwt-ext.com/demo/">showroom </a>, <a href="http://www.gwt-ext.com/docs/2.0.3">la documentation de l'API</a><br />
Le principe de rechargement est bien sur le même qu’avec Ext js.</p>
<p><strong>RESULTATS</strong></p>
<p>Les temps sont indiqués en secondes.</p>
<p><a href='http://www.itaware.eu/wp-content/uploads/2008/05/results.jpg' title='results'><img src='http://www.itaware.eu/wp-content/uploads/2008/05/results.jpg' alt='results' /></a></p>
<p><a href='http://www.itaware.eu/wp-content/uploads/2008/05/graphe.jpg' title='graphe'><img src='http://www.itaware.eu/wp-content/uploads/2008/05/graphe.jpg' alt='graphe' /></a><br />
Sans surprise Flex offre des résultats largement au dessus des autres mais n’oublions pas que nous comparons un langage compilé avec un langage interprété (même GWT au final s’exécute en javascript). Je suis plutôt surpris des résultats affichés par GWT que je voyais moins bon. </p>
<p>On note, comme souvent, de meilleurs résultats dans firefox que dans IE.</p>
<p>En tout cas un test très intéressant à faire pour appréhender les nouveaux acteurs du RIA de demain.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.itaware.eu/2008/05/13/flex-vs-ajax-vs-gwt-sur-le-grid/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Les applications web asynchrones</title>
		<link>http://www.itaware.eu/2008/04/29/les-applications-web-asynchrones/</link>
		<comments>http://www.itaware.eu/2008/04/29/les-applications-web-asynchrones/#comments</comments>
		<pubDate>Tue, 29 Apr 2008 15:12:15 +0000</pubDate>
		<dc:creator>Sébastien Letélié</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Français]]></category>
		<category><![CDATA[RIA-RDA-RWA]]></category>

		<guid isPermaLink="false">http://www.itaware.eu/2008/04/29/les-applications-web-asynchrones/</guid>
		<description><![CDATA[C&#8217;est un fait les applications Web deviennent asynchrones. En effet l&#8217;arriv&#233;e d&#8217;AJAX &#224; permis d&#8217;en finir avec des temps de r&#233;ponse long due &#224; la vielle pratique du response-request loop pour charger une page enti&#232;re. Bien avant AJAX cette technique &#233;tait d&#233;j&#224; pratiqu&#233;e en utilisant une Applet cach&#233;e qui permettait d&#8217;acc&#232;der &#224; un MOM (Message [...]]]></description>
			<content:encoded><![CDATA[<p>C&#8217;est un fait les applications Web deviennent asynchrones. En effet l&#8217;arriv&#233;e d&#8217;AJAX &#224; permis d&#8217;en finir avec des temps de r&#233;ponse long due &#224; la vielle pratique du response-request loop pour charger une page enti&#232;re. Bien avant AJAX cette technique &#233;tait d&#233;j&#224; pratiqu&#233;e en utilisant une Applet cach&#233;e qui permettait d&#8217;acc&#232;der &#224; un MOM (Message Oriented Middleware). Le MOM ne serait il pas en train de s&#8217;imposer comme l&#8217;architecture d&#8217;&#233;change la plus appropri&#233;e des applications web ? </p>
<p><span id="more-172"></span></p>
<p>Je constate actuellement en tout cas que c&#8217;est une r&#233;ponse &#224; un besoin des applications web pour g&#233;rer diff&#233;rents aspects </p>
<ol>
<li>synchronisation, </li>
<li>temps de r&#233;ponse, </li>
<li>mode d&#233;connect&#233;, </li>
<li>assurance de l&#8217;acheminement des donn&#233;es. </li>
</ol>
<p>Actuellement le MOM est surtout utilis&#233; pour les deux premiers aspects et moins pour les deux suivants. La plupart du temps c&#8217;est un serveur d&#233;di&#233; &#224; cela vers lequel les messages sont transmis. Si ce serveur tombe ou que le r&#233;seau est coup&#233; en amont l&#8217;applicatif renvoi une erreur de transmission. C&#8217;est typiquement le cas dans <a href="http://www.adobe.com/products/livecycle/dataservices/">Life Cycle Data Service</a> : le mode messaging permet de synchroniser et d&#8217;am&#233;liorer les temps de r&#233;ponse, mais si on coupe le r&#233;seau les messages envoy&#233;s par le client sont perdus. Par ailleurs l&#8217;application que je d&#233;veloppe actuellement utilise Eclipse RCP pour embarquer une application Web qui communique aussi avec du messaging &#224; la diff&#233;rence que j&#8217;utilise une queue locale, qui m&#8217;assure l&#8217;acheminement de mon message. La solution s&#8217;appuie sur <a href="http://www-306.ibm.com/software/integration/wmq/">MQSeries</a> et <a href="http://www.ibm.com/software/integration/wmqe/">MQ Everyplace</a> d&#8217;IBM et la mise en place est complexe mais elle r&#233;pond aux 4 aspects. Pour que <a href="http://www.adobe.com/products/livecycle/dataservices/">Life Cycle Data Services</a> puisse faire la m&#234;me chose et ainsi proposer des applications mobiles adapt&#233;es il faut faire &#233;voluer le Flash Player pour permettre au d&#233;veloppeur d&#8217;utiliser une queue locale. </p>
<p>Est-ce la fin d&#8217;HTTP ? La est l&#8217;inconv&#233;nient d&#8217;une architecture asynchrone car l&#8217;int&#233;r&#234;t d&#8217;HTTP est de passer les firewall et l&#8217;utilisation d&#8217;un autre protocole bride la diffusion d&#8217;une application web. Qu&#8217;a cela ne tienne il suffit d&#8217;exploiter le protocole HTTP avec du MQ ce qui se fait d&#233;j&#224;.</p>
<p>N&#8217;oublions cependant pas que ce mod&#232;le implique que l&#8217;utilisateur ne soit pas d&#233;pendant de la r&#233;ponse, or la plupart des requ&#234;tes le sont. D&#8217;o&#249; la n&#233;cessit&#233; d&#8217;une base de donn&#233;e locale permettant le mode d&#233;connect&#233;. Les &#233;changes client / serveur &#233;tant alors r&#233;duit &#224; une synchronisation de base de donn&#233;es &#224; base de donn&#233;es. Cela ne devient il pas trop lourd en terme de d&#233;ploiement et de gestion ? pas vraiment car les bases de donn&#233;es embarqu&#233;es existent d&#233;j&#224; (<a href="http://developers.sun.com/javadb/">Java DB</a> via Java Plugin, <a href="http://www.sqlite.org/">SQLite</a> via <a href="http://gears.google.com/">Google Gears</a>) . Oui mais qu&#8217;en est il du chargement de la base de donn&#233;es ? En effet il faut bien initialiser cette base au moins une premi&#232;re fois ce qui peut prendre du temps mais tout d&#233;pend du besoin attendu.</p>
<p><a href="http://www.itaware.eu/wp-content/uploads/2008/04/internet-asynchrone1.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="224" alt="internet_asynchrone" src="http://www.itaware.eu/wp-content/uploads/2008/04/internet-asynchrone-thumb1.png" width="370" align="right" border="0" /></a> </p>
<p>Cette architecture repr&#233;sent&#233;e dans le sch&#233;ma ci-contre est s&#251;rement l&#8217;id&#233;ale pour certains types d&#8217;applications Web n&#233;cessitant une autonomie. Elle est encore difficile &#224; mettre en place car elle demande un param&#232;trage lourd et les outils ne sont pas intuitifs. A terme cela devrait devenir compl&#232;tement masqu&#233; au d&#233;veloppeur qui utiliserait des m&#233;thodes send/receive sans se pr&#233;occuper du reste. Les solutions sont la car le messaging est une technologie &#233;prouv&#233;e, il nous manque juste un outil ou un framework permettant la mise en place d&#8217;une telle architecture d&#8217;une mani&#232;re simple.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.itaware.eu/2008/04/29/les-applications-web-asynchrones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>eXo Platform Enterprise Suite</title>
		<link>http://www.itaware.eu/2008/04/20/exo-platform-enterprise-suite/</link>
		<comments>http://www.itaware.eu/2008/04/20/exo-platform-enterprise-suite/#comments</comments>
		<pubDate>Sun, 20 Apr 2008 09:37:13 +0000</pubDate>
		<dc:creator>Sébastien Letélié</dc:creator>
				<category><![CDATA[Français]]></category>
		<category><![CDATA[RIA-RDA-RWA]]></category>

		<guid isPermaLink="false">http://www.itaware.eu/2008/04/20/exo-platform-enterprise-suite/</guid>
		<description><![CDATA[C&#8217;est avec plaisir que j&#8217;ai pu assister &#224; la pr&#233;sentation de la derni&#232;re gamme de produit pour l&#8217;entreprise du portail eXo platform. Benjamin Mestrallet et Francois Moron ont r&#233;ussi &#224; r&#233;unir des personnes de qualit&#233; que m&#234;me les plus grands aimeraient avoir pour leur pr&#233;sentations. Apr&#232;s un bref historique de eXo platform Benjamin &#224; pr&#233;senter [...]]]></description>
			<content:encoded><![CDATA[<p>C&#8217;est avec plaisir que j&#8217;ai pu assister &#224; la pr&#233;sentation de la derni&#232;re gamme de produit pour l&#8217;entreprise du portail <a href="http://www.exoplatform.com" target="_blank">eXo platform</a>. Benjamin Mestrallet et Francois Moron ont r&#233;ussi &#224; r&#233;unir des personnes de qualit&#233; que m&#234;me les plus grands aimeraient avoir pour leur pr&#233;sentations. Apr&#232;s un bref historique de eXo platform Benjamin &#224; pr&#233;senter les 4 produits entreprises :</p>
<ul>
<li>ECM </li>
<li>Collaboration Suite (mail, contact, calendrier) </li>
<li>Live room (video conference) </li>
<li>Forum / Faq </li>
</ul>
<p><span id="more-163"></span></p>
<ul></ul>
<p>Il s&#8217;en est suivi 2 pr&#233;sentations de projet utilisant eXo platform :</p>
<ul>
<li>intranet d&#8217;M6 </li>
<li>intranet du Minist&#232;re des finances belge </li>
</ul>
<p>Tous deux content du choix et confiant pour la suite (les deux projets n&#8217;&#233;tant pas encore compl&#232;tement termin&#233;s). La plate-forme s&#8217;appuie sur les standards et offre un framework personnalisable et &#233;volutif.</p>
<p>En deuxi&#232;me partie une <a href="http://blog.exoplatform.org/2008/04/19/exo-webos-launch-party-the-round-table-video-with-adobe-exo-google-mozilla-microsoft-and-sun-microsystems/" target="_blank">table ronde</a> &#233;tait organis&#233;e avec</p>
<ul>
<li><a href="http://standblog.org/blog/" target="_blank">Tristan Nitot</a>, Mozilla, </li>
<li><a href="http://blogs.msdn.com/clauer/" target="_blank">Christophe Lauer</a> (Microsoft) </li>
<li>Eric Mahe (Sun Microsystems) </li>
<li><a href="http://googleenterprise.blogspot.com/" target="_blank">Dave Armstrong</a> (Google) </li>
<li><a href="http://blog.exoplatform.org/" target="_blank">Benjamin Mestrallet</a> (eXo Platform) </li>
<li><a href="http://codemoiunmouton.wordpress.com/" target="_blank">Micka&#235;l Chaize</a> (Adobe) </li>
</ul>
<p>Des questions sur qu&#8217;est-ce qu&#8217;une application Web aujourd&#8217;hui, sur l&#8217;approche SaaS (qui s&#8217;incrit bien dans le portail), sur le comment g&#233;rer le mode &quot;offline&quot;, sur l&#8217;interface riche et l&#8217;exp&#233;rience utilisateur. Tristan insiste sur les standards et il a raison et vanne Microsoft tant qu&#8217;il peut ce que je trouve vraiment d&#233;pass&#233; et souvent infond&#233;. Microsoft a depuis un moment d&#233;j&#224; une d&#233;marche d&#8217;ouverture et offre une vrai capacit&#233; d&#8217;interop&#233;rabilit&#233; aujourd&#8217;hui avec WCF. C&#8217;est ce que confirme Julien Cordoniou sans oublier de pr&#233;senter l&#8217;offre S+S. Dave Armstrong montre bien que l&#8217;approche de Google est d&#8217;offrir avec leur outils en ligne la capacit&#233; au plus petits de faire des choses comme les plus grands. Eric Mahe reste sceptique et insiste sur la qualit&#233;, j&#8217;adh&#232;re et je pense que Java a encore de beaux jours &#224; vivre gr&#226;ce notamment &#224; cette vision. Micka&#235;l Chaize confirme la vision que j&#8217;ai de la politique d&#8217;Adobe et met en avant l&#8217;approche &#233;diteur et collaboration designer/d&#233;veloppeur qui leur donne aujourd&#8217;hui une notori&#233;t&#233; &#224; part enti&#232;re. </p>
<p>Tristan Nitot as t il raison de dire que la notion de plugin dans le navigateur est une erreur ? J&#8217;aimerais aussi qu&#8217;il y ait des standards mais les utilisateurs n&#8217;attendront pas 10 ans. La vision Microsoft / Adobe / Sun de dire que le navigateur est le point d&#8217;entr&#233;e des applications riches mais qu&#8217;il n&#8217;a pas vocation &#224; les contenir toutes est plus appropri&#233;. Le SaaS a encore beaucoup &#224; faire pour r&#233;pondre aux probl&#233;matiques de s&#233;curit&#233; et d&#8217;h&#233;bergement de donn&#233;es sensibles. Le portail a d&#233;j&#224; fait du chemin dans le monde de l&#8217;entreprise et IBM en a pris une bonne part avec Websphere Portal Server avec beaucoup de d&#233;boires. D&#8217;ailleurs cela aurait &#233;t&#233; bien que IBM soit repr&#233;sent&#233; aussi, dommage.</p>
<p>Le WebOS est une solution d&#8217;avenir mais &#224; long terme, car la gestion de l&#8217;existant doit passer par une refonte si elle veut s&#8217;int&#233;grer &#224; un tel portail, ce qui n&#8217;est pas dans les moyens de tout le monde. Quant &#224; ma question sur la capacit&#233; d&#8217;int&#233;grer les p&#233;riph&#233;riques locaux (port serie, USB, bluetooth) la c&#8217;est &quot;joker&quot; pour tout le monde, comme si le besoin n&#8217;avait pas &#233;t&#233; identifi&#233;. Pourtant l&#8217;entreprise suite propose un carnet de contact il serait donc int&#233;ressant de pouvoir d&#233;clencher l&#8217;appel sur son portable ou son fixe par un clic ou de r&#233;cup&#233;rer des informations sur le carnet de contact et l&#8217;agenda de son t&#233;l&#233;phone. </p>
<p>C&#8217;est int&#233;ressant et enrichissant de voire se confronter des sp&#233;cialistes technologiques, mais j&#8217;ai parfois l&#8217;impression que le besoin utilisateur n&#8217;est pas le moteur des r&#233;flexions et qu&#8217;il se perd parfois pour laisser place &#224; nos visions. Je pense qu&#8217;il est indispensable pour nous les experts technologiques de ne jamais perdre le contact avec l&#8217;utilisateur. Pour ma part j&#8217;appr&#233;cie tous les jours de travailler en direct avec des m&#233;decins qui me font bien comprendre que ma passion pour les technologies doit me permettre de r&#233;pondre &#224; leurs attentes. Le client riche n&#8217;est que le r&#233;sultat de ce manque. Nous ne devons pas oublier que nous sommes aux services de leurs r&#234;ves pas des n&#244;tres.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.itaware.eu/2008/04/20/exo-platform-enterprise-suite/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Xebia mise sur Flex&#8230;</title>
		<link>http://www.itaware.eu/2008/04/18/xebia-mise-sur-flex/</link>
		<comments>http://www.itaware.eu/2008/04/18/xebia-mise-sur-flex/#comments</comments>
		<pubDate>Fri, 18 Apr 2008 12:18:03 +0000</pubDate>
		<dc:creator>Cyril Balit</dc:creator>
				<category><![CDATA[RIA-RDA-RWA]]></category>

		<guid isPermaLink="false">http://www.itaware.eu/2008/04/18/xebia-mise-sur-flex/</guid>
		<description><![CDATA[Vous pouvez retrouvez sur TV4IT une interview de Guillaume Bodet (DT de Xebia) pour un premier retour d&#8217;expérience sur Flex vs Ajax. Malgré mon attachement naturel vers les technologies Ajax je regarde vraiment de très prêt l&#8217;offre Adobe et j&#8217;avoue : je suis séduit&#8230;.Je pense publier quelques billets bientôt sur ce sujet. Je nuancerais juste [...]]]></description>
			<content:encoded><![CDATA[<p>Vous pouvez retrouvez <a href="http://www.tv4it.net/BackOffice/tabid/770/ctl/newsletterlink/mid/1402/itemId/4236/directopen/False/Default.aspx">sur TV4IT</a> une interview de Guillaume Bodet (DT de Xebia) pour un premier retour d&#8217;expérience sur Flex vs Ajax. Malgré mon attachement naturel vers les technologies Ajax je regarde vraiment de très prêt l&#8217;offre Adobe et j&#8217;avoue : <strong>je suis séduit</strong>&#8230;.Je pense publier quelques billets bientôt sur ce sujet. Je nuancerais juste un peu les propos de Guillaume Bodet sur l&#8217;avenir d&#8217;ajax. Là ou il voit une &laquo;&nbsp;technologie transitoire&nbsp;&raquo; je préfère penser que les technos Ajax deviendront le standart minimum pour développer une application web. Je pense qu&#8217;Ajax (j&#8217;aime pas cet acronyme qui veut tout  et rien dire à la fois) a donc encore de beaux jours devant lui mais il faut  absolument commencer à s&#8217;immerger dans l&#8217;environnement d&#8217; Adobe.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.itaware.eu/2008/04/18/xebia-mise-sur-flex/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

