Interaction Homme-Machine

La page est créée Françoise Rolland
 
CONTINUER À LIRE
Interaction Homme-Machine
Interaction Homme-Machine
Cours 2 : Interface graphique & programmation avec JavaFX

      Année 2018/2019 – Et3 Info - Polytech Paris-Sud
             Cédric Fleury (cedric.fleury@lri.fr)

         https://www.lri.fr/~cfleury/teaching/et3-info/IHM-2019/

    Une partie de ce cours est basée sur les transparents de Ignacio Avellino,
                Anastasia Bezerianos et Michel Beaudouin-Lafon
Interaction Homme-Machine
Rappels
Système interactif n’est pas juste un système algorithmique
   Représentation d’un état interne
   Réponse aux actions de l’utilisateur
   Boucle perception-action

IHM : approche multidisciplinaire
   Prise en compte des capacités humaines dans le système
   Adaptation au modèle mental de l’utilisateur

Différents styles d’interaction
   WIMP, interaction gestuelle, tangible jusqu’à la réalité virtuelle

           https://www.lri.fr/~cfleury/teaching/et3-info/IHM-2019/
                                                                        2
Interaction Homme-Machine
Plan du cours

A - Interface graphique

B - Implémentation d’une interface avec JavaFX

C - Programmation événementielle

                                                    3
Interaction Homme-Machine
Plan du cours

A - Interface graphique

B - Implémentation d’une interface avec JavaFX

C - Programmation événementielle

                                                    4
Interaction Homme-Machine
Interface graphique

L'interaction graphique
   Les entrées sont spécifiées directement à partir des sorties

Périphérique d’entrée spécifie une position à l'écran qui
désigne un objet précédemment affiché par le système
   Cette désignation directe est appelée pointage

   Elle est familière au monde physique
      D’où le succès de ce type d’interface

                                                                  5
Interaction Homme-Machine
Tâches de base de l’interaction

Tâche d’entrée

Tâche de sélection

Tâche de déclenchement

Tâche de navigation

Tâche de réglage de propriétés

Tâche de transformation

                                           6
Interaction Homme-Machine
Tâche d’entrée
Entrer du texte
   Champs de texte + clavier

Entrer une valeur simple
   Slider

Entrer une position
   Pointage

Entrer un chemin
   Echantillonnage
   (avec de l’« encre »
    comme feedback)

                                                7
Interaction Homme-Machine
Tâche d’entrée
Adapter les interactions au type des valeurs entrées
   Exemple : la taille d’un tableau

                                                       8
Interaction Homme-Machine
Tâche de sélection
Choisir un ou plusieurs objets parmi un ensemble
   Ensemble de taille fixe ou variable
   Ensemble de petite taille ou de grande taille

Ensemble de taille fixe
   Menu, boîtes à cocher (checkboxes),
   boutons radio (radio buttons)

Ensemble de taille variable
   Pointage, liste, entrée textuelle

                                                        9
Interaction Homme-Machine
Tâche de sélection
Sélection multiple
   Par groupe                          Par interval

   Ajout/suppression

Combinaison de techniques
   Pointer les éléments d’un liste / utiliser un modifier avec le clavier

                                                                            10
Tâche de sélection
Menus linéaires
   Barre de menu +
   menus descendant
   (pulldown menus)

   Palettes fixes

   Menus contextuels (ou Pop-up)

   Menus hiérarchiques

   Menus détachables

                                                 11
Tâche de sélection
Menus circulaires
   Pie menus

      Selection plus rapide, mais nombres d’items limités (8 en pratique)

   Marking menus

      Transition naturelle du novice à l’expert : effectuer le geste plus
      rapidement et le menu ne s’affiche pas !
                                                                            12
Tâche de déclenchement

Bouttons et menus

Drag-and-drop
  L’action dépend à la fois de la source et de la destination

                                                                13
Tâche de déclenchement
Interaction gestuelle pour déclencher une action
   Exemples :

                                                   14
Tâche de navigation
Barres de défilement (scrollbars)
   Direction de défilement
   Division de l’attention

Défilement direct
   Déplacement avec la main
   Défilement automatique

Changement d’échelle (zoom)
   Agrandissement pour voir les détails
   Rétrécissement pour voir le contexte

                                                    15
Tâche de réglage de propriétés
Boîte de dialogue
   Champs + boutons « OK » / « Appliquer » / « Annuler »
   Modale ou non modale

   Découplage spatial et temporel entre les spécification de la
   commande, ces paramètres et son exécution

Parties optionnelles

                                    Problème avec le bouton « OK »
                                                                  16
Tâche de réglage de propriétés
Boîte de propriété / inspecteurs
   L’inspecteur est toujours visible

   Le contenu change en fonction de l’objet sélectionné

   La modification des propriétés affectent immédiatement l’objet
   sélectionné

                                                                    17
Tâche de transformation
Poignées de manipulation

                                             18
Feedbacks sur les entrées

Pointage

Sélection (simple/multiple cliques, avec ou sans modifiers)

                                                              19
Feedbacks sur les entrées

Déplacement (drag)

  Fantômes ou ombres

  Encre

                                         20
Plan du cours

A - Interface graphique

B - Implémentation d’une interface avec JavaFX

C - Programmation événementielle

                                                    21
Implémentation d’une interface

Problématique
   Faire le lien avec le système d’exploitation
   Ne pas tout ré-implémenter de zéro (bouton, fenêtre, etc.)
   Garder une homogénéité entre les applications

Solutions
   Découpage en plusieurs couches logicielles
   Utilisation de boîtes à outils d’interface

                                                                22
Couches logicielles

                      23
Boîte à outils d’interface

Bibliothèque d’objets interactifs (les « widgets ») que l’on
assemble pour construire l’interface

Fonctionnalités pour faciliter la programmation
d’applications graphiques interactives (et gérer les entrées)

Exemple :
   Windows : MFC, Windows Forms (.NET)
   Mac OS X : Cocoa
   Unix/Linux : Motif
   Multiplateforme : Java AWT/Swing, QT, GTK+

                                                                24
Boîte à outils d’interface
Exemples

                                        25
Les « widgets » (window gadget)

                                  26
JavaFX

JavaFX est une boîte à outils d’interface pour Java
   API orientée graphisme et interaction
   Successeur des API graphiques historiques AWT et Swing
   Prévu aussi pour un déploiement web (Rich Internet Application)
   Amène des choses en plus :
      Véritable graphe de scène,
      Transformations graphiques,
      Effets,
      Animations,
      3D, …

                                                                     27
Documentation officielle
Javadoc (à partir de celle de JavaSE)
https://docs.oracle.com/javase/8/javafx/api/toc.htm

Documentation et exemples de JavaFX
https://docs.oracle.com/javase/8/javase-clienttechnologies.htm

Tutoriel sur les composants de l’interface
https://docs.oracle.com/javase/8/javafx/user-interface-tutorial/

Tutoriel sur les layouts
https://docs.oracle.com/javase/8/javafx/layout-tutorial/

Tutoriel sur la gestion des événements
https://docs.oracle.com/javase/8/javafx/events-tutorial/

                                                                   28
Architecture d’une application JavaFX

Classes constituant une application JavaFX

   Application qui représente une application JavaFX

   Stage qui est le conteneur de plus haut niveau de l’application

   Scene qui contient les composants visuels

                                                                     29
Application

Toute application JavaFX doit :

   Hériter de la classe javafx.application.Application

   Implémenter la méthode main(String[] args)
      Comme toute application Java
      Appelle uniquement la méthode launch(String[] args) de la
      classe parent Application

   Redéfinir la méthode start(Stage primaryStage)
      Appelée par le méthode launch
      Contient le code de l’application

                                                                  30
Application
Exemple

                        31
Stage

S’adapte en fonction du cadre d’utilisation
   Application lourde : fenêtre classique en fonction de l’OS
   Application web : fenêtre du navigateur

Est instancié automatiquement par l’application en
paramètre de la méthode start(Stage primaryStage)

Contient une ou plusieurs instance de Scene

                                                                32
Stage
Exemple

                  33
Scene

Contient les composants visuels

Décrit le graphe de scène = la
hiérarchie des composants visuels
de la scène (sous forme de graphe)

                                             34
Scene

Construction du graphe de scène

   Récupérer la liste des enfants d’un conteneur grâce à la
   méthode getChildren()

   Ajouter à cette liste un enfant ou un groupe d’enfants avec le
   méthodes add(E) ou addAll(E,…)

   Enlever à cette liste un enfant ou un groupe d’enfants avec le
   méthodes remove(E) ou removeAll(E,…)

                                                                    35
Scene
Exemple

                  36
Stage
                            Scene
         Scene

        FlowPane

Label              Button

                                    37
Noeuds du graphes de scène
Widgets « simples »
   Composants de l’interface graphique (affichage + interaction)
   Boutons, barre de défilement, …

Widgets « composés »
   Destinés à contenir d’autres widgets (simples ou composés)
   Boites de dialogue, menus, …

Les conteneurs de Widgets (Layout containers)
   Contient des Widgets ou d’autres conteneurs
   Définit le placement des composants qu’il contient
      Plusieurs types de conteneurs : placement en ligne, colonne, grille, …

                                                                               38
Les widgets de JavaFX
  Affichage            Entrée                Sélection

                       Text Field           Toggle Button
Label & Image View

                     Password Field
                                      Radio Button   Checkbox
    Separator

Déclenchement
                         Slider
                                             Combo Box

     Button
                                                            39
Les widgets de JavaFX
                Sélection

                              Menu

Color Picker

File Chooser                Date Picker
                                          40
Les widgets de JavaFX
            Sélection / Affichage

List View

                                    Table View

Tree View

                                                 41
Les widgets de JavaFX
           Navigation                                  Feedback

              Scroll Bar
                                           Progress Bar and Progress Indicator

                                                          Tooltip
             Scroll Pane

https://docs.oracle.com/javase/8/javafx/user-interface-tutorial/ui_controls.htm#JFXUI336
                                                                                      42
Boîtes de dialogue de JavaFX

Fenêtre attachée à une autre fenêtre
   La fenêtre (ou boîte) de dialogue se ferme avec celle-ci

Une fenêtre de dialogue peut être « modal »
   C-à-d bloquer l’interaction de la fenêtre de niveau inférieure

Différents types de boîtes de dialogue
                                                                    43
Boîtes de dialogue de JavaFX
Exemple

                                         44
Placement des widgets

Les boîtes à outils graphiques permettent de contrôle le
placement des widgets

   Il faut être indépendant de la taille des widgets et de la fenêtre

   Utilisation de gestionnaires de
   géométrie dans les widgets
   composés

                                                                        45
Placement des widgets

Règles générales
   Imbrication géométrique d’un widget fils dans son parent
   Contrôle par le parent du placement de ses fils

Algorithme de placement
   1. Taille naturelle de chaque fils
   2. Taille et position finales
      imposées par le parent
   3. Contraintes :
       grille, formulaire, etc.

                                                              46
Placement des widgets
Exemple

                                  47
Layouts avec JavaFX

Vbox              TilePane              GridPane            BorderPane

Hbox              FlowPane             StackPane           AncchorPane

       https://docs.oracle.com/javase/8/javafx/layout-tutorial/
                                                                         48
Layouts avec JavaFX
Exemple : FlowPane

                                           49
Layouts avec JavaFX
Exemple : GridPane

                                           50
Astuces

Combiner de différents layouts
   Des VBox ou HBox dans un GridPane
   Des FlowPane dans un BorderPane
   Etc.

La fonction sizeToScene() sur le Stage permet de
redimensionner la fenêtre en fonction du contenu de cette
fenêtre
   Particulèrement utile si le contenu de la fenêtre change

                                                                51
Plan du cours

A - Interface graphique

B - Implémentation d’une interface avec JavaFX

C - Programmation événementielle

                                                    52
Système interactif ≠ système algorithmique

Système algorithmique (fermé)
   Lit des entrées, calcule, produit un résultat
   => il y a un état final !

Système interactif (ouvert)
   Évènements provenant de l’extérieur
   => boucle infinie, non déterministe

                                                   53
Problèmes

1. Nous avons appris à programmer des algorithmes
   (la partie “calcul”)

2. La plupart des langages de programmation (C, C++,
   Java, Lisp, Scheme, Ada, Pascal, Fortran, Cobol, ...) sont
   conçus pour écrire des algorithmes, pas des systèmes
   interactifs

3. Les entrées (read, get, scanf, cin, etc.) que nous
   avons utilisées sont bloquantes

                                                                54
Comment gérer les entrées ?

                              55
Programmation événementielle

                               56
Programmation événementielle

                               57
Programmation événementielle avec JavaFX

JavaFX se base sur :

   Un ensemble d’événements (Event) émis par l’interface
      Fournis par l’API
      Créés par les developeurs

   Des gestionnaires d’événements (EventHandler) qui
   définissent les actions effectuer lorsqu’un événement se produit

   Un système de propagation des événements très riche

   Plusieurs façons de s’abonner à la reception d’un événement

                                                                      58
Evénements

Evénements fournis par l’API de JavaFX
   ActionEvent pour une action simple sur l’interface (clic sur un
   bouton par exemple)

   MouseEvent pour les déplacements, survols et clics de la souris

   ScrollEvent pour les défilements à l’aide de la molette de la
   souris, du trackpad, d’un écran tactile, …

   TouchEvent pour les appuis sur un écran tactile

   Etc.

           https://docs.oracle.com/javase/8/javafx/events-tutorial/

                                                                      59
Evénements
Un événement transporte des informations
   type : une information additionnelle sur le type
      Ex : MouseEvent.MOUSE_PRESSED

   target : une cible qui dépend type d’événement
      Ex : pour la souris, c’est le noeud le plus haut placé sous le pointeur

   source : le noeud qui a été abonné à l’événement
   Etc.
   Et éventuellement des informations spécifiques à l’événement

Toutes ces informations sont accessibles par des getters
   getType(), getTarget(), getSource(), getX(), …

                                                                                60
Evénements

Créer ses propres événements

  Créer une classe héritant de javafx.event.Event ou d’une
  de ses sous-classes

  Intérêt ?
      Transporter des informations particulières
      Obtenir un couplage faible entre des composants logiciels

                                                                  61
Gestionnaires d’événements
EventHandler : interface
fonctionnelle décrivant la réaction à un événement
   Comporte une unique méthode handle(T event) avec
   l’événement géré comme paramètre

Pour décrire la réaction à un événement :
   Implémenter l’interface et placer le code du traitement à
   effectuer à l’intérieur de la méthode handle(T event)

   Toutes les informations sur l’événement sont récupérables dans
   cette méthode grâce à son paramètre

                                                                    62
Gestionnaires d’événements
Exemples

                                        63
Réagir à un événement
Abonnement simplifié

   Utiliser les convenience methods de JavaFX pour s’abonner à
   une événement

   Syntaxe :
      setOnXXX(EventHandler event)
      où XXX est le type de l’événement (sans la terminaison Event)

   Exemples :
      setOnAction(EventHandler event)
      setOnKeyPressed(EventHandler event)
      setOnMousePressed(EventHandler event)

                                                                      64
Réagir à un événement
Exemple : instanciation d’une classe locale (voir externe)

                                                             65
Réagir à un événement
Exemple : abonnement grâce à une classe interne anonyme

                                                          66
Réagir à un événement

Exemple : abonnement grâce à une expression lambda
                                     (depuis java 8)

                                                       67
Réagir à un événement

Les convenience methods ont deux inconvénients
   Elles ne fonctionnent qu’avec les événements standards,
   pas avec ceux créés par les développeurs

   Les abonnements à un événement donné ne sont pas
   cumulables sur un même composant

Pour palier à ces problèmes, il faudra utiliser le mécanisme
complet de propagation des événements.

                                                               68
Conclusion
Ce que l’on a vu sur JavaFX

   Architecture d’une application JavaFX
      Classes constituant une application
      Construction du graphe de scène
      Les Widgets de JavaFX
      Les Layouts et le placement des Widgets

   Programmation événementielle
      Evénements
      Gestionnaires d’événements
      Réagir à un événement

                                                             69
Conclusion

Ce que l’on vera la prochaine fois
   L’abonnement complexe aux événements et leur propagation
   Les éléments graphiques
   Les transformations
   Le langage basé sur xml permettant de décrire le graphe de
   scène et les interactions de base : FXML
   L’interface permettant de concevoir les interfaces graphiques de
   façon plus intuitive : SceneBuilder

                                                                      70
Conclusion

Ce que l’on ne vera pas dans le cadre du cours
   La gestion de la 3D

   Les effets et les animations sur n’importe quel élément du
   graphe de scène (dessin ou widget)

   L’habillage CSS

A vous de le découvrir !

                                                                71
Vous pouvez aussi lire