Swing, introduction Sébastien Jean IUT de Valence Département Informatique v1.0, 10 mai 2014 Introduction Swing en bref Swing (Standard Widget Toolkit) est un canevas logiciel (framework) qui permet de réaliser des applications graphiques Il (repose sur et) complète le canevas AWT (Abstract Window Toolkit) utilisé précédemment Il tend à être remplacé par JavaFX aui, à terme, doit devenir le standard Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 1 / 30 Introduction Organisation hiérarchique des éléments Une interface graphique Swing est structurée sous la forme d’un arbre de composants graphiques (objets de type JComponent) les feuilles sont des composants directement affichables (boutons, ...) les noeuds internes sont des conteneurs la racine est un conteneur racine (top-level container) L’organisation des composants dans un conteneur est sous la responsabilité d’un gestionnaire de placement(Layout Manager) Remarque : En fait, tous les composants sont des conteneurs Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 2 / 30 Introduction Programmation événementielle La programmation des interfaces graphiques en Swing est événementielle Les composants graphiques génèrent des événements clic sur un bouton, ajout de texte dans une zone de texte, . . . Ces événements peuvent être capturés et traités via des auditeurs d’événements : patron de conception observeur↔observé 1 s'abonne à la notification de l'événement Source de l'événement notifie l'événement 3 2 Auditeur de l'événement 4 traite l'événement génère l'événement Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 3 / 30 Introduction Programmation événementielle (suite) Couplage faible entre producteur et auditeur par une interface définissant les méthodes de callback Liste des auditeurs enregistrés InterfaceAuditeur 1' x public void notifie(Evenement evenement) 3 ... Auditeur de l'événement 1 Source de l'événement 2 public void abonne(InterfaceAuditeur auditeur) Un producteur d’événements peut avoir plusieurs auditeurs Chaque événement est notifié séquentiellement à tous les auditeurs Un auditeur d’événements peut (en général) se désabonner Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 4 / 30 Conteneurs et composants Conteneurs racines JFrame, fenêtre principale Une application graphique peut-être composée de plusieurs fenêtres (JFrame) indépendantes, mais dans la majorité des cas les applications sont plutôt organisées sous la forme d’une fenêtre principale (JFrame) contenant plusieurs sous-fenêtres (JInternalFrame) Barre de menu (optionnelle) Panneau principal (Content Pane) Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 5 / 30 Conteneurs et composants Conteneurs racines (suite) JDialog, boîte de dialogue JApplet, fenêtre graphique affichée dans un navigateur web Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 6 / 30 Conteneurs et composants Autres conteneurs JPanel, panneau simple JScrollPane, panneau avec défilement (horizontal/vertical) Contenu plus grand que ce qui est réellement affiché JSplitPane, panneau divisé en 2 parties division verticale ou horizontale, séparation par une cloison mobile JTabbedPane, panneau à onglets JOptionPane, boite de dialogue personnalisable, avec ou sans choix Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 7 / 30 Conteneurs et composants Autres composants simples JLabel, étiquette avec texte et/ou image non sélectionnable JButton, bouton simple avec texte et/ou image Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 8 / 30 Conteneurs et composants Autres composants simples JCheckBox, case à cocher avec légende faisant implicitement partie d’un groupe où plusieurs cases peuvent être simultanément cochées JRadioButton, bouton radio avec légende faisant explicitement partie d’un groupe (ButtonGroup) où un seul bouton peut être sélectionné Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 9 / 30 Conteneurs et composants Autres composants simples JComboBox, liste déroulante de choix (texte) JSlider, curseur coulissant JSpinner, liste de choix (texte) commutables par boutons Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 10 / 30 Conteneurs et composants Autres composants simples JTextField, JTextArea,texte non formaté éditables JProgressBar, barre de progression Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 11 / 30 Conteneurs et composants Autres composants plus complexes JEditorPane / JTextPane, texte formaté éditable JList, liste couplé à une collection d’objets par un modèle (ListModel) JTable, tableau couplé à une collection d’objets par un modèle (TableModel) JTree, arbre couplé à une collection d’objets par un modèle (TreeModel) Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 12 / 30 Exemples basiques JFrame Une fenêtre simple cf. code source, paquetage fr.iutvalence.java.cm9.jframe ApplicationDAffichageDeFenetreSimple Application qui démarre la tâche d’affichage de l’IHM TacheDAffichageDeFenetreSimple Tâche gérant l’affichage de l’IHM doit implémenter l’interface java.lang.Runnable Crée la fenêtre et lui donne des propriétés (titre, dimensions) Remarque : une fenêtre ne s’auto-dimensionne pas en fonction de son contenu, c’est l’inverse Rend la fenêtre créée explicitement visible Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 13 / 30 Exemples basiques JFrame Une fenêtre simple : remarques Le main se termine alors que la fenêtre reste affichée Avec Swing, la fin du main ne marque plus la fin de l’application Fermer la fenêtre ne termine pas (forcément) l’application L’objet JFrame est toujours présent (la fenêtre pourrait être réaffichée), aucun événement n’est généré tant que la fenêtre est invisible La destruction d’un composant s’effectue par appel à la méthode dispose, l’application se termine lorsqu’il n’y a plus de composants à gérer Il est possible de configurer la fenêtre pour qu’elle soit automatiquement détruite à sa fermeture Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 14 / 30 Exemples basiques JFrame Modèle de concurrence L’interface graphique est sous le contrôle d’un unique fil d’exécution (thread) appelé event dispatch thread Les traitements plus longs peuvent être pris en charge de manière asynchrone par d’autres fils d’execution appelés workers thread d'un worker code du worker thread event dispatch boucle de gestion d'évenement terminaison du worker thread main Démarrage de la tâche IHM Traitement ne manipulant pas directement les composants graphiques temps Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 15 / 30 Exemples basiques JButton Une fenêtre exposant un bouton cf. code source, paquetage fr.iutvalence.java.cm9.jbutton Remarques : Il est possible de rendre actif/inactif un bouton via l’appel à la méthode setEnabled(true/false) Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 16 / 30 Exemples basiques JButton Une fenêtre exposant un bouton avec auditeur d’évènement cf. code source, paquetage fr.iutvalence.java.cm9.jbuttonlistener Remarques : ActionListener est l’interface d’audition d’évènement polyvalente pour les composants, il en existe de plus spécifiques KeyListener, MouseListener, ItemListener, . . . Il est possible d’ajouter autant d’auditeurs d’évènement que l’on veut sur un composant (addActionLister) et d’en retirer à tout moment (removeActionListener) Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 17 / 30 Exemples basiques JMenu, JDialog Une fenêtre disposant d’un menu cf. code source, paquetage fr.iutvalence.java.cm9.jmenu Remarques : Un auditeur d’évènement ActionListener doit être associé à chaque item de menu Un seul auditeur sachant distinguer la source peut suffire JOptionPane est surtout utilisée comme une classe utilitaire (méthodes statiques) permettant d’afficher des boites de dialogues standards, à choix ou non Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 18 / 30 Application exemple Réalisation d’un convertisseur Bin/Dec/Hex cf. code source, paquetage fr.iutvalence.java.cm9.convertisseur Convertisseur binaire/décimal/hexadécimal Sélection de la base Saisie des symboles avec un clavier réel ou virtuel Le clavier virtuel s’adapte à la base Remise à zéro (des symboles) Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 19 / 30 Application exemple Layout : JFrame JMenuBar + JSplitPane vertical JFrame JMenuBar JSplitPane Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 20 / 30 Application exemple Layout : JSplitPane supérieur JLabel + JSplitPane vertical JSplitPane JLabel JSplitPane Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 21 / 30 Application exemple Layout : JSplitPane intermédiaire JPanel + JSplitPane vertical JPanel de sélection de la base → grille de 1x3 JRadioButton (GridLayout) JSplitPane JPanel JSplitPane Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 22 / 30 Application exemple Layout : JSplitPane inférieur JPanel + JButton JPanel de saisie des symboles → grille de nxm JButton (GridLayout) JSplitPane JPanel JButton Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 23 / 30 Application exemple Auditeurs d’événements Capture des appuis touches KeyListener sur l’objet JFrame Implementé par l’objet TacheDAffichageDuConvertisseurBinDecHex Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 24 / 30 Application exemple Auditeurs d’événements Menus ActionListener sur chaque JMenuItem Implementé par l’objet BarreDeMenuDuConvertisseurBinDecHex Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 25 / 30 Application exemple Auditeurs d’événements Capture des clics ActionListener sur chaque JButton et JRadioButton Implementé par l’objet TacheDAffichageDuConvertisseurBinDecHex Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 26 / 30 Application exemple JSplitPane : détails Verrouillage de la séparation setEnabled(false) Remarque : méthode présente sur presque tous les composants, mais pas toujours la même sémantique Réglage de la taille du le séparateur setDividerSize(int) Modification du rendu de la bordure setBorder(Border) Remarque : méthode présente sur presque tous les composants Modification des tailles relatives des composants setResizeWeight(double) Remplacement d’une partie setTopComponent(JComponent), . . . Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 27 / 30 Application exemple JPanel : détails Association d’un layout setLayout(Layout) GridLayout Placement des composants en grille Spécification des dimensions à la création Placement ligne par ligne, colonne par colonne Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 28 / 30 Application exemple Fin ! Sébastien Jean (IUT Valence) Swing, introduction v1.0, 10 mai 2014 29 / 30
© Copyright 2024 ExpyDoc