ATTENTION : Tutorial en cours d'écriture ! N'hésitez pas à nous signaler toute erreur ou suggestion.
Accès rapide : Les différentes stratégies de placement Exemple d'utilisation de stratégies de placement
Comme vous l'avez déjà remarqué, le modèle objet de la librairie JWT (Javascript Widget Toolkit) s'inspire fortement de la librairie Java Swing. Il en va de même pour la logique de positionnement des composants dans les conteneurs JWT : des layouts (stratégies de placement) peuvent être injectés dans un conteneur pour contrôler le positionnement de ses composants. De même que Java, plusieurs classes de layout vous sont proposées : elles dérivent toutes de la classe corelib.services.web.javascript.jwt.LayoutManager.
corelib.services.web.javascript.jwt.LayoutManager
Dans l'état actuel des choses, trois stratégies de placement vous sont proposées : la stratégie FlowLayout, la stratégie VerticalLayout et la stratégie BorderLayout. Reprenons une à une ces différentes stratégies de placement.
FlowLayout
VerticalLayout
BorderLayout
corelib.services.web.javascript.jwt.FlowLayout : cette stratégie cherche à positionner les éléments les uns derrière les autres horizontalement. S'il n'y a plus de place dans le conteneur, les éléments suivants seront placés sur les lignes suivantes. Cette stratégie cherche à retailler les éléments à leur taille la plus petite possible. Enfin, notez que les élements, d'une même ligne, peuvent être alignés à gauche, centrés ou bien alignés à droite. Cette stratégie est notamment utilisée pour produire des barres de menu horinzontales. Note : ce layout existe quasiment à l'identique en Java (AWT(Abstract Widget Toolkit) et Swing).
corelib.services.web.javascript.jwt.FlowLayout
corelib.services.web.javascript.jwt.VerticalLayout : cette stratégie positionne les éléments les uns en dessous des autres. Elle est notamment utilisée pour produire des barres de menu verticales.
corelib.services.web.javascript.jwt.VerticalLayout
corelib.services.web.javascript.jwt.BorderLayout : cette stratégie divise l'espace du conteneur en cinq zones. Ces cinq zones sont positionnées ainsi : une au nord du conteneur, une à l'ouest, une au centre, une à l'est et enfin une au sud. Si les zones périphériques ne sont pas utilisés pour contenir un composant, alors leur surface est réduite à zéro pixel. Ainsi, si seul un composant est placé au centre du conteneur, il prendra alors 100% de sa superficie. Elle est notamment utilisée pour placer les onglets et les composants constitutifs d'un composant TabbedPane. Note : ce layout existe quasiment à l'identique en Java (AWT(Abstract Widget Toolkit) et Swing). Voici un exemple qui montre le découpage des cinq zones précédemment citées.
corelib.services.web.javascript.jwt.BorderLayout
TabbedPane
Afin de mieux comprendre la notion de layouts (de stratégies de placement), je vous propose d'étudier un petit exemple permettant, à chaud, de changer la stratégie de placement utilisée par un conteneur. Pour sélectionner la stratégie à appliquer, nous utiliserons une barre de menu JWT. Voici d'abord le code de la WebPage : celui-ci définit notamment un tag div qui servira à placer le conteneur JWT nécessaire à notre démonstration.
div
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
<html> <head> <title>Layout Manager Sample</title> <script language="Javascript" src="corelib/services/web/javascript/Core.js"> </script> <script language="Javascript" src="LayoutManagers.js"> </script> <link rel="stylesheet" type="text/css" href="corelib/services/web/javascript/jwt/Jwt.css" /> </head> <body> <h1>Layout Manager Sample</h1> <br /> <center> <div id="forMenuBar"></div> <div id="forPanel"></div> </center> </body> </html>
Ensuite il nous faut générer notre conteneur et les composants qui le constituent. Notez que cet exemple utilise plusieurs type de composants JWT et vous montre même comment définir une nouvelle classe de boutons. Lors de l'injection des composants dans le conteneur, via la méthode add, un second paramètre est utilisé : il s'agit de la contrainte de positionnement. Dans cet exemple, les contraintes ne sont utilisées qu'avec la stratégie de placement de type BorderLayout.
add
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
importPackage( "corelib/services/web/javascript/jwt/FlowLayout.js" ); importPackage( "corelib/services/web/javascript/jwt/VerticalLayout.js" ); importPackage( "corelib/services/web/javascript/jwt/BorderLayout.js" ); importPackage( "corelib/services/web/javascript/jwt/Panel.js" ); importPackage( "corelib/services/web/javascript/jwt/DatePicker.js" ); importPackage( "corelib/services/web/javascript/jwt/ProgressBar.js" ); var MyButton = Component.extendClass( { initialize : function( text ) { this._htmlTagName = "input"; Component.prototype.initialize.call( this ); this.htmlTag.value = text; this.htmlTag.type = "button"; } } ); var panel = null; addEventHandler( window, "onload", function() { panel = new Panel( new BorderLayout() ); // \/ Only for BorderLayout panel.add( new DatePicker(), BorderLayout.NORTH ); panel.add( new MyButton( "Push me !" ), BorderLayout.WEST ); panel.add( new MyButton( "Pince me !" ), BorderLayout.CENTER ); panel.add( new MyButton( "Bidule me !" ), BorderLayout.EAST ); panel.add( new ProgressBar( 75 ), BorderLayout.SOUTH ); panel.setCssStyle( "width:500px; height: 120px;" ); panel.injectInDocument( document.getElementById( "forPanel" ) ); } );
Enfin, il faut gérer le changement de stratégie de positionnement : pour ce faire, nous allons définir une barre de menu avec les trois stratégies proposées précédemment. Le clic sur un des éléments du menu changera la stratégie utilisée. Voici le code Javscript final à fournir. Vous trouverez, immédiatement en dessous de l'extrait de code, le résultat produit par ce code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
importPackage( "corelib/services/web/javascript/jwt/FlowLayout.js" ); importPackage( "corelib/services/web/javascript/jwt/VerticalLayout.js" ); importPackage( "corelib/services/web/javascript/jwt/BorderLayout.js" ); importPackage( "corelib/services/web/javascript/jwt/Panel.js" ); importPackage( "corelib/services/web/javascript/jwt/DatePicker.js" ); importPackage( "corelib/services/web/javascript/jwt/MenuBar.js" ); importPackage( "corelib/services/web/javascript/jwt/Menu.js" ); importPackage( "corelib/services/web/javascript/jwt/MenuItem.js" ); var MyButton = Component.extendClass( { initialize : function( text ) { this._htmlTagName = "input"; Component.prototype.initialize.call( this ); this.htmlTag.value = text; this.htmlTag.type = "button"; } } ); var menuBar = null, panel = null; addEventHandler( window, "onload", function() { panel = new Panel( new BorderLayout() ); // \/ Only for BorderLayout panel.add( new DatePicker(), BorderLayout.NORTH ); panel.add( new MyButton( "Push me !" ), BorderLayout.WEST ); panel.add( new MyButton( "Pince me !" ), BorderLayout.CENTER ); panel.add( new MyButton( "Bidule me !" ), BorderLayout.EAST ); panel.add( new DatePicker( 75 ), BorderLayout.SOUTH ); panel.setCssStyle( "width:500px; height: 120px;" ); panel.injectInDocument( document.getElementById( "forPanel" ) ); menuBar = new MenuBar(); var layoutMenu = new Menu( "Layout Managers" ); var flowLayoutMenuItem = new MenuItem( "FlowLayout", "javascript: panel.setLayout( new FlowLayout( FlowLayout.CENTER ) );" ); layoutMenu.add( flowLayoutMenuItem ); var verticalLayoutMenuItem = new MenuItem( "VerticalLayout", "javascript: panel.setLayout( new VerticalLayout() );" ); layoutMenu.add( verticalLayoutMenuItem ); var borderLayoutMenuItem = new MenuItem( "BorderLayout", "javascript: panel.setLayout( new BorderLayout() );" ); layoutMenu.add( borderLayoutMenuItem ); menuBar.add( layoutMenu ); menuBar.setCssStyle( "width:500px; height: 24px;" ); menuBar.injectInDocument( document.getElementById( "forMenuBar" ) ); } );
Dominique LIARD - © 2007..2010 SARL Infini Software - Tous droits réservés Les autres marques et les noms de produits cités dans ces documents sont la propriété de leurs détenteurs respectifs.