Développement de clientsriches : Plateforme Eclipse            Chapitre 2 : Boîtes à outils        (SWT) - Standard Widget...
Licence                                   Creative Commons                                       Contrat Paternité        ...
Organisation du cours sur la boîte à outils SWT                        Evolution des boîtes à outils pour Java            ...
Evolution des boîtes à outils Java                        La bibliothèque AWT (Abstract Window Toolkit)                   ...
Evolution des boîtes à outils Java                        La bibliothèque Swing                            BAO considérée ...
Boîte à outils SWT                        SWT : Standard Widget Toolkit                        Bibliothèque développée par...
Boîte à outils SWT                        SWT fournit des techniques d’implémentation de bas niveau                       ...
Comparaison Swing/SWT                        Performance : même si SWT s’appuie sur des composants                        ...
Comparaison Swing/SWT (suite)                        Look : SWT ne permet pas de modifier l’apparence des                 ...
SWT : les ressources …                        Le site de la fondation Eclipse                           La page d’accueil ...
Principaux composants graphiques de SWT                        Fenêtres                          Les fenêtres de base et l...
Exemple : le compteur file rouge                        Le compteur …                          Un bouton et un entier sont...
Le compteur : structure des composants                        La fenêtre                          Classe : Shell          ...
Le compteur : implémentation                        Étapes de développement                                               ...
Le compteur : résultat de l’affichage …                        Le résultat n’est pas celui espéré …                       ...
Placement d’un composant dans un conteneur                        Une IHM en Java peut avoir plusieurs apparences         ...
Le compteur : utilisation d’un RowLayout                        Les composants sont placés par le RowLayout               ...
Le compteur : utilisation d’un FillLayout                            Les composants sont placés par le FillLayout         ...
Réalisation classique d’une interface graphique                        Étapes de la réalisation sans gestion des événement...
Conception d’une interface graphique complexe                        Hiérarchisation des composants en arbre de conteneurs...
Conception d’une interface graphique complexe                           Décomposition des composants de l’application     ...
Des composants réutilisables                         Exemple : création d’un composant avec du texte un champ             ...
Des composants réutilisables                        Exemple (suite) : création d’un composant personnalisé                ...
Des concepts de base                        SWT utilise des ressources du système d’exploitation                        To...
Des concepts de base                         Règle 2 : « disposing the parent, dispose the children »                     ...
Le Display                        Rôle et caractéristiques de la classe Display                           Effectue la conn...
Le Display                        La fonction principale de l’objet Display est la gestion de la                        bo...
Erreurs et Exceptions                        SWT distingue trois types d’exceptions                        SWTError       ...
La hiérarchie des packages SWT                        org.eclipse.swt :     package de base qui contient la définition des...
La hiérarchie des packages SWT                        org.clipse.swt.graphics : ensemble de classes pour le graphique     ...
La hiérarchie des composants SWT                        Hiérarchie des principaux composants                              ...
La hiérarchie des composants SWT                        La classe Widget est la classe de plus haut niveau pour les       ...
La classe Widget                        La classe Widget est la classe de plus haut niveau de la                        hi...
La classe Control                        La classe Control dérive de la classe Widget et chaque objet                     ...
Galerie des composants : conteneurs                        Shell                                              Composite   ...
Galerie des composants : conteneurs (suite)                                            Table                              ...
Galerie des composants : contrôle                                                                                  Button ...
Galerie des composants : contrôle (suite)                               Slider                                            ...
Galerie des composants : les autres                                          Menukeulkeul.blogspot.com                    ...
Les conteneurs de SWT : Shell                        Shell permet la création d’une fenêtre (équivalent à la              ...
Les conteneurs de SWT : Shell                        Les styles d’une fenêtre (constantes de la classe SWT)               ...
Les conteneurs de SWT : Shell                                                   SHELL_TRIM                                ...
Les conteneurs de SWT : Composite                        La classe Composite s’occupe de la gestion des conteneurs        ...
Les conteneurs de SWT : Composite                        Un conteneur gère l’agencement des composants par un             ...
Les conteneurs de SWT : Group                         Le conteneur Group est similaire à la classe Composite, il          ...
Les conteneurs de SWT : ToolBar                        ToolBar permet d’ajouter une barre d’outils en contenant un        ...
Les conteneurs de SWT : ToolBar                        Différentes méthodes pour ToolItem                           setCon...
Les conteneurs de SWT : ToolBar                            Exemple : une barre d’outils …                        public cl...
Les conteneurs de SWT : CoolBar                        La CoolBar fonctionne sur le même principe que la ToolBar à        ...
Les composants de contrôle : Button                        La classe Button représente un bouton cliquable                ...
Les composants de contrôle : Button                         Exemple : un ensemble de boutons                        public...
Les composants de contrôle : Label et Text                           La classe Label permet d’afficher un texte ou une ima...
L’art de placer les composants SWT                        Les agents de placement ou Layout Manager                       ...
Les agents de placement et les composants                        Les agents de placement permettent d’agencer les widgets ...
Les agents de placement : FillLayout                        Affiche horizontalement ou verticalement les composants les   ...
Les agents de placement : RowLayout                        Affiche horizontalement ou verticalement les composants les    ...
Les agents de placement : RowLayout                        RowLayout peut être paramétré après sa construction            ...
Les agents de placement : RowLayout                          Exemple : un ensemble de boutons                        RowLa...
Les agents de placement : GridLayout                        L’agent de placement GridLayout est un des plus expressif et  ...
Les agents de placement : GridLayout                        GridLayout peut être paramétré après sa construction          ...
Les agents de placement : GridLayout                        GridData peut être paramétré après sa construction            ...
Les agents de placement : GridLayout                          Exemple : un ensemble de boutons                        Grid...
Les agents de placement : FormLayout                        L’agent de placement FormLayout organise les Control en       ...
Les agents de placement : FormLayout                        FormAttachment définit comment les composants sont            ...
Les agents de placement : FormLayout                        Attributs d’un FormAttachment                          int ali...
Les agents de placement : FormLayout                            Exemple (EP 1) : FormLayout sans FormAttachment           ...
Les agents de placement : FormLayout                          Exemple (EP 2) : FormLayout avec FormAttachment             ...
Les agents de placement : FormLayout                            Exemple (EP 2) bis : FormLayout avec FormAttachment       ...
Les agents de placement : FormLayout                            Exemple (EP 2) bis : FormLayout avec FormAttachment       ...
Les agents de placement : FormLayout                        Exemple (EP 3) : FormLayout avec FormAttachment et            ...
Les agents de placement : StackLayout                        L’agent de placement StackLayout permet d’empiler des        ...
Les agents de placement : StackLayout                          Exemple : StackLayout et deux boutons                      ...
Les agents de placement : aucun …                        Ne pas utiliser d’agent de placement vous impose pour            ...
Les agents de placement : aucun …                        Exemple : sans agent de placement avec 2 boutons                 ...
Conception et programmation                        Affichage des informations vers l’utilisateur                          ...
Traitement des événements SWT                        Chaque composant de l’interface graphique peut émettre des           ...
Intérêt du traitement par abonnement                        Exemple d’un compteur qui incrémente et décrémente            ...
Intérêt du traitement par abonnement                        En quoi consiste l’abonnement ?                          Enreg...
Traitement des événements : les listeners non typés                        Les listeners non typés sont représentés par l’...
Traitement des événements : les listeners non typés                        Le type d’événement à considérer au cours de l’...
Traitement des événements : les listeners non typés                        La classe Event permet de définir le contenu de...
Traitement des événements : les listeners non typés                           Exemple : un bouton et des réactions        ...
Traitement des événements : les listeners typés                        Les listeners typés sont représentés par un ensembl...
keulkeul.blogspot.com   Traitement des événements : les listeners typés                                                   ...
keulkeul.blogspot.com   Traitement des événements : les listeners typés                                                   ...
Programmation du traitement                        Créer une source                          Instancier un composant (e.g....
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Introduction à la boîte à outils SWT : The Standard Widget Toolkit
Prochain SlideShare
Chargement dans…5
×

Introduction à la boîte à outils SWT : The Standard Widget Toolkit

12 681 vues

Publié le

Publié dans : Technologie
0 commentaire
2 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
12 681
Sur SlideShare
0
Issues des intégrations
0
Intégrations
3 266
Actions
Partages
0
Téléchargements
368
Commentaires
0
J’aime
2
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Introduction à la boîte à outils SWT : The Standard Widget Toolkit

  1. 1. Développement de clientsriches : Plateforme Eclipse Chapitre 2 : Boîtes à outils (SWT) - Standard Widget Toolkit Mickaël BARON - 2007 (Rév. Janvier 2009) mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr
  2. 2. Licence Creative Commons Contrat Paternité Partage des Conditions Initiales à lIdentique 2.0 Francekeulkeul.blogspot.com http://creativecommons.org/licenses/by-sa/2.0/fr SWT - M. Baron - Page 2
  3. 3. Organisation du cours sur la boîte à outils SWT Evolution des boîtes à outils pour Java Conteneurs Composants de type Control Agents de placement Gestion des événements Dessiner avec Graphical Contextkeulkeul.blogspot.com Les boîtes de dialogue (Message, Couleur, …) Les indispensables (appel SWT dans des Threads …) Co-habitation entre SWT et Swing SWT - M. Baron - Page 3
  4. 4. Evolution des boîtes à outils Java La bibliothèque AWT (Abstract Window Toolkit) BAO historique de Java depuis le JDK 1.0 mais toujours utilisable (souvent utilisée directement pour les Applets) Tous les composants sont implémentés à partir du sous-ensemble « portable » des composants natifs des systèmes hôtes (Heavyweight Component) L’affichage et le comportement de l’IHM sont fortement liés au système hôte Fournit un ensemble Application Java d’interface permettant aux Machine composants graphiques AWT virtuelle d’être représentés à l’écrankeulkeul.blogspot.com Peer Système graphique : X11, Windows, etc. Tracé graphique SWT - M. Baron - Page 4
  5. 5. Evolution des boîtes à outils Java La bibliothèque Swing BAO considérée comme standard en Java 2 Platform (depuis le JDK 2) Tous les composants sont implémentés directement sans faire appel aux composants natifs du système hôte (Lightweight Components) L’affichage et le comportement de l’IHM sont indépendants du système hôte et ne dépendent que du programmeur ou de l’utilisateur (Look and Feel) Application Java Machine AWTkeulkeul.blogspot.com virtuelle Swing Peer Système graphique : X11, Windows, etc. Tracé graphique SWT - M. Baron - Page 5
  6. 6. Boîte à outils SWT SWT : Standard Widget Toolkit Bibliothèque développée par IBM pour le projet Eclipse www.eclipse.org/articles/Article-SWT-Design-1/SWT-Design-1.html Distribuée librement pour le développement de plug-ins ou d’application stand-alone Fournit des composants de base (bouton, label, …) Fournit des composants plus complexes avec JFacekeulkeul.blogspot.com Fournit un modèle pour la gestion des événements identique à celui utilisé par AWT et Swing (abonnement) SWT - M. Baron - Page 6
  7. 7. Boîte à outils SWT SWT fournit des techniques d’implémentation de bas niveau SWT procure des composants graphiques natifs d’une manière indépendante de l’OS Combinaison de classes Java et JNI spécifiques à chaque plateforme JNI utilisé pour invoquer le système d’exploitation Application Java Machine SWT virtuellekeulkeul.blogspot.com SWT.dll, SWT.so, … Système graphique : X11, Windows, etc. Tracé graphique SWT - M. Baron - Page 7
  8. 8. Comparaison Swing/SWT Performance : même si SWT s’appuie sur des composants natifs il y a des cas particuliers où Swing est plus rapide Affichage de très grand nombre d’information : JTable Swing plus rapide qu’un TextViewer SWT/JFace Composants natifs = meilleure réactivité et rapidité de chargement Portabilité : avec SWT nécessité d’utiliser des bibliothèques natives alors que pour Swing aucune contraintekeulkeul.blogspot.com Pour SWT installation des bibliothèques Pour Swing déjà pré-installé SWT - M. Baron - Page 8
  9. 9. Comparaison Swing/SWT (suite) Look : SWT ne permet pas de modifier l’apparence des composants Pour SWT respect des habitudes de l’utilisateur Pour Swing possibilité de s’adapter à un type d’utilisateur (un look cartoon pour les enfants) Reproche à Swing son aspect non professionnel (à voir) Développement : SWT nécessite de libérer les ressources pas pour Swing Pour SWT de nombreux composants adapté (assistant par exemple)keulkeul.blogspot.com Swing n’est pas en reste avec les composants SwingLabs Pour Swing plus de documentations pour l’aide au développement Pour SWT moins d’exemples mais ça arrive … SWT - M. Baron - Page 9
  10. 10. SWT : les ressources … Le site de la fondation Eclipse La page d’accueil sur SWT (www.eclipse.org/swt) Un ensemble d’exemples (www.eclipse.org/swt/snippets) Des articles de la fondation Eclipse www.eclipse.org/articles/Article-SWT-images/graphics-resources.html www.eclipse.org/articles/Article-SWT-DND/DND-in-SWT.html www.eclipse.org/articles/Article-SWT-Design-1/SWT-Design-1.html et 2 Et pleins d’autres encore … Des supports de cours et des exempleskeulkeul.blogspot.com www.labo-sun.com/resource-fr-essentiels-903-0-java-gui-swt-creer-des-interfaces- graphiques-performantes.htm www.java2s.com/Code/Java/SWT-JFace-Eclipse/CatalogSWT-JFace-Eclipse.htm SWT - M. Baron - Page 10
  11. 11. Principaux composants graphiques de SWT Fenêtres Les fenêtres de base et les boîtes de dialogue Composants Les principaux composants d’interaction : boutons, menus, Tree, Table, Scale, … Les composants JFace apporteront une vision MVC des composants Conteneurs Composants spécifiques (parfois invisibles) qui servent à contenir des composants et/ou Conteneurskeulkeul.blogspot.com Les fenêtres sont des conteneurs Agents de placements Ce sont des objets qui servent à placer des composants dans un conteneur SWT - M. Baron - Page 11
  12. 12. Exemple : le compteur file rouge Le compteur … Un bouton et un entier sont affichés dans une fenêtre Lorsque l’utilisateur appuie sur le bouton, l’entier est incrémenté d’une unité puis affiché Fenêtre Composants graphiques visibles Bouton Une fenêtre principale Un bouton que l’utilisateur peut déclencher Une zone de texte non modifiable par l’utilisateurkeulkeul.blogspot.com Label Réaction aux actions de l’utilisateur L’événement « clic sur le bouton » doit incrémenter l’entier et l’afficher à nouveau SWT - M. Baron - Page 12
  13. 13. Le compteur : structure des composants La fenêtre Classe : Shell Composite Le contenu de la fenêtre myShell Shell La fenêtre est un conteneur de type Composite contient Permet d’y ajouter les autres composants myShell Le bouton et la zone de texte myButton myLabel Classes : Button et Label Ajoutés au conteneur pour pouvoir s’y afficherkeulkeul.blogspot.com … Le placement des composants n’est pas encore défini Détail plus tard … SWT - M. Baron - Page 13
  14. 14. Le compteur : implémentation Étapes de développement public class Compteur { Récupération du Display public Compteur() { Display display = new Display(); Shell myShell = new Shell(display); myShell.setText("Compteur"); Création de la fenêtre Button myButton = new Button(myShell,SWT.NONE); myButton.setText("i->i+1"); Label myLabel = new Label(myShell, SWT.CENTER); myLabel.setText("i = 0"); Création des composants myShell.pack(); myShell.open(); en les ajoutant à la fenêtre while(!myShell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } Dimensionnement de la } display.dispose(); Détail plus tard …keulkeul.blogspot.com public static void main (String args[]) { fenêtre (optionnel) } new Compteur(); } Affichage de la fenêtre Compteur.java du projet IntroExamples SWT - M. Baron - Page 14
  15. 15. Le compteur : résultat de l’affichage … Le résultat n’est pas celui espéré … Le placement des composants n’a pas été effectué Les composants ne sont pas visibles (ils le sont mais leur position etkeulkeul.blogspot.com leur taille sont nulles) Il manque un agent de placement de type Layout Par défaut il n’y a pas d’agent de placement (null) SWT - M. Baron - Page 15
  16. 16. Placement d’un composant dans un conteneur Une IHM en Java peut avoir plusieurs apparences La taille et le type de police varient Les composants possèdent différentes représentations Le placement des composants ne peut se faire de manière absolue Utilisation d’agents de placement : « Layout Manager » Un agent de placement est associé à un conteneur Par défaut il n’y a pas d’agent de placement (null) qui est utilisé dans les conteneurs L’agent de placement place les composants les uns par rapport aux autreskeulkeul.blogspot.com de la taille préférée de chacun des composants de la place disponible dans le conteneur de la politique de placement définie par l’agent de placement SWT - M. Baron - Page 16
  17. 17. Le compteur : utilisation d’un RowLayout Les composants sont placés par le RowLayout en respectant leur taille préférée de haut en bas la méthode pack() demande le placement automatique des composants Exemple : le compteur agencé avec RowLayout public class CompteurLayout { public CompteurLayout() { Display display = new Display(); Shell myShell = new Shell(display); myShell.setText("Compteur"); myShell.setLayout(new RowLayout(SWT.VERTICAL)); Button myButton = new Button(myShell,SWT.NONE); myButton.setText("i->i+1"); Label myLabel = new Label(myShell, SWT.CENTER); myLabel.setText("i = 0");keulkeul.blogspot.com Le placement est myShell.pack(); myShell.open(); correcte, il faudrait ... CompteurLayout.java du par contre agrandir } projet IntroExamples la taille du bouton public static void main (String args[]) { en fonction de la new CompteurLayout(); fenêtre } } SWT - M. Baron - Page 17
  18. 18. Le compteur : utilisation d’un FillLayout Les composants sont placés par le FillLayout de haut en bas (identique au RowLayout sans respect de la taille) tous les éléments ont la même ligne Exemple : le compteur agencé avec FillLayout public class CompteurLayout2 { public CompteurLayout2() { Display display = new Display(); Shell myShell = new Shell(display); myShell.setText("Compteur"); myShell.setLayout(new FillLayout(SWT.VERTICAL)); Button myButton = new Button(myShell,SWT.NONE); myButton.setText("i->i+1"); Label myLabel = new Label(myShell, SWT.CENTER); myLabel.setText("i = 0"); myShell.pack(); myShell.open(); while(!myShell.isDisposed()) {keulkeul.blogspot.com if (!display.readAndDispatch()) display.sleep(); } display.dispose(); CompteurLayout2.java du } projet IntroExamples public static void main (String args[]) { new CompteurLayout2(); } } SWT - M. Baron - Page 18
  19. 19. Réalisation classique d’une interface graphique Étapes de la réalisation sans gestion des événements Création d’une fenêtre avec un objet de type Shell Création d’un agent de placement et association au conteneur du Shell Création d’un composant Ajout du composant au conteneur Création d’un autre composant …keulkeul.blogspot.com Utilisez le plus possible des conteneurs pour placer correctement vos composants. C’est gratuit … SWT - M. Baron - Page 19
  20. 20. Conception d’une interface graphique complexe Hiérarchisation des composants en arbre de conteneurs Grouper les composants dans les conteneurs (Composite) avec une politique de placement grâce aux agents de placement Grouper de nouveaux les composants obtenus Ces composants peuvent être définis localement ou bien être des instances d’autres classes qui hériteraient de Compositekeulkeul.blogspot.com SWT - M. Baron - Page 20
  21. 21. Conception d’une interface graphique complexe Décomposition des composants de l’application Shell (GridLayout) haut Button (SWT.RADIO) sms Button Composite haut (SWT.RADIO) email (RowLayout) myText Text (SWT.MULTI) myTextkeulkeul.blogspot.com Button(SWT.PUSH) Composite bas annuler (FillLayout) Button(SWT.PUSH) valider bas SWT - M. Baron - Page 21
  22. 22. Des composants réutilisables Exemple : création d’un composant avec du texte un champ Création du texte avec la classe Label Création du champ avec la classe Text Placement dans un Composite Nouvelle classe LabelText hérite de Composite et pourra ainsi être utilisée comme composant dans une autre application public class CompositeWidgets extends Composite { public CompositeWidgets(Composite parent, String label, String textf) { super(parent, SWT.NONE); CompositeWidgets.java du GridLayout myGL = new GridLayout(2, false); projet IntroExamples this.setLayout(myGL); Label myLabel = new Label(this, SWT.NONE);keulkeul.blogspot.com myLabel.setText(label); Text myText = new Text(this,SWT.BORDER); myText.setText(textf); GridData myGD = new GridData(GridData.FILL_BOTH); myText.setLayoutData(myGD); } ... // Suite dans le prochain transparent } SWT - M. Baron - Page 22
  23. 23. Des composants réutilisables Exemple (suite) : création d’un composant personnalisé Création d’une fenêtre Shell Création d’une instance du LabelText et ajout au container de la Shell public class CompositeWidgets extends Composite { ... // Suite dans le précédent transparent public static void main(String[] argv) { Display display = new Display (); Shell shell = new Shell (display); shell.setLayout(new FillLayout(SWT.VERTICAL)); new LabelText(shell, "Saisissez le nom", ""); shell.pack (); shell.open (); while (!shell.isDisposed ()) { if (!display.readAndDispatch ()) display.sleep (); }keulkeul.blogspot.com display.dispose (); } } CompositeWidgets.java du projet IntroExamples SWT - M. Baron - Page 23
  24. 24. Des concepts de base SWT utilise des ressources du système d’exploitation Toutes ressources allouées se doivent d’être libérées www.eclipse.org/articles/Article-SWT-Design-1/SWT-Design-1.html Le garbage collector n’est pas capable de libérer la mémoire puisqu’il lui est impossible de connaître l’ordre de libération Règle 1 : « if you created it, you dispose it » Libération explicite des ressources graphiques Nécessité de libérer les ressources par la méthode dispose() Création d’un objet Font font = new Font (display, "Courier", 10, SWT.NORMAL); ... // Utilisation de l’objet fondkeulkeul.blogspot.com font.dispose(); Détruire les objets Font font = ref.getFont(); ... // Utilisation de l’objet fond Récupération Ne pas détruire les d’un objet objets SWT - M. Baron - Page 24
  25. 25. Des concepts de base Règle 2 : « disposing the parent, dispose the children » Un composant ne peut pas exister dans le système d’exploitation sans composant parent Création du conteneur obligatoirement avec le contenu Contrôle du cycle de vie via la relation parent-enfant exprimée via le constructeur Si le composant parent est libéré, les composants enfants seront automatiquement libérés public class Compteur { A la construction des public Compteur() { composants, obligation Display display = new Display(); Shell myShell = new Shell(display); d’indiquer le conteneurkeulkeul.blogspot.com myShell.setText("Compteur"); Button myButton = new Button(myShell,SWT.NONE); ... Les composants non } ... graphiques Font, Color, … } ne sont pas des enfants et devront être libérés … Si myShell libéré tous ces enfants le sont aussi SWT - M. Baron - Page 25
  26. 26. Le Display Rôle et caractéristiques de la classe Display Effectue la connexion entre l’application Java et le système d’exploitation hôte Fournit le mécanisme de traitement des événements Package : org.eclipse.swt.widgets.Display Quelques méthodes utiles de la classe Display static Display getCurrent() ou getDefault() : récupère un Display Rectangle getBounds() : récupère la taille de l’écran Color getSystemColor(String id) : effectue la relation entre les couleurskeulkeul.blogspot.com de SWT et du système boolean readAndDispatch() : transfert les événements du système à l’application, retourne vraie s’il y a encore des événements setCursorLocation(int x, int y) : déplace le pointeur de l’écran SWT - M. Baron - Page 26
  27. 27. Le Display La fonction principale de l’objet Display est la gestion de la boucle principale d’événements En comparaison avec la boite à outils Swing où la boucle est implicite, SWT nécessite de définir explicitement une boucle Définition d’une boucle d’événement Tant que la fenêtre public class Compteur { readAndDispatch() récupère en « vie » public Compteur() { les événements du système readAndDispatch ... hôte et les transmet à continue à while(!myShell.isDisposed()) { l’application if (!display.readAndDispatch()) dispatcher display.sleep();keulkeul.blogspot.com } display.dispose(); } Si readAndDispatch() } retourne vraie des événements sont encore à Si readAndDispatch() traiter retourne faux mise en attente jusqu’à l’arrivée de nouveaux événements SWT - M. Baron - Page 27
  28. 28. Erreurs et Exceptions SWT distingue trois types d’exceptions SWTError Levée lors d’une erreur fatale Une erreur irrécupérable SWTException Levée lors d’une erreur non fatale Une erreur récupérable Exemple : Invalid thread accesskeulkeul.blogspot.com IllegalArgumentException Exception levée lors d’une erreur non fatale Un argument fourni est invalide Exemple : argument ne peut être null SWT - M. Baron - Page 28
  29. 29. La hiérarchie des packages SWT org.eclipse.swt : package de base qui contient la définition des constantes (SWT) et des exceptions org.eclipse.swt.accessibility : package concernant l’accessibilité org.eclipse.swt.awt : package permettant l’intégration de composants Swing dans SWT org.eclipse.swt.browser : package concernant le composant browser org.eclipse.swt.custom : composants particuliers (TableTree)keulkeul.blogspot.com org.eclipse.swt.dnd : support du Drag&Drop org.eclipse.swt.events : pour la gestion des événements SWT - M. Baron - Page 29
  30. 30. La hiérarchie des packages SWT org.clipse.swt.graphics : ensemble de classes pour le graphique org.eclipse.swt.layout : agents de placement org.eclipse.swt.ole.win32 : gestion OLE pour Windows org.eclipse.swt.printing : pour la gestion de l’impression org.eclipse.swt.program : exécution d’application sur l’OS org.eclipse.swt.widgets : API des composants graphiqueskeulkeul.blogspot.com Dans la suite de ce cours nous allons nous intéresser plus particulièrement aux packages widgets, graphics, events, layout et awt SWT - M. Baron - Page 30
  31. 31. La hiérarchie des composants SWT Hiérarchie des principaux composants Widget Control Tray Menu … Scrollable Button Label …keulkeul.blogspot.com Text List Les sous-classes de Composite Control, Scrollable et Composite seront étudiées dans ce cours Combo Browser … SWT - M. Baron - Page 31
  32. 32. La hiérarchie des composants SWT La classe Widget est la classe de plus haut niveau pour les composants graphiques Sous-classes de Control Service : composants fils à une fenêtre avec réaction à enregistrement à des événements de base (MouseListener, KeyListener, …) Exemples : Button, Label Sous-classes de Scrollable Service : composants avec des barres de défilement Exemple : List, Textkeulkeul.blogspot.com Sous-classes de Composite Service : composants capable de contenir des composants Control appelés également conteneur Exemple : Canvas, Group SWT - M. Baron - Page 32
  33. 33. La classe Widget La classe Widget est la classe de plus haut niveau de la hiérarchie SWT Services proposés Mécanisme générique de bas niveau pour la gestion des événements Sémantique de construction et de destruction Mécanisme de stockage d’information Méthodes usuelles void dispose() : libérer les ressources d’un composant Display getDisplay() : récupère le Display associé au composantkeulkeul.blogspot.com addListener(int, Listener) : mécanisme d’abonnement … Cette classe ne peut être étendue pour le développement SWT - M. Baron - Page 33
  34. 34. La classe Control La classe Control dérive de la classe Widget et chaque objet Control encapsule un composant graphique natif : un peer Tous les composants SWT à l’exception de ScrollBar et Menu sont des Control La classe Control fournit des méthodes pour contrôler l’affichage et le comportement Taille, couleur, police, menu popup, …keulkeul.blogspot.com Abonnement aux écouteurs (listeners typés) De nombreuses méthodes … se référer à l’API SWT - M. Baron - Page 34
  35. 35. Galerie des composants : conteneurs Shell Composite CoolBar Canvas Spinnerkeulkeul.blogspot.com ToolBar Combo Browser SWT - M. Baron - Page 35
  36. 36. Galerie des composants : conteneurs (suite) Table ExpandBar CTabFolder Group Tree ScrolledCompositekeulkeul.blogspot.com StyledText TabFolder SWT - M. Baron - Page 36
  37. 37. Galerie des composants : contrôle Button (SWT.TOGGLE) Button (SWT.PUSH) Button (SWT.CHECK) Button (SWT.ARROW) Button (SWT.RADIO)keulkeul.blogspot.com Label Link SWT - M. Baron - Page 37
  38. 38. Galerie des composants : contrôle (suite) Slider Scale Sash Text (SWT.SINGLE)keulkeul.blogspot.com List Text (SWT.MULTI) SWT - M. Baron - Page 38
  39. 39. Galerie des composants : les autres Menukeulkeul.blogspot.com Tray System SWT - M. Baron - Page 39
  40. 40. Les conteneurs de SWT : Shell Shell permet la création d’une fenêtre (équivalent à la JFrame de Swing) Fenêtre indépendante dont l’apparence peut varier en fonction du style donné lors de la construction Possibilité de créer des sous fenêtres associées une fenêtre parent Construction Shell(Display) : construit un Shell (style défaut) associé à un Display Shell(Display, int) : avec un style défini Shell(Shell) : construit un Shell associé à un Shell parentkeulkeul.blogspot.com Méthodes utiles setVisible(boolean) : rend visible ou pas la fenêtre open() : appel un ensemble de fonctionnalités (visible, active, …) SWT - M. Baron - Page 40
  41. 41. Les conteneurs de SWT : Shell Les styles d’une fenêtre (constantes de la classe SWT) BORDER : ajoute un border CLOSE : ajoute un bouton de fermeture MIN : ajoute un bouton pour minimiser la fenêtre MAX : ajoute un bouton pour maximiser la fenêtre RESIZE : ajoute un border pour le redimensionnement TITLE : ajoute une barre de menu Paramètres pré-définis NO_TRIM : fenêtre sans possibilité de redimensionner, agrandir,keulkeul.blogspot.com minimiser, déplaçable, border, … DIALOG_TRIM : TITLE | CLOSE | BORDER SHELL_TRIM : CLOSE | TITLE | MIN | MAX | RESIZE SWT - M. Baron - Page 41
  42. 42. Les conteneurs de SWT : Shell SHELL_TRIM DIALOG_TRIM NO_TRIM Les fenêtres modales SYSTEM_MODAL : modale au système complet (peu répandu)keulkeul.blogspot.com APPLICATION_MODAL : création d’une fenêtre modale à l’application PRIMARY_MODAL : création d’une fenêtre modale MODE_LESS : non modale SWT - M. Baron - Page 42
  43. 43. Les conteneurs de SWT : Composite La classe Composite s’occupe de la gestion des conteneurs Elle peut contenir des composants Control et par conséquent d’autres objets de type Composite Un objet Composite doit être rattaché directement à un objet Shell, ou indirectement via d’autres conteneurs Les composants sont ajoutés au conteneur au moment de lakeulkeul.blogspot.com construction des composants (En Swing les composants sont ajoutés par l’intermédiaire de la méthode add du conteneur) SWT - M. Baron - Page 43
  44. 44. Les conteneurs de SWT : Composite Un conteneur gère l’agencement des composants par un agent de placement Différentes méthodes utiles Composite(Composite, int) : constructeur d’un Composite layout(boolean) : active ou pas l’agencement setLayout(Layout) : modifie l’agent de placement Control[] getChildren() : retourne le nombre de Control contenukeulkeul.blogspot.com setFocus() : affecte le focus au conteneur La classe Shell étudiée précédemment est du type Composite SWT - M. Baron - Page 44
  45. 45. Les conteneurs de SWT : Group Le conteneur Group est similaire à la classe Composite, il impose une délimitation et permet d’ajouter un titre En Swing, il s’agit d’un JPanel décoré d’un TitledBorder Différentes méthodes utiles setText(String p) : modifie le titre du Group String getText() : récupère le titre du Group Exemple : des composites décorés Group temp = new Group(sShell, SWT.NONE); temp.setText("Action");keulkeul.blogspot.com temp.setLayout(new FillLayout(SWT.HORIZONTAL)); Button myButton = new Button(temp, SWT.NONE); myButton.setText("i -> i + 1"); temp = new Group(sShell, SWT.NONE); temp.setText("Résultat"); temp.setLayout(new FillLayout(SWT.HORIZONTAL)); Label myLabel = new Label(temp,SWT.CENTER); myLabel.setText("i = " + i); } SWT - M. Baron - Page 45
  46. 46. Les conteneurs de SWT : ToolBar ToolBar permet d’ajouter une barre d’outils en contenant un ensemble de composants prédéfinis (Button, Toggle, …) Une ToolBar peut être horizontale ou verticale ToolBar toolBar = new ToolBar(shell, SWT.HORIZONTAL) Ou ToolBar toolBar = new ToolBar(shell, SWT.VERTICAL) Chaque élément d’une barre d’outil est défini par un ToolItem Apparence d’un ToolItem (constantes de la classe SWT) CHECK : un bouton de sélection (Toggle)keulkeul.blogspot.com DROP_DOWN : un bouton avec un chevron PUSH : un bouton classique RADIO : un bouton de type radio (singleton sur la sélection) SEPARATOR : un séparateur SWT - M. Baron - Page 46
  47. 47. Les conteneurs de SWT : ToolBar Différentes méthodes pour ToolItem setControl(Control) : modifie le contrôle quand l’item est un séparator setSelection(boolean) : sélectionne ou pas setEnabled(boolean) : active ou désactive setText(String) : modifie le texte setToolTipText(String) : modifie la bulle d’aide setWidth(int) : modifie la taille en pixel de l’élémentkeulkeul.blogspot.com Utilisation de la méthode setControl(Control) Possibilité d’ajouter des composants Control à la ToolBar Nécessite que le style du ToolItem soit SEPARATOR - M. Baron - Page SWT 47
  48. 48. Les conteneurs de SWT : ToolBar Exemple : une barre d’outils … public class ToolBarExample { public ToolBarExample() { Display display = new Display (); Shell shell = new Shell (display); ToolBar bar = new ToolBar (shell, SWT.HORIZONTAL); ToolItem item = new ToolItem (bar, SWT.PUSH); item.setText("Item 1"); Button myButton = new Button(bar,SWT.NONE); myButton.setText("Ici"); item = new ToolItem(bar,SWT.SEPARATOR); myButton.pack(); item.setWidth(myButton.getSize().x); item.setControl(myButton); bar.pack (); shell.pack (); Ajout d’un objet Control dans shell.open (); la barre de menukeulkeul.blogspot.com while (!shell.isDisposed ()) { if (!display.readAndDispatch ()) display.sleep (); } display.dispose (); ... } ToolBarExample.java du projet IntroExamples SWT - M. Baron - Page 48
  49. 49. Les conteneurs de SWT : CoolBar La CoolBar fonctionne sur le même principe que la ToolBar à la différence où les éléments sont flotants Pour interdire le déplacement d’éléments dans une CoolBar utiliser la méthode setLocked(boolean) Les éléments contenus dans une CoolBar sont définis par des CoolItemkeulkeul.blogspot.com Element déplaçable Element déplaçable SWT - M. Baron - Page 49
  50. 50. Les composants de contrôle : Button La classe Button représente un bouton cliquable A la différence de Swing où chaque type de bouton à une classe prédéfinie (JButton, JRadioButton, JCheckBox, …) le SWT se base sur les styles Différentes méthodes utiles setText(String) : modifie le texte du bouton setSelection(boolean) : modifie la sélection Différentes apparences (constantes de la classe SWT) PUSH ou NONE : bouton par défautkeulkeul.blogspot.com CHECK : case à cocher RADIO : bouton radio TOGGLE : bouton de sélection ARROW : bouton avec flèche SWT - M. Baron - Page 50
  51. 51. Les composants de contrôle : Button Exemple : un ensemble de boutons public class ButtonsExample { public ButtonsExample() { Display display = new Display (); Shell shell = new Shell (display); shell.setText("Buttons Example"); shell.setLayout(new FillLayout(SWT.VERTICAL)); Button myButton = new Button(shell,SWT.PUSH); myButton.setText("Push Me"); myButton = new Button(shell,SWT.CHECK); myButton.setText("Check Me"); myButton = new Button(shell,SWT.RADIO); myButton.setText("Radio Me"); myButton = new Button(shell,SWT.RADIO); myButton.setText("Radio Me"); myButton = new Button(shell,SWT.TOGGLE); myButton.setText("Select Me"); myButton = new Button(shell,SWT.ARROW); myButton.setText("Turn Me"); ...keulkeul.blogspot.com } Les boutons de type RADIO ButtonsExample.java du sont groupés s’ils appartiennent projet IntroExamples au même Composite SWT - M. Baron - Page 51
  52. 52. Les composants de contrôle : Label et Text La classe Label permet d’afficher un texte ou une image setText(String) : modifie le texte setImage(Image) : modifie l’image La classe Text est une zone de texte contenant une ou plusieurs ligne (SINGLE ou MULTI) setText(String) : modifie le texte setTextLimit(int) : définit la limite de la chaîne setEditable(boolean) : précise si la zone de texte est éditable Exemple : un ensemble de textes public class LabelTextExample {keulkeul.blogspot.com public LabelTextExample() { Display display = new Display (); Shell shell = new Shell (display); shell.setText("Buttons Example"); shell.setLayout(new FillLayout(SWT.VERTICAL)); Label myLabel = new Label(shell, SWT.BORDER); myLabel.setText("Message"); Text myText = new Text(shell, SWT.BORDER | SWT.MULTI); LabelTextExample.java du myText.setText("Coucou"); projet IntroExamples ... } SWT - M. Baron - Page 52
  53. 53. L’art de placer les composants SWT Les agents de placement ou Layout Manager RowLayout FillLayout FormLayoutkeulkeul.blogspot.com GridLayout StackLayout SWT - M. Baron - Page 53
  54. 54. Les agents de placement et les composants Les agents de placement permettent d’agencer les widgets contenus dans un objet Composite Un agent de placement hérite de classe Layout Il peut s’agir de composants de type Control ou Composite L’agent de placement est associé à un objet Composite setLayout(Layout) : modification d’un agent de placement Chaque widget peut influencer son comportement dans son conteneur par la méthodekeulkeul.blogspot.com setLayoutData(Object) : objet spécifique suivant le type d’agent de placement Pour appliquer l’agencement et le re-dimensionnement des objets Control, utiliser la méthode pack() SWT - M. Baron - Page 54
  55. 55. Les agents de placement : FillLayout Affiche horizontalement ou verticalement les composants les uns à la suite des autres VERTICAL ou HORIZONTAL constantes de la classe SWT Tous les composants sont redimensionnés de manière identique, ne conserve donc pas la taille des composants Dés que le conteneur est redimensionné les composants se distribuent l’espace Exemple : boutons alignés verticalementkeulkeul.blogspot.com sShell.setLayout(new FillLayout(SWT.VERTICAL)); Button myButton = new Button(sShell, SWT.NONE); myButton.setText("Bouton 1"); myButton = new Button(sShell, SWT.NONE); myButton.setText("Bouton 2"); myButton = new Button(sShell, SWT.NONE); myButton.setText("Bouton 3"); FillLayout.java du projet myButton = new Button(sShell, SWT.NONE); LayoutExamples myButton.setText("Bouton 4"); SWT - M. Baron - Page 55
  56. 56. Les agents de placement : RowLayout Affiche horizontalement ou verticalement les composants les uns à la suite des autres (si possible) VERTICAL ou HORIZONTAL constantes de la classe SWT Possibilité de conserver la taille des composants Si pas assez de place débordement sur une nouvelle ligne ou une colonne Peut être comparé à l’agent de placement FlowLayout de Swing (mais en plus expressif)keulkeul.blogspot.com Possibilité de contraindre chaque composant par un objet de type RowData RowData(int width, int height) : largeur et hauteur SWT - M. Baron - Page 56
  57. 57. Les agents de placement : RowLayout RowLayout peut être paramétré après sa construction boolean justify : précise si les composants doivent être justifiés int marginBottom, marginTop : marge du bas et du haut int marginLeft, marginRight : marge à gauche et à droite boolean pack : si true les composants gardent leur taille préférée int spacing : espace entre les contrôleskeulkeul.blogspot.com int type : orientation (SWT.VERTICAL ou SWT.HORIZONTAL) boolean wrap : si true retour à la ligne quand plus de place SWT - M. Baron - Page 57
  58. 58. Les agents de placement : RowLayout Exemple : un ensemble de boutons RowLayout myLayout = new RowLayout(SWT.HORIZONTAL); myLayout.wrap = true; sShell.setLayout(myLayout); Button myButton = new Button(sShell, SWT.NONE); myButton.setText("Bouton 1"); myButton = new Button(sShell, SWT.NONE); myButton.setText("Bouton 2"); myButton = new Button(sShell, SWT.NONE); myButton.setText("Bouton 3"); myButton = new Button(sShell, SWT.NONE); myButton.setText("Bouton 4"); myButton.setLayoutData(new RowData(100,100)); RowLayoutExample.java du Le dernier bouton projet LayoutExamples est agrandikeulkeul.blogspot.com Différents résultats en fonction de la taille de la fenêtre SWT - M. Baron - Page 58
  59. 59. Les agents de placement : GridLayout L’agent de placement GridLayout est un des plus expressif et pourrait être suffisant Il contrôle une grille avec la possibilité de fusionner des cellules et de contraindre ou pas la largeur des cellules Comparable au GridLayout de Swing en plus expressif Construction d’un GridLayout GridLayout(int nc, boolean ew) : construit un GridLayout avec nckeulkeul.blogspot.com nombre de colonnes. Si ew = true les colonnes ont la même taille GridLayout() : construit un GridLayout avec une colonne et les colonnes n’auront pas la même taille SWT - M. Baron - Page 59
  60. 60. Les agents de placement : GridLayout GridLayout peut être paramétré après sa construction int horizontalSpacing : espace horizontal entre les cellules int verticalSpacing : espace vertical entre les cellules boolean makeColumnsEqualWidth : true = force toutes les colonnes à avoir la même taille int marginHeight, marginWidth : marge en largeur et en hauteur int numColumns : nombre de colonne Possibilité de contraindre chaque composant par un objet dekeulkeul.blogspot.com type GridData GridData(int style) : construit un GridData avec un style spécifié SWT - M. Baron - Page 60
  61. 61. Les agents de placement : GridLayout GridData peut être paramétré après sa construction int horizontalSpan : le nombre de colonne occupé int verticalSpan : le nombre de ligne occupé int horizontalAlignment : précise le type d’alignement GridData.FILL, .BEGINNING, .CENTER et .END boolean grabExcessHorizontalSpace : si TRUE force la cellule à remplir l’espace disponible FILL, BEGINNING, … CENTER et END ne sont pas utilisables pour Les différentes constantes utilisables construire un GridDatakeulkeul.blogspot.com FILL_BOTH : rempli l’espace disponible horizontal et vertical FILL_HORIZONTAL : rempli l’espace disponible horizontal FILL_VERTICAL : rempli l’espace disponible vertical … SWT - M. Baron - Page 61
  62. 62. Les agents de placement : GridLayout Exemple : un ensemble de boutons GridLayout myLayout = new GridLayout(3, false); sShell.setLayout(myLayout); Button myButton = new Button(sShell, SWT.NONE); myButton.setText("Bouton 1"); myButton = new Button(sShell, SWT.NONE); myButton.setText("Bouton 2"); Trois cellules en haut myButton = new Button(sShell, SWT.NONE); myButton.setText("Bouton 3"); myButton = new Button(sShell, SWT.NONE); myButton.setText("Bouton 4"); GridData myData = new GridData(GridData.FILL_BOTH); myData.horizontalSpan = 3; myButton.setLayoutData(myData); Trois cellules fusionnées GridLayoutExample.java du projet LayoutExampleskeulkeul.blogspot.com SWT - M. Baron - Page 62
  63. 63. Les agents de placement : FormLayout L’agent de placement FormLayout organise les Control en exploitant des contraintes de placement Comparable au GridBagLayout de Swing Possibilité de contraindre chaque composant par un objet de type FormData Utilisation d’un objet additionnel FormAttachment lié au FormData pour contrôler la taille et le placement Attributs d’un FormDatakeulkeul.blogspot.com int height, width : hauteur et largeur pour le Control FormAttachment bottom, left, right, top : la contrainte pour le bas, la gauche, la droite et le haut du Control SWT - M. Baron - Page 63
  64. 64. Les agents de placement : FormLayout FormAttachment définit comment les composants sont positionnés entre eux Cet objet permet de définir l’alignement et la taille d’un Control Un FormAttachment peut être associé à un Control pour définir ainsi des contraintes entre objets Control Représentation mathématique de l’objet FormAttachment sous la forme d’une équation de type : y = a x + bkeulkeul.blogspot.com y = coordonnées après attachement x = coordonnées avant attachement a = pourcentage de l’objet attaché ( a = numérateur / dénominateur) b = offset SWT - M. Baron - Page 64
  65. 65. Les agents de placement : FormLayout Attributs d’un FormAttachment int alignment : côté du Control avec lequel le FormAttachment sera attaché SWT.TOP, .CENTER, .BOTTOM, .LEFT, .RIGHT Control control : l’objet Control associé au FormAttachment int denominateur : dénominateur de a (défaut : 100) int numerator : numérateur de a int offset : décalage Construction d’un FormAttachmentkeulkeul.blogspot.com FormAttachment(Control p, int offset) FormAttachment(int numerator, int offset) FormAttachment(int numerator, int denominateur, int offset) … SWT - M. Baron - Page 65
  66. 66. Les agents de placement : FormLayout Exemple (EP 1) : FormLayout sans FormAttachment FormLayout formLayout = new FormLayout(); shell.setLayout(formLayout); FormData formData = new FormData(); formData.height = 120; FormLayoutExample1.java formData.width = 120; du projet LayoutExamples Button button = new Button(shell, SWT.PUSH); button.setLayoutData(formData); button.setText("Button 1"); Le bouton conserve sa taille préférée lors de l’agrandissement de son containerkeulkeul.blogspot.com SWT - M. Baron - Page 66
  67. 67. Les agents de placement : FormLayout Exemple (EP 2) : FormLayout avec FormAttachment FormLayout formLayout = new FormLayout(); shell.setLayout(formLayout); Fixé à 20 pixels à gauche FormData formData = new FormData(); formData.height = 120; formData.width = 120; Fixé à 20 pixels à droite formData.left = new FormAttachment(0,20); formData.right = new FormAttachment(100,-20); Fixé à 20 pixels en haut formData.top = new FormAttachment(0,20); formData.bottom = new FormAttachment(100,-20); Fixé à 20 pixels en bas Button button = new Button(shell, SWT.PUSH); button.setLayoutData(formData); button.setText("Button 1");keulkeul.blogspot.com FormLayoutExample2.java du projet LayoutExamples Le bouton est collé au partie droite et basse SWT - M. Baron - Page 67
  68. 68. Les agents de placement : FormLayout Exemple (EP 2) bis : FormLayout avec FormAttachment Côté gauche Côté droit y = (0 / 100) x + 20 y = (100 / 100) x - 20 x (coordonnées avant attachement)keulkeul.blogspot.com x (coordonnées après attachement) A chaque re-dimensionnement du A chaque re-dimensionnement du conteneur la position du côté conteneur la position du côté droit du bouton varie linéairement gauche du bouton ne change pas SWT - M. Baron - Page 68
  69. 69. Les agents de placement : FormLayout Exemple (EP 2) bis : FormLayout avec FormAttachment Numérateur = 0, offset > 0 Numérateur = 100, Numérateur = 0, offset > 0 offset > 0keulkeul.blogspot.com Valeurs pour les cas généraux du moment que les FormAttachment Numérateur = 100, offset < 0 ne sont pas liés à un Control SWT - M. Baron - Page 69
  70. 70. Les agents de placement : FormLayout Exemple (EP 3) : FormLayout avec FormAttachment et Control associé FormLayout formLayout = new FormLayout(); shell.setLayout(formLayout); Button button1 = new Button(shell, SWT.PUSH); button1.setText("Button 1"); Button button2 = new Button(shell, SWT.PUSH); button2.setText("Button 2"); FormData formData = new FormData(); formData.left = new FormAttachment(0,20); formData.right = new FormAttachment(100,-20); formData.top = new FormAttachment(0,20); formData.bottom = new FormAttachment(button2,0,SWT.TOP); button1.setLayoutData(formData); formData = new FormData(); formData.left = new FormAttachment(0,20);keulkeul.blogspot.com formData.right = new FormAttachment(100,-20); formData.bottom = new FormAttachment(100,-20); formData.top = new FormAttachment(1,2,0); button2.setLayoutData(formData); Relier le bas de bouton1 FormLayoutExample3.java du avec le haut du bouton2 projet LayoutExamples SWT - M. Baron - Page 70
  71. 71. Les agents de placement : StackLayout L’agent de placement StackLayout permet d’empiler des Control et de choisir celui qui sera visible Similaire au CardLayout de Swing Ne fait pas partie du package org.eclipse.swt.layout StackLayout peut être paramétré après sa construction int marginHeight : marge en hauteur int marginWidth : marge en largeur Control topControl : objet Control à afficher Si l’objet topControl est null aucun objet Control ne serakeulkeul.blogspot.com affiché Pour changer d’objet Control à afficher Modifier l’objet contenu dans topControl du StackLayout Appeler layout() du Composite SWT - M. Baron - Page 71
  72. 72. Les agents de placement : StackLayout Exemple : StackLayout et deux boutons final Shell shell = new Shell (display); final StackLayout stackLayout = new StackLayout(); shell.setLayout(stackLayout); Button button1 = new Button(shell, SWT.PUSH); button1.setText("Button 1"); final Button button2 = new Button(shell, SWT.PUSH); A la suite de l’action button2.setText("Button 2"); sur button1, button2 devient l’objet Control button1.addSelectionListener(new SelectionAdapter() { courant dans le public void widgetSelected(SelectionEvent arg0) { stackLayout.topControl = button2; StackLayout shell.redraw(); } }); stackLayout.topControl = button1;keulkeul.blogspot.com FormLayoutExample3.java du projet LayoutExamples SWT - M. Baron - Page 72
  73. 73. Les agents de placement : aucun … Ne pas utiliser d’agent de placement vous impose pour chaque composant de : les positionner dans leur parent définir la taille L’absence d’agent de placement ne permet pas de produire des interfaces qui s’adaptent au système Pour préciser que vous ne voulez pas d’agent de placementkeulkeul.blogspot.com donner une valeur null à la méthode setLayout(…) Dans quels cas ne pas utiliser d’agent de placement Construction d’un GUI-Builder SWT - M. Baron - Page 73
  74. 74. Les agents de placement : aucun … Exemple : sans agent de placement avec 2 boutons Shell shell = new Shell (display); Le LayoutManager du shell.setLayout(null); Shell est null Button button = new Button(shell, SWT.PUSH); button.setText("Button 1"); StackLayoutExample.java du button.setBounds(0, 0, 125, 125); projet LayoutExamples button = new Button(shell, SWT.FLAT); button.setText("Button 2"); Modification de la button.setBounds(0, 125, 125, 125); position et de la taille pour chaque button = new Button(shell, SWT.FLAT); composant button.setText("Button 3"); button.setBounds(0, 250, 125, 125);keulkeul.blogspot.com SWT - M. Baron - Page 74
  75. 75. Conception et programmation Affichage des informations vers l’utilisateur Instanciation des composants de la BAO SWT Mise en place des composants visibles grâce à des conteneurs et agents de placement Mais l’interface ne peut pas réagir aux actions de l’utilisateur Clic sur le bouton Terminaison de l’application Réaction aux actions de l’utilisateurkeulkeul.blogspot.com En SWT, toute interaction est encapsulée dans un événement Le traitement des interactions revient à récupérer et interpréter les événements SWT utilise le principe de l’abonnement SWT - M. Baron - Page 75
  76. 76. Traitement des événements SWT Chaque composant de l’interface graphique peut émettre des événements C’est une source (Widget) Des objets peuvent recevoir ces événements Ce sont des écouteurs (les listeners) La liaison entre source et écouteur se fait par abonnement On associe à une source un ou plusieurs écouteurs et réciproquement SWT fournit deux types de listeners Les listeners non typés (Listener) Les listeners typés (EventListener)keulkeul.blogspot.com Les événements sont définis par une classe Java qui dépend du type de listener Event pour les listeners non typés TypedEvent pour les listeners typés SWT - M. Baron - Page 76
  77. 77. Intérêt du traitement par abonnement Exemple d’un compteur qui incrémente et décrémente Deux boutons « OUI » incrémente une variable « NON » décrémente la même variable Un son est émis à chaque pression sur un des boutons Un bouton est associé deux fois à un même événement avec deux actions différenteskeulkeul.blogspot.com SelectionEvent SelectionEvent SelectionEvent +1 Beep ! -1 SWT - M. Baron - Page 77
  78. 78. Intérêt du traitement par abonnement En quoi consiste l’abonnement ? Enregistrer (abonner) auprès de l’objet source un écouteur Exemple : monBouton.addListener(monListener); Qu’est-ce qu’un écouteur ? Une classe (même anonyme) qui implémente une interface (au sens Java du terme)keulkeul.blogspot.com Selon le type d’écouteur, la méthode d’abonnement et la classe de l’écouteur varient SWT - M. Baron - Page 78
  79. 79. Traitement des événements : les listeners non typés Les listeners non typés sont représentés par l’interface Listener contenant une seule méthode void handleEvent(Event event) : méthode de traitement d’un événement L’abonnement à cet écouteur non typé est effectué par la méthode (présente dans la classe Widget) void addListener(int eventType, Listener listener) : méthode réalisant l’abonnement entre une source (Widget) et un objet de type Listener pour le type d’événement défini par eventType Abonnement de button.addListener(SWT.SELECTION, new Listener() { button avec unkeulkeul.blogspot.com public void handleEvent(Event e) { button est switch(e.type) { listener pour une source case SWT.SELECTION : écouter un System.out.println("Button Pressed"); break; événement } SELECTION } } Traitement de l’événement SWT - M. Baron - Page 79
  80. 80. Traitement des événements : les listeners non typés Le type d’événement à considérer au cours de l’abonnement est défini par des constantes de type int stockées dans SWT Activate : fenêtre active MouseHover : souris au dessus du widget Close : widget terminé MouseMove : souris se déplace dans widget Collapse : un nœud d’arbre réduit MouseUp : bouton souris relaché Deactivate : fenêtre non active MouseDown : bouton souris pressé Dispose : composant détruit MouseDoubleClick : pour le double click Expand : un nœud d’arbre éclaté Move : déplacement d’un widget FocusIn : widget gagne le focus Paint : le widget est dessiné FocusOut : widget perd le focus Resize : widget rediemensionnékeulkeul.blogspot.com KeyDown : presse une touche clavier Selection : widget sélectionné KeyUp : relacher une touche clavier Show : widget affiché MouseEnter : souris entre dans un widget … MouseExit : souris sort du widget SWT - M. Baron - Page 80
  81. 81. Traitement des événements : les listeners non typés La classe Event permet de définir le contenu de l’événement Elle contient des attributs qui caractérisent l’événement Certains attributs sont dépendants du type d’événement considéré Par exemple pour l’événement de type MouseDoubleClick int button : modélise le bouton de la souris : 1 pour le bouton de gauche, 2 pour le second et 3 pour le troisième int type : le type de l’événement considérékeulkeul.blogspot.com int time : la date à laquelle l’événement a été provoquée int x et y : position de la souris Widget item : la source de l’événement SWT - M. Baron - Page 81
  82. 82. Traitement des événements : les listeners non typés Exemple : un bouton et des réactions ... myButton.addListener(SWT.MouseDoubleClick, new Listener() { public void handleEvent(Event event) { System.out.println("Type de lévénement : " + event.type); ((Button)event.widget).setText("DoubleClick"); System.out.println("Date de déclenchement : " + event.time); System.out.println("Position x et y : " + event.x + " / " + event.y); System.out.println("Quel bouton ? : " + event.button); } }); ... InfoEventExample.java du projet EventExampleskeulkeul.blogspot.com SWT - M. Baron - Page 82
  83. 83. Traitement des événements : les listeners typés Les listeners typés sont représentés par un ensemble d’interface stockés dans le package org.eclipse.swt.events Les listeners typés fournissent en quelque sort une encapsulation du type d’événement Pour chaque famille d’événement un listener est proposé MouseListener : écouteur adapté pour les événements de clicks de la souris Chaque listener propose un ensemble de méthodes associé àkeulkeul.blogspot.com un type précis d’événement mouseDoubleClick(MouseEvent e) : pour le double click mouseDown(MousEvent e) : quand le bouton est pressé mouseUp(MouseEvent e) : quand le bouton est levé - M. Baron - Page SWT 83
  84. 84. keulkeul.blogspot.com Traitement des événements : les listeners typés SWT - M. Baron - Page 84
  85. 85. keulkeul.blogspot.com Traitement des événements : les listeners typés SWT - M. Baron - Page 85
  86. 86. Programmation du traitement Créer une source Instancier un composant (e.g. un Button) pour l’affichage, c’est automatiquement une source d’événements Ne pas oublier de garder une référence disponible sur ce composant Créer un écouteur Implémenter dans une classe une des interfaces du package events (e.g. un SelectionListener) selon le type d’événement écouté Coder les effets de bord attendus dans une des méthodes de cette classe (e.g. public void widgetSelected(SelectionEvent))keulkeul.blogspot.com Instancier un objet de cette classe Abonner l’écouteur à la source Abonner l’instance de la source à l’instance de l’écouteur SWT - M. Baron - Page 86

×