IHM Java / Swing 4ème rencontre DevelopR6 Florence Join – Patrice Ringot - Bruno Mériot INIST - CNRS 16 juin 2011 Plan Introduction Présentation d’IHM Retour d’expérience Introduction Présentation IHM Retour d’expérience Présentation Swing Pourquoi Swing ? Présentation applications Architectures Présentation Swing Swing définition historique Bibliothèque graphique écrite en java, faisant partie du package Java Foundation Classes (JFC), inclus dans J2SE 1996 : JDK 1.0 Version initiale incluant AWT (Abstract Window Toolkit) Composants utilisés associés à leurs équivalents dans le SE Difficultés en terme de portabilité et d’extensibilité 1998 : J2SE 1.2 Intégration de l’API graphique Swing Plus portable et plus flexible que AWT Facile de personnaliser à la fois l’apparence et le comportement Utilise le principe Modèle-Vue-Contrôleur Introduction Présentation IHM Retour d’expérience Présentation Swing Pourquoi Swing ? Présentation applications Présentation Swing Swing architecture le Modèle représente les données de l'application. la Vue représente l'interface utilisateur, n'effectue aucun traitement, affiche les données que lui fournit le modèle. le Contrôleur gère l'interface entre le modèle et le client interprète la requête client, synchronise le modèle et les vues, génère des événements lors d'une modification du modèle, indique à la vue qu'il faut se mettre à jour. Tous les composants Swing héritent de la super-classe JComponent et JComponent hérite de java.awt.Container. Architectures Introduction Présentation IHM Retour d’expérience Présentation Swing Pourquoi Swing ? Présentation applications Architectures Présentation Swing Swing hiérarchie des classes - Container -JComponent -JPanel -JScrollPane -JToolBar -JSplitPane -JTabblePane -JlLayeredPane -JInternalFrame -AbstractButton -JButton -JMenuItem -JCheckBoxMenuItem -JRadioButtonMenuItem -JToggleButton -JCheckBox -JRadioButton - JComponent (suite) -JComboBox -JList -JSlider -JLabel -JTooltip -JProgressBar -JTextComponent -JTextArea -JTextField -JPasswordField -jTextPane -JHTMLPane -JTable -JTree -JColorChooser -JFileChooser Introduction Présentation IHM Retour d’expérience Présentation Swing Présentation Swing Pourquoi Swing ? Présentation applications Architectures Introduction Présentation IHM Retour d’expérience Présentation Swing Présentation Swing Pourquoi Swing ? Présentation applications Architectures Introduction Présentation IHM Retour d’expérience Présentation Swing Pourquoi Swing ? Présentation applications Présentation Swing Les événements Programmation par événement Les composants sont des sources Un écouteur s'abonne à une source Un événements est déclenché par une action utilisateur La source le passe aux abonnés Les abonnés réagissent Principale classe d'écouteur : ActionListener Listeners spécifiques : MouseListener, MouseAdapter KeyListener, KeyAdapter WindowListener, WindowAdapter Architectures Introduction Présentation IHM Retour d’expérience Présentation Swing Pourquoi Swing ? Présentation applications Présentation Swing Le « look and feel » Par défaut même aspect, quelque soit la plate-forme CrossPlatformLookAndFeel SystemLookAndFeel (LAF du système courant) le LAF d'un autre système, si les licences le permettent (le LAF Windows n'est pas disponible sur Linux) Architectures Introduction Présentation IHM Retour d’expérience Présentation Swing Pourquoi Swing ? Présentation applications Architectures Présentation Swing Exemple HelloWord.java import javax.swing.JFrame; import javax.swing.JLabel; public class HelloWorld { public static void main(String[] args) { JFrame frame = new JFrame("HelloWorldSwing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JLabel label = new JLabel("Hello World"); frame.getContentPane().add(label); frame.pack(); frame.setVisible(true); }} Introduction Présentation IHM Retour d’expérience Présentation Swing Pourquoi Swing ? Présentation applications Architectures Présentation Swing Pour résumer ! 100% java ! palette de composants disponibles riche ! respect de nombreuses bonnes pratiques de conception Orientée Objet (Design Pattern) ! look and feel complètement adaptable ! communication par événements ! fait partie d’un framework plus ambitieux, Java Foundation Classes (JFC), qui inclut le glisser-déposer, copier-coller, l’affichage et les animation 2D (Java 2D), le traitement d’images (Java Advanced Imaging), ainsi que les impressions en qualité PostScript… Introduction Présentation IHM Retour d’expérience Présentation Swing Pourquoi Swing ? Présentation applications Architectures Pourquoi avoir choisi Swing ? Framework solide ! Pérenne (Sun – Oracle) ! Technologie éprouvée, une base de bugs bien entretenue ! Communauté d’utilisateurs nombreuse et réactive Adaptable ! Il existe souvent une solution pour façonner quelque chose qui n’existe pas en standard Adapté au fonctionnement en entreprise ! Une solution (JavaWebStart) pour la distribution et la mise à jour ! Un Framework disponible en standard avec chaque JRE Forte dominante Java préexistante ! Existant outils / librairies métier / interfaces en Java Introduction Présentation IHM Retour d’expérience Présentation Swing Pourquoi Swing ? Présentation applications Architectures Applications internes et externes Référentiel Documentaire Chaîne Documentaire Centralise les données documentaires 24 millions de références Gestionnaire du Référentiel Documentaire Interroger et gérer le contenu du Référentiel Utilisé quotidiennement en interne / 200 collaborateurs Plate-forme Référentiel Référentiel documentaire documentaire IHM Production de BD bibliographiques Saisie de catalogage et analyse par classification et indexation Gestionnaire de BD bibliographiques Interroger et gérer le contenu des bases Utilisé / des unités et des chercheurs du CNRS, des étudiants et des réseaux thématiques Introduction Présentation IHM Retour d’expérience Présentation Swing Pourquoi Swing ? Présentation applications Architectures Architecture / Technologies utilisées INIST Serveur coopérants ________________ JBoss(JDBC) Servlets Référentiels, Vocabulaires Catalogage jdbc Référentiel Documentaire PostgreSQL https Serveur sur site Serveur BGI ______________ Catalogage avec Mots-clés JBoss(EJB/JPA) Lucene ejb https JBoss (EJB/JDBC) Servlets Oracle Java ejb IHM mode client/serveur Java/Swing Metadata H2 H2 IHM mode non connecté Java/Swing JPA/Lucene Introduction Présentation IHM Retour d’expérience Démonstration Démonstration Introduction Présentation IHM Retour d’expérience Introduction Retour d’(in)expérience … Some like it hot (Billy Wilder) certains l’aiment chaud -­‐ Nobody is perfect. Jack Lemon -­‐ But I’m a man ! Tony Cur7s Introduction Présentation IHM Retour d’expérience Introduction Java: influence de la version de la JVM Java: influence de la version de la JVM ! Chaque version de Java apporte son lot de bugs ► La fiabilité de l’applicatif dépend aussi de la version de la JVM de l’utilisateur, surtout en ce qui concerne Swing ! On peut aussi écrire du code Swing que l’on pense valide et qui se révèle être une bombe à retardement suite à une évolution/correction de bug dans la librairie Swing ► Si possible il est préférable de travailler avec une JVM validée pour son applicatif. Introduction Présentation IHM Retour d’expérience Introduction Java JavaWebStart (installation / mise à jour des interfaces) JavaWebStart: une bonne idée, pas mal de problèmes ! Marchait à peu près bien en Java 1.5 ! Composant retravaillé par Sun en Java 6 pour préparer l’arrivée de JavaFX ce qui a engendré des problèmes en tous genres ► Après l’avoir utilisé pendant des années, on a décidé de s’en passer et prendre à notre charge le déploiement et la mise à jour de notre applicatif et d’embarquer sa JVM. Introduction Présentation IHM Retour d’expérience Java JavaWebStart Multi plateformes Write once, run everywhere … but with caution ! MacOS ! Nécessite une couche Java spéciale pour être conforme avec ce qu’est un applicatif MacOS (ex: fermeture applicatif) MacOS/Linux/Windows ! Problèmes de rendu graphique: il est préférable de valider ses écrans sur les trois plateformes, sous peine d’avoir des surprises Introduction Présentation IHM Retour d’expérience JavaWebStart Multi plateformes Gestion des bugs Gestion des bugs Contexte: livraisons assez fréquentes (mensuelle ou bi mensuelle) à des utilisateurs « projet » (qui n’ont pas que cela à faire), avec release notes. A bien fonctionné au début: retours réguliers, notamment par des bugs ou demande d’évolution référencés dans Mantis. Puis les retours formalisés se sont estompés et se sont transformés en mail et les tests systématiques ont naturellement baissé en intensité. Certains bugs ont mis des années avant d’être mis en évidence (un testeur de métier les aurait découvert rapidement). Problème: pas de cellule de test … Introduction Présentation IHM Retour d’expérience Multi plateformes Gestion des bugs Automatisation des tests Automatisation des tests Comment optimiser l’effort de test des utilisateurs ? Moins les solliciter … Utilisation de FEST/Swing, Framework de tests fonctionnels ! « tenir » le produit pour ne pas régresser ! Ne solliciter l’utilisateur que pour les nouveautés ! Tâche au long cours qu’il vaut mieux intégrer dès le début … Introduction Présentation IHM Retour d’expérience Gestion des bugs Automatisation des tests Les bugs invisibles Les bugs invisibles Les retours de bugs (RuntimeException) sont beaucoup plus rares de la part des utilisateurs finaux, d’autant plus s’ils n’ont pas participé à la conception de l’interface et qu’ils n’ont pas été formés ! Pour qu’un retour ait lieu, il faut vraiment que l’utilisateur soit bloqué. Les bugs intermittents (ceux qui donnent une mauvaise impression …), eux, ne sont quasiment pas signalés. Une solution qui a fait ses preuves: un rapport est envoyé au serveur au prochain démarrage du client après l’apparition d’un bug (pas besoin que l’utilisateur coopère). Introduction Présentation IHM Retour d’expérience Automatisation des tests Les bugs invisibles Internationalisation et Localisation Internationalisation (I18N) et localisation (L10N) Il est recommandé de prévoir l’internationalisation de l’applicatif dès sa conception, même si cela ne semble vraiment pas nécessaire au départ. ► I18N/L10N à postériori pour 2100 messages = effort non négligeable … Introduction Présentation IHM Retour d’expérience Les bugs invisibles Internationalisation et Localisation Apprentissage / Aide utilisateur Apprentissage / Aide utilisateur Plus un applicatif est riche et moins l’exhaustivité de ces fonctionnalités est connu. Le manuel utilisateur ne suffit pas ! Il est rassurant de le posséder … mais il est rarement utilisé … ! Et pourtant il est indispensable et couteux Ce que nous aurions du faire Utiliser un format de documentation plus structuré (Docbook à la place de Word puis FrameMaker) ! facilement packageable et utilisable (HTML), ! accessible en mode recherche directement dans l’interface (Lucene), ! accessible en contexte ► Valoriser au mieux l’effort consacré au manuel Utiliser des screencasts (éviter les déperditions d’information et l’instauration de mauvaises pratiques). Introduction Présentation IHM Retour d’expérience Internationalisation et Localisation Apprentissage / Aide utilisateur Aller sur le terrain ! Aller sur le terrain ! Il faut aussi aller voir les utilisateurs finaux (ceux qui ne s’expriment pas pendant le développement initial, mais qui utilisent quotidiennement le logiciel). ! Détecter les mauvaises pratiques ! Récolter de nouvelles fonctionnalités Introduction Présentation IHM Retour d’expérience Fin Fin Questions ?