Download - Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue
![Page 1: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/1.jpg)
Vos premiers pas en Swing
![Page 2: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/2.jpg)
Vous avez vu comment écrire la partie Modèle
On va voir la partie Vue
![Page 3: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/3.jpg)
Des éléments graphiques : ComponentDéfinition d’un élément graphique avecune dimension, une positionDes Coordonnées(Origine coin supérieur gauche, x (width) vers la droite et y (height) vers le bas)
Des morceaux d’écrans : GraphicsContexte graphiquePermet de dessiner –Changer de crayon : couleur, formes géométriques, images, chaînes de caractères- Automatiquement redimensionnés, réaffichés
Que trouve-ton dans les librairies graphiques : RAPPEL
Des éléments graphiques Contenant Container : qui contiennent d’autres éléments graphiques organisés
Du Formattage : LayoutManagerDéfinition de l’organisationEn ligne, en tableau, avec des contraintes,etc
![Page 4: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/4.jpg)
PRINCIPES GÉNÉRAUX
• Pour la création des composants :1. On choisit le container – on le
crée 2. On précise le panneau dans lequel
on dispose les composants (contenu)
3. On crée les événements sur les composants.
IL PEUT Y AVOIR PLUSIEURS PANNEAUX DANS UNE FENETRE
4
![Page 5: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/5.jpg)
PRINCIPES GÉNÉRAUX
Exemple pour la création des composants
1. Création d’un JFrame,2. Construction du contenu dans un panneau (JPanel) ajouté
au panneau de base : le contentPane3. Traitement des événements sur les composants par des
procédures appelées écouteurs (listener) d’événement
5
![Page 6: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/6.jpg)
PRINCIPES GÉNÉRAUX• Organiser l’affichage des composants
1. On crée un container (JPanel ou autre)2. Si on ne souhaite pas utiliser le layout par défaut, on
définit une mise en page des composants du container en lui associant un afficheur (LayoutManager = gestionnaire d’affichage)
3. On ajoute ensuite les composants primitifs au container
6
![Page 7: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/7.jpg)
CREATION D’UN PANNEAU
class ButtonPanel extends JPanel implements ActionListener // interface écouteur d'événements { private JButton Boutonjaune; private JButton BoutonBleu; private JButton BoutonRouge;
PLACER DES COMPOSANTS DANS LE PANNEAU public ButtonPanel() // constructeur de la classe ButtonPanel { Boutonjaune = new JButton("Jaune"); BoutonBleu = new JButton("Bleu"); BoutonRouge = new JButton("Rouge"); // Insertion des trois boutons dans l'objet ButtonPanel add(Boutonjaune); add(BoutonBleu); add(BoutonRouge); ASSOCIER DES EVENEMENTS AUX COMPOSANTS // Les sources d'événements sont déclarées à l'écouteur Boutonjaune.addActionListener(this); BoutonBleu.addActionListener(this); BoutonRouge.addActionListener(this); }
![Page 8: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/8.jpg)
{ public void actionPerformed(ActionEvent evt) // Permet de traiter l'événement en fonction de l'objet source { Object source = evt.getSource(); Color color = getBackground(); if (source == Boutonjaune) color = Color.yellow; else if (source == BoutonBleu) color = Color.blue; else if (source == BoutonRouge) color = Color.red; setBackground(color); repaint(); } }
TRAITEMENT DES EVENEMENTS
![Page 9: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/9.jpg)
CREATION DE LA FENETRE ET PLACEMENT DU PANNEAUclass ButtonFrame extends JFrame { public ButtonFrame() { setTitle("ButtonTest"); setSize(300, 200); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); Container contentPane = getContentPane(); contentPane.add(new ButtonPanel()); } } public class ButtonTest { public static void main(String[] args) { JFrame frame = new ButtonFrame(); frame.show(); }
![Page 10: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/10.jpg)
ARBRE DE COMPOSANTS • L’ajout d’un composant à un composant (container)
implique la construction d’un sous arbre - le composant ajouté est le fils
• Le parent contient les composants qui lui sont ajoutés• La méthode getParent() sur un composant retourne le
parent (de type Container)
10On a donc une arborescence des composants
![Page 11: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/11.jpg)
Exemple : ARBRE DE COMPOSANTS
11
![Page 12: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/12.jpg)
EXEMPLE D’APPLICATION JAVA SWING
12
JFrame frame = new JFrame("TopLevelDemo");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create the menu bar. Make it have a green background.JMenuBar greenMenuBar = new JMenuBar();greenMenuBar.setOpaque(true);/RVBgreenMenuBar.setBackground(new Color(154, 165, 127));greenMenuBar.setPreferredSize(new Dimension(200, 20));
//Create a yellow label to put in the content pane.JLabel yellowLabel = new JLabel();yellowLabel.setOpaque(true);yellowLabel.setBackground(new Color(248, 213, 131));yellowLabel.setPreferredSize(new Dimension(200, 180));
//Set the menu bar and add the label to the content pane.frame.setJMenuBar(greenMenuBar);frame.getContentPane().add(yellowLabel,BorderLayout.CENTER);
![Page 13: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/13.jpg)
PARTIE 1 : LA VUE• Principes généraux• Hiérarchies des composants
– Des Containers spécifiques– La famille des panneaux– Les autres composants
• Les afficheurs (Layout)• Les Look’N’Feel• Petits conseils
13
![Page 14: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/14.jpg)
DES CONTAINERS SPÉCIFIQUES• JFrame : le cadre principal d'une application. Il peut
contenir des menus et d'autres composants.• JDialog : une fenêtre de dialogue avec l'utilisateur.
Son « parent » (argument requis par ses créateurs) sert essentiellement à la placer dans l'écran.
• JApplet : classe de base pour les applets Java 2. Les applets sont des applications Java pouvant tourner à l'intérieur d'un navigateur Web.
14
![Page 15: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/15.jpg)
JFRAME : ILLUSTRATION
15
![Page 16: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/16.jpg)
JFRAME PAR L’EXEMPLE
16
import javax.swing.*;public class TryWindow {
static JFrame myWindow = new JFrame (''ceci est un titre''); public static void main (String[] args) {
myWindow.setBounds (50, 100, 400, 150); myWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);myWindow.setVisible(true);
}}(0,0) x
yh
w
X=50Y=100W=400H=150
![Page 17: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/17.jpg)
JFRAME PAR L’EXEMPLE
17
(0,0) x
yh
w
•setBounds définit la position et la taille•setVisible rend visible la fenêtre•setDefaultCloseOperation détermine ce qu'il se passe lorsque l'on ferme la fenêtre
DISPOSE_ON_CLOSE - détruit le JFrame et ses composants mais ne termine pas l'applicationDO_NOTHING_ON_CLOSEHIDE_ON_CLOSE
![Page 18: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/18.jpg)
AUTRES MÉTHODES• setTitle (String) : pour mettre le titre de la
fenêtre• setSize (int width, int height)• setLocation (int x, int y) : pour déplacer la fenêtre• dispose () : pour fermer la fenêtre• pack () : ajuste chaque composant à sa taille
optimale et retaille la fenêtre
18
![Page 19: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/19.jpg)
JDIALOG : CLASSES et BOÎTES DE DIALOGUES
• Il existe différentes classes pour créer des boîtes de dialogue : – JOptionPane : pour créer des boîtes de dialogue
standards– JColorChooser : pour choisir une couleur– JFileChooser : pour permettre de sélectionner un
fichier– ProgressMonitor : pour afficher la progression
d’une opération19
![Page 20: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/20.jpg)
![Page 21: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/21.jpg)
JOPTIONPANE• Permet de créer des boîtes de dialogue standards• Permet de faire des avertissements• Possède des éléments standardisés :
– Réponse oui/non,– Icônes de danger, d’erreurs, …
• Est modifiable (boutons, icônes, …) 21question
information
avertissement
erreur
![Page 22: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/22.jpg)
JCOLORCHOOSER• Permet de créer une boîte de dialogue pour choisir une
couleur• Possède différents onglets correspond aux différents types
d’encodage de couleurs
22
![Page 23: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/23.jpg)
JFILECHOOSER• Définit une boîte de dialogue pour permettre
sélectionner un fichier• Possède des boîtes de dialogue par défaut :
– Pour l’ouverture (showOpenDialog),– Pour la sauvegarde
(showSaveDialog)
23
![Page 24: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/24.jpg)
APPLET JAVA ÉTEND APPLET OU JAPPLET
• S’exécute dans une machine virtuelle (celle du navigateur web) et nécessite un fichier html
• N’a pas de fonction main mais vit un cycle (run)• Les principales méthodes sont :
– init () : quand la page html est chargée la 1ère fois– start () : après init et chaque fois que l’on revient sur la
page– stop () : quand on quitte la page html (on interrompt les
méthodes lancées dans start)– destroy () : quand l’applet est terminée (on libère toutes les
ressources) 24
![Page 25: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/25.jpg)
EXEMPLE D’APPLET : CODE JAVA<HTML> <TITLE> Applet HelloWorldApplet
</TITLE> <APPLET
CODE=« HelloWorldApplet.class » WIDTH=200 HEIGHT=300><PARAM NAME=« Chaine » value =
« Hello World »></APPLET></HTML>
25
import java.awt.*;Import java.applet.*;
public class HelloWorldApplet extends Applet {
Font f = new Font ( « Serif », Font.BOLD, 36); public void paint (Graphics g) { g.setFont(f); g.setColor(Color.red); g.drawString(getParameter (« Chaine »), 10, 30); }}
![Page 26: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/26.jpg)
SÉCURITÉ ET APPLET
• Une applet ne peut pas charger de librairies ou utiliser des méthodes natives
• Elle ne peut normalement pas lire ou écrire dans des fichiers de l’hôte sur lequel elle s’exécute
• Elle ne peut pas effectuer de connexions réseaux sauf sur l’hôte dont elle provient
• Elle ne peut lancer aucun programme de l’hôte sur lequel elle s’exécute
26Ces restrictions peuvent être levées par un certificat de sécurité (cf. jarsigner, policytool)
![Page 27: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/27.jpg)
Hiérarchie de composants
![Page 28: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/28.jpg)
HIÉRARCHIE DES CLASSES
28
![Page 29: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/29.jpg)
Aperçu de Swing Les Containers
Les containers
Ont un LayoutManager–add / remove d’un Component–Unicité de lieu–Indice des components
Méthodes à connaître
•repaint() ! validate() ! •setEnabled(true / false) : activé / désactivé•(Rectangle) getBounds / setBounds(x,y, w, h) : positionne et dimensionne•getWidth() : largeur / getHeight() : hauteur•getX() et getY() : obtenir une coordonnée•setVisible(true / false)•getBackground et setBackground [objet Color, définition RGB]
![Page 30: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/30.jpg)
La famille des panneaux
30
![Page 31: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/31.jpg)
TYPES DE PANNEAUX• Pour structurer les différents éléments graphiques, on
utilise des containers qui font partis de la famille des panneaux.
• On retrouve : – Le JPanel : panneau de base,– Le JScrollPane : qui permet d’obtenir des ascenseurs– Le JSplitPane : qui permet de diviser en 2 (seulement 2)– Le JTabbedPane : qui permet d’avoir différents onglets
pour les différents sous-contenus
31
![Page 32: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/32.jpg)
JPANEL• Le container le plus utilisé pour structurer
l’interface• Ne possède pas de réelles contraintes (la
gestion de l’organisation des éléments est déléguée à un Layout)
• Peut contenir des sous-panneaux
32
![Page 33: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/33.jpg)
JSCROLLPANE• Permet d’obtenir des ascenseurs de manière automatique,• Est créé en lui associant le composant que l’on souhaite
pouvoir scroller• Le composant inclus dans le JScrollPane doit implémenter
l’interface Scrollable• Quelques éléments qui implémentent cette interface :
– JTextField,– JTextArea,– JTree,– JTable
33
![Page 34: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/34.jpg)
JSPLITPANE• Permet de diviser en deux l’espace zone• Peut se construire avec les deux composants
contenus dans chacune des zones• Possède une orientation • (HORIZONTAL_SPLIT ou
VERTICAL_SPLIT)
34
![Page 35: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/35.jpg)
JTABBEDPANE• Permet d’avoir des onglets• Permet de mieux gérer l’espace de travail• Chaque onglet est créé avec son panel associé• L’onglet peut posséder une icône en plus ainsi qu’un
raccourci clavier (Mnemonic)• Peut-être fait de manière équivalente avec un
CardLayout (à ce moment, il n’y a pas d’onglet)
35
![Page 36: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/36.jpg)
LES DIFFÉRENTS PANNEAUX D’UN JFRAME, JDIALOG, JAPPLET
• S’obtiennent par :– getRootPane () zone de la fenêtre sous le titre– getContentPane () zone où les éléments sont ajoutés– getGlassPane () zone transparente dessinée au-
dessus du JRootPane utilisé pour afficher des pop-up menus 36
![Page 37: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/37.jpg)
Autres composants
37
![Page 38: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/38.jpg)
LISTE NON EXHAUSTIVE DE COMPOSANTS SWING
• JButton,• JLabel,• JTextField : une ligne de texte,• JTextArea : une zone de texte,• JCheckBox : boîte à cocher,• JRadioButton : bouton pour sélection unique (associé à
ButtonGroup),• JMenu et JMenuItem : un menu et ses éléments (inclus dans une
JMenuBar)• JPopMenu : un menu flottant,• JToolTip : une bulle d’aide,• … 38
![Page 39: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/39.jpg)
CRÉATION D’UN MENU
• Pour créer un menu, il faut : – Une barre de menu (JMenuBar),– Un menu (JMenu),– Des éléments dans ce menu (JMenuItem),
• Sur le menu, il est possible d’ajouter un Mnemonic– Est associé à un caractère (setMnemonic(char))– Permet d’accéder au menu directement en faisant : Alt+Char– Fonctionne également pour les boutons
39
![Page 40: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/40.jpg)
CRÉATION D’UN MENU
• Sur les JMenuItem il est possible d’ajouter des accélérateurs : – Permet d’associer une combinaison du type Ctrl+Touche– Se définit pas : setAccelerator(KeyStroke.getKeyStroke
( KeyEvent.LA_TOUCHE, ActionEvent.LE_MASQUE)
40
![Page 41: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/41.jpg)
ILLUSTRATION D’UN MENU
41
![Page 42: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/42.jpg)
JLABEL• Permet de définir un label• Peut comporter : une icône, du texte ou les
deux
42
ImageIcon ii = new ImageIcon(‘‘icon.jpg’’);Jlabel jl = new JLabel(‘‘text + icône’’, ii, JLabel.CENTER);
![Page 43: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/43.jpg)
JLABEL• Méthodes intéressantes :
– setEnabled(boolean) : pour activer/désactiver la zone (permet de griser le label)
– setHorizontalAlignement(constante) pour contrôler l’alignement du texte
43
![Page 44: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/44.jpg)
LES BORDURES• Il est possible d’attribuer une bordure à un JComponent :
setBorder(border)• Pour obtenir la bordure, on utilise les méthodes statiques de
la classe BorderFactory : Border Factory.createEtchedBorder()
44
![Page 45: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/45.jpg)
Aperçu de SwingDes composants
JComponent Hérite de ContainerMéthodes de commoditégetSize retourne une DimensionsetSize : une Dimension ou deux entiers–Une position•getLocation retourne un Point•setLocation avec un Point ou deux entiers–Coordonnées•Origine au coin supérieur gauche•x (width) vers la droite et y (height) vers le bas–Méthode public void paint(Graphicsg)
–setPreferredSize–setDoubleBuffered(true/false) / isDoubleBuffered()–setOpaque(true / false)•Dessin à l’écran : paint appelle–paintComponent–paintBorder–paintChildren
Les boutons–JButton /JToggleButton / JCheckBox / JRadioButton–Les champs textuels –JTextField/ JTextAreaEtc…
![Page 46: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/46.jpg)
Exemple• import javax.swing.*;
import java.awt.*;
public class FlowerPower { public static void main(String[] args) { JFrame fenetre = new JFrame(); JPanel panel = new JPanel();
JLabel etiquette = new JLabel("Aujourd'hui: "); JCheckBox premier = new JCheckBox("Lundi"); JCheckBox deuxieme = new JCheckBox("Mardi"); JCheckBox troisieme = new JCheckBox("Mercredi"); JCheckBox quatrieme = new JCheckBox("Jeudi"); JCheckBox cinquieme = new JCheckBox("Vendredi", true); JCheckBox sixieme = new JCheckBox("Samedi"); JCheckBox septieme = new JCheckBox("Dimanche");
![Page 47: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/47.jpg)
Exemple panel.add(etiquette);
panel.add(premier); panel.add(deuxieme); panel.add(troisieme); panel.add(quatrieme); panel.add(cinquieme); panel.add(sixieme); panel.add(septieme);
fenetre.setContentPane(panel); fenetre.setTitle("Wesh mate mon flow!"); fenetre.setBounds(100,100,200,200); fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fenetre.setVisible(true); } }
•
![Page 48: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/48.jpg)
FlowLayout par défaut
![Page 49: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/49.jpg)
Afficheurs
49
![Page 50: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/50.jpg)
COMMENT POSITIONNER LES COMPOSANTS ?
50
![Page 51: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/51.jpg)
DEUX MANIÈRES• Positionner de manière absolue, revient à :
– Retirer tout gestionnaire d’affichage (setLayout(null))– Placer un par un les éléments en leur donnant leur
position dans la fenêtre (méthode setBounds)
• Positionner en utilisant des gestionnaires d’affichage
51
![Page 52: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/52.jpg)
MISE EN PAGE DES COMPOSANTS• La mise en page des éléments s’effectue à l’aide d’un
gestionnaire d’affichage (Layout),
• Tous les containers possèdent une méthode setLayout qui permet de spécifier le type de gestionnaire d’affichage
• On peut ajouter des contraintes lorsqu’on ajoute un composant
52
![Page 53: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/53.jpg)
LES DIFFÉRENTS TYPE DE LAYOUT• BorderLayout,• GridLayout,• FlowLayout,• CardLayout,• BoxLayout,• GridBagLayout
53
![Page 54: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/54.jpg)
UTILISATION D’UN LAYOUT1. Création du layout Exemple : BorderLayout bl = new BorderLayout())
2. Association au container : panel.setLayout(bl)
3. Ajout de composants au container, avec ou sans contrainte
Exemple : panel.add(button, BorderLayout. EAST) 54
![Page 55: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/55.jpg)
BORDERLAYOUT• Définit des zones dans lesquelles ajouter des
éléments• Intéressant pour le panneau principal
55
![Page 56: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/56.jpg)
GRIDLAYOUT• Définit une grille où ajouter les composants• L’ajout des composants se fait sans préciser de contraintes• On déclare le layout de la manière suivante :
– new GridLayout(0,2) // row, column 0 signifie autant qu’on veut
56
![Page 57: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/57.jpg)
FLOWLAYOUT• On ajoute au fur et à mesure les composants, si cela
ne tient pas dans la ligne, on commence une nouvelle ligne
• Gestionnaire d’affichage par défaut des JPanel• Possibilité de spécifier l’alignement
57
![Page 58: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/58.jpg)
CARDLAYOUT• Permet d’empiler des composants (suivant des
panneaux)• Le dernier ajouté ou celui spécifié est visible• Concept de la pile de cartes
58
http://java.sun.com/docs/books/tutorial/uiswing/layout/card.html
![Page 59: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/59.jpg)
BOXLAYOUT• Définit une boîte dans laquelle seront ajoutés les
différents composants• Cette boîte peut-être :
– Horizontale : X_AXIS– Verticale : Y_AXIS
• On ajoute les éléments au fur et à mesure
59
![Page 60: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/60.jpg)
GRIDBAGLAYOUT (1/2)
• Gestionnaire d’affichage relativement compliqué à mettre en place
• Demande de définir toutes les contraintes des différents composants à placer
• Place les composants au-travers une grille modulaire
60
![Page 61: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/61.jpg)
GRIDBAGLAYOUT (2/2)
61
![Page 62: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/62.jpg)
Aperçu de Swinget aussi…
Les îcones : javax.swing.ImageIcon créer avec le nom d’un fichier image par exemple
Menus : les JMenuBar, JMenu, JMenuItem
Les Layout :Basé sur PreferredSize ou une maximisation de l’élément•BorderLayout –par défaut dans une fenêtre–ajout en précisant la zone–add("North", comp)•FlowLayout : en ligne•GridLayout : en tableau•GridBagLayout : avec des contraintes•etc.
![Page 63: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/63.jpg)
Modèle & Vue
![Page 64: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/64.jpg)
MODÈLE/VUE AVEC LES JLIST ET LES JTABLE
• Il est possible de partager le modèle de données d’une JTable ou d’une JList à d’autres composants considérés comme d’autres vues de l’objet JTable ou JList
• Par exemple : une liste de noms affichée dans une JList. La JList est une vue (interactive) de la liste de noms permettant la sélection d’élément.
• Une représentation tabulaire de la même liste est une autre vue
• Un texte qui indique le nombre d’éléments de la liste est une autre vue du modèle
64
![Page 65: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/65.jpg)
ILLUSTRATION
65
![Page 66: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/66.jpg)
Définition du modèle associé
• Si le modèle est décrit par une interface ListModel / TableModel prédéfinie, • L’interface permet d’expliciter comment gérer les données du
modèle et d’ajouter des vues (écouteurs de changements sur le modèle)
Rem : il existe généralement une classe Adapter nommée Default<X>Model avec <X>=List ou Table
• Si le modèle change, il génère un événement et notifie les vues (via des méthodes en fire<…>) 66
![Page 67: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/67.jpg)
Définition d’une nouvelle vue
• Pour qu’un autre composant soit considéré comme une vue, il doit : – Implémenter l’interface adéquate pour être écouteur de
l’événement de changement de modèle– Se faire ajouter à la liste des écouteurs du modèle
67
![Page 68: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/68.jpg)
JLIST
• Possède différents constructeurs : – Données fixes :
• JList (Vector listData)• JList (Object[] listData)
– Données modifiables :• JList (ListModel dm)
68
![Page 69: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/69.jpg)
JLIST• Exemple
69
String listData[]= {…,« Carlos »,…, « Ramier»};DefaultListModel model = new DefaultListModel();for (int i=0; i<listData.length; i++) model.addElement(listData[i]);
JList dataList = new JList(model);
JScrollPane listeScroll = new JScrollPane(dataList);
![Page 70: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/70.jpg)
JLIST : LE MODÈLE ASSOCIÉ• Pour le modèle, utiliser la classe DefaultListModel. Ce modèle
stocke les objets sous forme de vecteur et fournit les méthodes suivantes : – addElement (Object),– boolean contains(Object), – boolean removeElement(Object)– Object get(index), Object remove(index), int size()– addListDataListener (ListDataListener l), remove…– fireContentsChanged,fireIntervalAdded,
fireIntervalRemoved (Object source, int index0, int index1)70
![Page 71: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/71.jpg)
ILLUSTRATION
71
![Page 72: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/72.jpg)
JLIST• Possède une méthode qui permet de spécifier le mode de
sélection : setSelectionMode (int mode). mode peut valoir : – SINGLE_SELECTION– SINGLE_INTERVAL_SELECTION– MULTIPLE_INTERVAL_SELECTION
• Possède une méthode addListSelectionListener () qui écoute un ListSelectionEvent e qui est émis à chaque fois qu’une sélection change
et implémente une méthode : valueChanged72
![Page 73: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/73.jpg)
JLIST : LA VUE
• Une vue d’une JList implémente l’interface ListDataListener. Il y a trois méthodes : – void contentsChanged(ListDataEvent e) : contenu de la liste
a changé– void intervalAdded(ListDataEvent e) – void intervalRemoved(ListDataEvent e)
73
l
![Page 74: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/74.jpg)
JLIST : PLUSIEURS VUES ?!
• Créer un modèle instance de DefaultListModel et le mémoriser. Créer ensuite la liste avec ce modèle.
• Pour chaque composant désirant être informé des changements ( = d’autres vues ou le contrôleur) :– Mémoriser le modèle ( = le stocker dans un membre)– Implémenter ListDataListener– Enregistrer le composant dans le modèle avec
addListDataListener74
![Page 75: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/75.jpg)
JTABLE• Un constructeur possible de JTable :
– JTable (Object[][] rowData, Object[] columnNames)– On peut accéder au modèle sous-jacent avec la méthode :
• TableModel getModel()• Un autre constructeur avec directement le modèle :
75
String nomsCol[]={«Prenom», «Nom»};String rows[][] = { {«Dinah»,«Cohen»}, … ,
{«Said», «Kharrazen»}};DefaultTableModel model = new DefaultTableModel(rows, nomsCol);JTable table = new JTable(model);
![Page 76: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/76.jpg)
JTABLE : LE MODÈLE ASSOCIÉ• Il existe 3 différents éléments pour créer un modèle :
– L’interface TableModel– La classe AbstractTableModel qui implémente TableModel– La classe DefaultTableModel
• DefaultTableModel est le plus simple à utiliser, quelques constructeurs associés : – DefaultTableModel(int row, int col)– DefaultTableModel(Object[][] data, Object[]
columnNames)– DefaultTableModel(Vector data, Vector columnNames)– … 76
![Page 77: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/77.jpg)
JTABLE : LA VUE• Une vue implémente l’interface TableDataListener• Il y a une méthode :
– void tableChanged(TableModelEvent e)• L’événement associé TableModelEvent :
– int getType() : INSERT, UPDATE, DELETE– int getColumn()– int getFirstRow()– int getLastRow()
77
![Page 78: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/78.jpg)
JTABLE : PLUSIEURS VUES ?!• Créer un modèle, par exemple une instance de
DefaultTableModel et le mémoriser• Pour chaque composant désirant être informé des
changements (les vues et/ou le contrôleur) : – Mémoriser le modèle– Implémenter TableModelListener– Enregistrer le composant dans le modèle avec :
addTableModelListener
78
![Page 79: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/79.jpg)
SYNTHESE
![Page 80: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/80.jpg)
Hiérarchie Swing
![Page 81: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/81.jpg)
Aperçu de Swing Les Containers
Les containers
Ont un LayoutManager–add / remove d’un Component–Unicité de lieu–Indice des components
Méthodes à connaître
•repaint() ! validate() ! •setEnabled(true / false) : activé / désactivé•(Rectangle) getBounds / setBounds(x,y, w, h) : positionne et dimensionne•getWidth() : largeur / getHeight() : hauteur•getX() et getY() : obtenir une coordonnée•setVisible(true / false)•getBackground et setBackground [objet Color, définition RGB]
![Page 82: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/82.jpg)
Aperçu de SwingDes composants
JComponent Hérite de ContainerMéthodes de commoditégetSize retourne une DimensionsetSize : une Dimension ou deux entiers–Une position•getLocation retourne un Point•setLocation avec un Point ou deux entiers–Coordonnées•Origine au coin supérieur gauche•x (width) vers la droite et y (height) vers le bas–Méthode public void paint(Graphicsg)
–setPreferredSize–setDoubleBuffered(true/false) / isDoubleBuffered()–setOpaque(true / false)•Dessin à l’écran : paint appelle–paintComponent–paintBorder–paintChildren
Les boutons–JButton /JToggleButton / JCheckBox / JRadioButton–java.awt.ButtonGroup (méthode add)Les champs textuels –JTextField/ JTextAreaEtc…
![Page 83: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/83.jpg)
Aperçu de Swinget aussi…
Les îcones : javax.swing.ImageIcon créer avec le nom d’un fichier image par exemple
Menus : les JMenuBar, JMenu, JMenuItem
Les Layout :Basé sur PreferredSize ou une maximisation de l’élément•BorderLayout –par défaut dans une fenêtre–ajout en précisant la zone–add("North", comp)•FlowLayout : en ligne•GridLayout : en tableau•GridBagLayout : avec des contraintes•etc.
![Page 84: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/84.jpg)
Aperçu de Swing Les Containers
Les containers
Ont un LayoutManager–add / remove d’un Component–Unicité de lieu–Indice des components
Méthodes à connaître
•repaint() ! validate() ! •setEnabled(true / false) : activé / désactivé•(Rectangle) getBounds / setBounds(x,y, w, h) : positionne et dimensionne•getWidth() : largeur / getHeight() : hauteur•getX() et getY() : obtenir une coordonnée•setVisible(true / false)•getBackground et setBackground [objet Color, définition RGB]
![Page 85: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/85.jpg)
Exemple de code
![Page 86: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/86.jpg)
EXEMPLE D’APPLICATION JAVA SWING
87
JFrame frame = new JFrame("TopLevelDemo");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create the menu bar. Make it have a green background.JMenuBar greenMenuBar = new JMenuBar();greenMenuBar.setOpaque(true);/RVBgreenMenuBar.setBackground(new Color(154, 165, 127));greenMenuBar.setPreferredSize(new Dimension(200, 20));
//Create a yellow label to put in the content pane.JLabel yellowLabel = new JLabel();yellowLabel.setOpaque(true);yellowLabel.setBackground(new Color(248, 213, 131));yellowLabel.setPreferredSize(new Dimension(200, 180));
//Set the menu bar and add the label to the content pane.frame.setJMenuBar(greenMenuBar);frame.getContentPane().add(yellowLabel,BorderLayout.CENTER);
![Page 87: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/87.jpg)
Vous avez vu comment écrire la partie Modèlela partie Vue
Reste comment mettre en place le contrôle ?
![Page 88: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/88.jpg)
Observer ObservableRappel
![Page 89: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/89.jpg)
Moyen
Définir une dépendance de “1” à “n” entre des objets telle que
lorsque l’état d’un objet change,
tous ses dépendants sont informés et mis à jour automatiquement
![Page 90: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/90.jpg)
Besoin d’événements• Le pattern “Observer” décrit
– comment établir les relations entre les objets dépendants.
• Les objets-clés sont – la source
• Peut avoir n’importe quel nombre d’observateurs dépendants• Tous les observateurs sont informés lorsque l’état de la source change
– l’observateur.• Chaque observateur demande à la source son état afin de se synchroniser
![Page 91: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/91.jpg)
Structure
![Page 92: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/92.jpg)
Implémentations Java du pattern
Une classe et une interface : class Observable {... } et interface Observer
Un objet Observable doit être une instance de la classe qui dérive de la classe Observable
Un objet observer doit être instance d’une classe qui implémente l’interface Observervoid update(Observable o, Object arg);
Des listeners : ajouter des listerners, notifier les listeners avec des évenements, réagir aux événements
![Page 93: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/93.jpg)
Listeners Supported by Swing Components
• http://java.sun.com/docs/books/tutorial/uiswing/events/intro.html
![Page 94: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/94.jpg)
CREATION D’UN PANNEAU
class ButtonPanel extends JPanel implements ActionListener // interface écouteur d'événements { private JButton Boutonjaune; private JButton BoutonBleu; private JButton BoutonRouge;
PLACER DES COMPOSANTS DANS LE PANNEAU public ButtonPanel() // constructeur de la classe ButtonPanel { Boutonjaune = new JButton("Jaune"); BoutonBleu = new JButton("Bleu"); BoutonRouge = new JButton("Rouge"); // Insertion des trois boutons dans l'objet ButtonPanel add(Boutonjaune); add(BoutonBleu); add(BoutonRouge); ASSOCIER DES EVENEMENTS AUX COMPOSANTS // Les sources d'événements sont déclarées à l'écouteur Boutonjaune.addActionListener(this); BoutonBleu.addActionListener(this); BoutonRouge.addActionListener(this); }
![Page 95: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/95.jpg)
{ public void actionPerformed(ActionEvent evt) // Permet de traiter l'événement en fonction de l'objet source { Object source = evt.getSource(); Color color = getBackground(); if (source == Boutonjaune) color = Color.yellow; else if (source == BoutonBleu) color = Color.blue; else if (source == BoutonRouge) color = Color.red; setBackground(color); repaint(); } }
TRAITEMENT DES EVENEMENTS
![Page 96: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/96.jpg)
CREATION DE LA FENETRE ET PLACEMENT DU PANNEAUclass ButtonFrame extends JFrame { public ButtonFrame() { setTitle("ButtonTest"); setSize(300, 200); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); Container contentPane = getContentPane(); contentPane.add(new ButtonPanel()); } } public class ButtonTest { public static void main(String[] args) { JFrame frame = new ButtonFrame(); frame.show(); }
![Page 97: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/97.jpg)
LE CONTRÔLEURZoom sur les événements et les Listeners
100
![Page 98: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/98.jpg)
LE CONTRÔLEUR• Aperçu général• Les types d’événements• Les écouteurs associés• Méthodes pour implémenter les écouteurs• Evénements Sémantiques• Les Actions• Transition vers le modèle MVC
101
![Page 99: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/99.jpg)
PRINCIPES• Programmation par événements :
1. Un écouteur s’abonne à une source2. La source déclenche l’événement3. La source le passe aux abonnés4. Les abonnés réagissent
• Les composants sont des sources• Evénements déclenchés par une action de
l’utilisateur102
![Page 100: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/100.jpg)
LE CONTRÔLEUR• Aperçu général• Les différents types d’événement• Les différents écouteurs associés• Méthodes pour implémenter les écouteurs• Evénements Sémantiques• Les Actions
103
![Page 101: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/101.jpg)
HÉRITAGE DES EVÉNEMENTS
104
![Page 102: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/102.jpg)
Exemples d’événements• Définis dans java.awt.event
– FocusEvent : activation ou désactivation du focus du clavier
– MouseEvent : mouvement et clics de souris, et entrer/sortir d’un composant
– KeyEvent : événements clavier– WindowEvent : dés/activation, ouverture,
fermeture, dés/iconification de fenêtres– ComponentEvent : changement de taille, position ou
visibilité d’un composant 105
![Page 103: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/103.jpg)
AWTEvent• dérive de java.util.EventObject• contient par héritage
– getSource() qui renvoie la source de l’événement (objet où l’événement s’est produit)
• définit des constantes permettant d’identifier des classes d’événements : – MOUSE_EVENT_MASK– MOUSE_MOTION_EVENT_MASK– WINDOW_EVENT_MASK– …
106
![Page 104: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/104.jpg)
GESTION GLOBALE AVEC ENABLEEVENTS()
public class toto extends JFrame { public toto() { enableEvents(AWTEvent.WINDOW_EVENT_MASK); protected void processWindowEvent(WindowEvent e) { if (e.getID() == WindowEvent.WINDOW_CLOSING){ dispose(); // libère les ressources System.exit(0); } super.processWindowEvent( e ): // Passe l’ev. } }} 107
![Page 105: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/105.jpg)
Filtrer les événements
• Une méthode ENABLEEVENTS() – Qui filtre les types d’événements particuliersà partir d’ID
Pour WindowEvent : WINDOW_OPENED, WINDOW_CLOSING, …
108
![Page 106: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/106.jpg)
LE CONTRÔLEUR• Aperçu général• Les différents types d’événement• Les différents écouteurs associés• Méthodes pour implémenter les écouteurs• Evénements Sémantiques• Les Actions
109
![Page 107: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/107.jpg)
LES ECOUTEURS
• Depuis (JAVA 1.1) – interfaces écouteurs correspondants aux
masques d’événements principaux. – extensions de java.util.EventListener.
110
![Page 108: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/108.jpg)
LES ECOUTEURS
– WindowListener : pour les événements de la fenêtre– MouseListener : pour les clics et entrées/sorties fenêtre– MouseMotionListener : pour les mouvements de la souris– KeyListener : pour les touches clavier– FocusListener : pour le focus clavier– ComponentListener : pour la configuration du composant
111
![Page 109: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/109.jpg)
Contrôle des Fenêtres• WINDOWSLISTENER
– Concerne tout ce qui est en rapport avec la fenêtre :
• Ouvrir,• Fermer,• Réduire,• Agrandir,
…
112
![Page 110: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/110.jpg)
Contrôle de la souris• MOUSELISTENER, MOUSEMOTIONLISTENER et
MOUSEINPUTLISTENER
– Concernent tout ce qui est en rapport avec la souris :
• Clic• Déplacement• Gestion des boutons….
114
![Page 111: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/111.jpg)
MOUSELISTENER & MOUSEMOTIONLISTENER
• MouseListener permet de gérer :– Les différents états du clic souris
• Clic• Pressé,• Relâché
– Et également l’entrée/sortie sur un composant
• MouseMotionListener permet de gérer les mouvements de la souris sur un composant avec bouton appuyé ou relâché 115
![Page 112: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/112.jpg)
MOUSEINPUTLISTENER• interface écouteur de javax.swing.event.
– Implémente• un MouseListener et un MouseMotionListener
ATTENTION : il n’existe pas de méthode addMouseInputListener il faut enregistrer l’écouteur deux fois :– avec addMouseListener– et avec addMouseMotionListener 118
![Page 113: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/113.jpg)
Contrôle du clavier• KEYLISTENER, FOCUSLISTENER
– Concernent tout ce qui est en rapport avec le clavier :
• tapé• pressé• ….
119
![Page 114: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/114.jpg)
KEYLISTENER & FOCUSLISTENER• KeyListener, comme pour la souris, on va
retrouver la notion de :– Pressé,– Relâché,– Tapé
• FocusListener permet de gérer le focus et donc de savoir si un composant a obtenu le focus ou s’il la perdu 120
![Page 115: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/115.jpg)
Contrôle des composants
• COMPONENTLISTENER – Permet de gérer :
• L’apparition/disparition d’un composant• Le déplacement d’un composant• Le redimensionnement d’un composant
123
![Page 116: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/116.jpg)
Quid de l’utilisation
• Il faut implémenter toutes les méthodes de l’interface, y compris celles dont on ne se sert pas………
128
![Page 117: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/117.jpg)
• Utiliser les classes Adapter– Elles implémentent une interface (ici écouteur)
mais dont les méthodes n’ont pas de code
• Etendre la classe Adapter choisie en redéfinissant uniquement les méthodes que l’on souhaite utiliser
129
![Page 118: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/118.jpg)
COMMENT AJOUTER UN ECOUTEUR ?!
• Pour ajouter un écouteur, on utilise la méthode addXXXListener (XXXListener l) sur le composant désiré
• Il suffit alors de remplacer les XXX parce que l’on souhaite avoir
130
![Page 119: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/119.jpg)
LE CONTRÔLEUR• Aperçu général• Les différents types d’événement• Les différents écouteurs associés• Méthodes pour implémenter les écouteurs• Evénements Sémantiques• Les Actions
131
![Page 120: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/120.jpg)
POUR IMPLÉMENTER LES ÉCOUTEURS
• Il existe plusieurs méthodes
– Etendre d’une classe Adapter ou implémenter une interface Listener
– Définir des classes internes– Définir des classes anonymes
132
![Page 121: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/121.jpg)
IMPLÉMENTER UNE INTERFACE
public class MaClass extends MouseListener { ... unObject.addMouseListener(this); ... void mouseClicked(MouseEvent e) {} void mouseEntered(MouseEvent e) {} void mouseExited(MouseEvent e) {} void mousePressed(MouseEvent e) {} void mouseReleased(MouseEvent e) {}} 133
![Page 122: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/122.jpg)
ETENDRE UNE CLASSE
public class MaClass extends MouseAdapter { ... unObject.addMouseListener(this); ... public void mouseClicked(MouseEvent e) { ... // l’implementation de la méthode // associée à l’événement vient ici ... }} 134
![Page 123: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/123.jpg)
DÉFINIR UNE CLASSE INTERNE
window.addWindowListener(new WindowHandler());
// classe interne WindowHandler// pour les événements de fermeture
class WindowHandler extends WindowAdapter { // Méthode pour WINDOW_CLOSING event public void windowClosing( WindowEvent e ) { window.dispose(); System.exit(0); }} 135
![Page 124: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/124.jpg)
DÉFINIR UNE CLASSE ANONYME
button = new JButton("test"); button.addMouseListener(new MouseAdapter() { @Override public void mouseClicked (MouseEvent e) { // code que l'on souhaite effectuer } });
136
![Page 125: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/125.jpg)
LE CONTRÔLEUR• Aperçu général• Les différents types d’événement• Les différents écouteurs associés• Méthodes pour implémenter les écouteurs• Evénements Sémantiques• Les Actions
137
![Page 126: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/126.jpg)
Evénements sémantiques
• Evénements spécifiques liés à des opérations spécifiques sur certains composants– Sélection d’éléments dans un menu,– Clic sur un bouton,– …
• Trois classes de bases d’événements sémantiques dérivent de AWTEvent
138
![Page 127: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/127.jpg)
Hiérarchie
Ces trois événements sémantiques sont dans : java.awt.event
139
![Page 128: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/128.jpg)
EVÉNEMENTS ACTIONEVENT• une action sur un composant réactif :
– Clic sur un item de menu,– Clic sur un bouton,– …
• Sont émis par les objets de type :– Boutons : JButton, JToggleButton, JCheckBox– Menus : JMenu, JMenuItem, JCheckBoxMenuItem,
JRadioButtonMenuItem …– Texte : JTextField 140
![Page 129: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/129.jpg)
EVÉNEMENTS : ITEMEVENT
• composant est sélectionné ou désélectionné• émis par les objets de type :
– Boutons : JButton, JToggleButton, JCheckBox– Menus : JMenu, JMenuItem, JCheckBoxMenuItem,
JRadioButtonMenuItem– Mais aussi JComboBox, JList
141
![Page 130: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/130.jpg)
EVÉNEMENTS ADJUSTMENTEVENT
• Se produisent quand un élément ajustable comme une JScrollBar sont ajustés
• Sont émis par ScrollBar, JScrollBar
142
![Page 131: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/131.jpg)
ECOUTEURS ASSOCIÉS AUX EVÉNEMENTS SÉMANTIQUES
• Chaque interface contient une unique méthode : – ActionListener : void actionPerformed(ActionEvent e)– ItemListener : void itemStateChanged(ItemEvent e)– AdjustementListener : void adjustementValueChanged
(AdjustementEvent e)
143
![Page 132: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/132.jpg)
Les sous-classes de AbstractButton peuvent générer des événements ChangeEvent quand on modifie l’état d’un bouton
Les dérivés de JMenuItem génèrent des MenuDragMouseEvent et des MenuKeyEvent
Une JList génère des SelectionEvent
Les modèles associés aux listes et aux tables génèrent des ListDataEvent et des TableModelEvent (envoyés aux vues quand des changements se produisent sur le modèle)
144
![Page 133: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/133.jpg)
EXEMPLE
• Cette applet contrôle l’apparition d’une fenêtre supplémentaire (un JFrame) qui apparaît lorsque l’on enfonce le bouton ‘‘Start playing…’’
145
![Page 134: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/134.jpg)
EXEMPLE• Dans le JFrame on trouvera un label et une
checkbox qui permettra de cocher si le label est rendu visible ou invisible
• On pourra aussi iconifier le JFrame ou non
• Les événements captés écriront leur source et leur type au centre du cadre de l’applet précédent dans la zone de texte 146
![Page 135: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/135.jpg)
LE CONTRÔLEUR• Aperçu général• Les différents types d’événement• Les différents écouteurs associés• Méthodes pour implémenter les écouteurs• Evénements Sémantiques• Les Actions
153
![Page 136: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/136.jpg)
LES ACTIONS : CONCEPT• Une action est objet de n’importe quelle
classe qui implémente l’interface Action.
• L’interface Action étend l’interface ActionListener – un objet Action est aussi un écouteur
d’événement d’action de type ActionEvent
154
![Page 137: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/137.jpg)
LES ACTIONS : PRINCIPE
• Les composants Swing suivants possèdent une méthode add() qui prend en argument un type Action : – JMenu ,– JPopupMenu,– JToolBar
155
![Page 138: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/138.jpg)
LES ACTIONS : PRINCIPE
• Lorsque l’on fait un add() d’un objet Action sur un menu ou une barre d’outils, la méthode add crée un composant à partir de l’objet Action qui est automatiquement du bon type par rapport au composant auquel on l’ajoute (i.e. item de menu ou bouton)
156
![Page 139: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/139.jpg)
LES ACTIONS : INTÉRÊT• Ainsi, si on ajoute un objet Action à un
JMenu, add() ajoute un JMenuItem au menu. Si on ajoute ce même objet à une JToolBar, c’est un JButton qui lui sera ajouté.
• Comme l’objet Action est comme son propre écouteur, le bouton et l’item de menu supporteront la même procédure d’action.
157
![Page 140: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/140.jpg)
PROPRIÉTÉS• Il y a 7 propriétés standards
– NAME : String– SMALL_ICON : Icon (pour la toolbar)– SHORT_DESCRIPTION : String (pour le tooltip)– ACCELERATOR_KEY : KeyStroke (accélérateur)– LONG_DESCRIPTION : String (aide contextuelle)– MNEMONIC_KEY : int (mnémonique de l’action)– ACTION_COMMAND_KEY : (keymap associée au comp.)La classe Property est dans java.util.
158
![Page 141: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/141.jpg)
MODIFICATION/RÉCUPÉRATION DES PROPRIÉTÉS D’ACTION
• void putValue (String key, Object value) : associe l’objet value avec la clé key dans le dictionnaire pour l’objet Action
• Exemple : pour stocker un nom d’action putValue(NAME, leNom) (On utilise la clé standard NAME pour stocker l’objet leNom)
159
![Page 142: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/142.jpg)
MODIFICATION/RÉCUPÉRATION DES PROPRIÉTÉS D’ACTION
• Object getValue (String key) : retourne l’objet correspondant à la clé key dans le dictionnaire.
• Pour retrouver l’icône de la toolbar dans une méthode d’une classe d’action : Icon lineIcon = (Icon) getValue (SMALL_ICON)
160
![Page 143: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/143.jpg)
AUTRES MÉTHODES
• void addPropertyChangeListener (PropertyChangeListener l) : ajoute un listener qui écoute les changements de propriétés (état d’activation). Utilisé par les conteneurs
• void removePropertyChangeListener (PropertyChangeListener listener)
161
![Page 144: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/144.jpg)
AUTRES MÉTHODES
• boolean isEnabled() : retourne true si l’objet d’action est actif et accessible
• void setEnabled(boolean state) : permet d’agir à la fois sur le bouton de la barre d’outils et l’élément de menu si tous deux ont été créés à partir de la même action
162
![Page 145: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/145.jpg)
ABSTRACTACTION• Est défini dans le package javax.swing et
implémente l’interface Action• Fournit des mécanismes pour stocker les
propriétés d’une action• Possède trois constructeurs :
– AbstractAction ( )– AbstractAction ( String name )– AbstractAction ( String name, Icon icon)
163
![Page 146: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/146.jpg)
Quid de l’insertion des Listenersdans MVC
Rappelez vous du premier Cours
![Page 147: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/147.jpg)
Mise en place• Exemple assez simple d’une application qui permet
de modifier un volume.
• Plusieurs vues pour représenter le volume et après toutes modifications, toutes les vues devront être synchronisées.
168
![Page 148: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/148.jpg)
Le modèle : la base
169
public class VolumeModel { private int volume; public VolumeModel(){ super(); volume = 0; } public int getVolume() { return volume; } public void setVolume(int volume) { this.volume = volume; }}
![Page 149: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/149.jpg)
Pour la notification
• Pour permettre la notification de changement de volume, on utilise des listeners
• On crée donc un nouveau listener (VolumeListener) et un nouvel événement (VolumeChangeEvent)
170
![Page 150: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/150.jpg)
Le listener et l’event
171
import java.util.EventListener;public interface VolumeListener extends EventListener { public void volumeChanged(VolumeChangedEvent event);}
import java.util.EventObject;public class VolumeChangedEvent extends EventObject{ private int newVolume; public VolumeChangedEvent(Object source, int newVolume){ super(source); this.newVolume = newVolume; } public int getNewVolume(){ return newVolume; }}
![Page 151: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/151.jpg)
Implémentation du système d’écouteurs dans le modèle (1/2)
172
import javax.swing.event.EventListenerList;public class VolumeModel { private int volume; private EventListenerList listeners; public VolumeModel(){ this(0); } public VolumeModel(int volume){ super(); this.volume = volume; listeners = new EventListenerList(); } public int getVolume() { return volume; } public void setVolume(int volume) { this.volume = volume; fireVolumeChanged(); }
![Page 152: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/152.jpg)
Implémentation du système d’écouteurs dans le modèle (2/2)
173
public void addVolumeListener(VolumeListener listener){ listeners.add(VolumeListener.class, listener); } public void removeVolumeListener(VolumeListener l){ listeners.remove(VolumeListener.class, l); } public void fireVolumeChanged(){ VolumeListener[] listenerList = (VolumeListener[])
listeners.getListeners(VolumeListener.class); for(VolumeListener listener : listenerList){ listener.volumeChanged(
new VolumeChangedEvent(this, getVolume())); } }}
![Page 153: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/153.jpg)
Ce que l’on a maintenant• Le modèle est maintenant capable d’avertir
tous ses écouteurs à chaque changement de volume
• En fonction de l’application, il est possible d’imaginer plusieurs listeners par modèles et d’autres événements dans les listeners (par exemple quand le volume dépasse certains seuils)
• Remarque : le modèle peut devenir très vite conséquent
174
![Page 154: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/154.jpg)
Pré-requis pour le contrôleur
• Pour éviter d’être dépendant de Swing, on va créer une classe abstraite représentant une vue de volume
175
public abstract class VolumeView implements VolumeListener{ private VolumeController controller = null; public VolumeView(VolumeController controller){ super(); this.controller = controller; } public final VolumeController getController(){ return controller; } public abstract void display(); public abstract void close();}
![Page 155: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/155.jpg)
Le Contrôleur
• Manipulera des objets de type View et non plus de type Swing
• Un seul contrôleur sera créé dans un soucis de simplicité puisque les 3 vues font la même chose.
• Dans le cas de vues complètement différentes, il est fortement conseillé d’utiliser plusieurs contrôleurs
176
![Page 156: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/156.jpg)
Les vues• Nous supposons 3 vues (dans le cadre du cours,
nous n’en montrerons qu’ une) : – Une vue permettant de modifier le volume avec
un champ de texte et valider par un bouton– Une vue permettant de modifier le volume à
l’aide d’une jauge + bouton pour valider– Une vue listant les différents volumes
• Toutes ces vues sont représentées par une JFrame
177
![Page 157: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/157.jpg)
Contrôleur (1/2)
178
public class VolumeController { public VolumeView fieldView = null; public VolumeView spinnerView = null; public VolumeView listView = null; private VolumeModel model = null; public VolumeController (VolumeModel model){ this.model = model; fieldView = new JFrameFieldVolume(this, model.getVolume()); spinnerView = new JFrameSpinnerVolume(this, model.getVolume()); listView = new JFrameListVolume(this, model.getVolume()); addListenersToModel(); } private void addListenersToModel() { model.addVolumeListener(fieldView); model.addVolumeListener(spinnerView); model.addVolumeListener(listView); }
![Page 158: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/158.jpg)
Contrôleur (2/2)
179
public void displayViews(){ fieldView.display(); spinnerView.display(); listView.display(); } public void closeViews(){ fieldView.close(); spinnerView.close(); listView.close(); } public void notifyVolumeChanged(int volume){ model.setVolume(volume); }}
![Page 159: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/159.jpg)
Les vues• Nous allons faire 3 vues (dans le cadre du cours,
nous n’en montrerons qu’ une) : – Une vue permettant de modifier le volume avec
un champ de texte et valider par un bouton– Une vue permettant de modifier le volume à
l’aide d’une jauge + bouton pour valider– Une vue listant les différents volume
• Toutes ces vues sont représentées par une JFrame
180
![Page 160: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/160.jpg)
JFrameField (1/3)
181
import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.text.NumberFormat;import javax.swing.*;import javax.swing.text.DefaultFormatter;public class JFrameFieldVolume extends VolumeView
implements ActionListener{ private JFrame frame = null; private JPanel contentPane = null; private JFormattedTextField field = null; private JButton button = null; private NumberFormat format = null; public JFrameFieldVolume(VolumeController controller) { this(controller, 0); } public JFrameFieldVolume(VolumeController controller, int volume){ super(controller); buildFrame(volume); }
![Page 161: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/161.jpg)
JFrameField (2/3)
182
private void buildFrame(int volume) { frame = new JFrame(); contentPane = new JPanel(); format = NumberFormat.getNumberInstance(); format.setParseIntegerOnly(true); format.setGroupingUsed(false); format.setMaximumFractionDigits(0); format.setMaximumIntegerDigits(3); field = new JFormattedTextField(format); field.setValue(volume); ((DefaultFormatter)field.getFormatter()).setAllowsInvalid(false); contentPane.add(field); button = new JButton("Mettre à jour"); button.addActionListener(this); contentPane.add(button); frame.setContentPane(contentPane); frame.setTitle("JFrameSpinnerVolume"); frame.pack(); }
![Page 162: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/162.jpg)
JFrameField (3/3)
183
@Override public void close() { frame.dispose(); } @Override public void display() { frame.setVisible(true); } public void volumeChanged(VolumeChangedEvent event) { field.setValue(event.getNewVolume()); } public void actionPerformed(ActionEvent arg0) { getController().notifyVolumeChanged(Integer.parseInt(field.getValue().toString())); }}
![Page 163: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/163.jpg)
CONCLUSION184
![Page 164: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/164.jpg)
LA LIBRAIRE GRAPHIQUE SWING• Possède
– De nombreux widgets graphiques– De nombreux containers pour afficher ces widgets– Des layouts permettant de faire la mise en page– …
• Permet de réaliser des applications– Lourdes qui s’exécutent localement– « légères » au-travers des applets
• Gère les événements au-travers de la couche awt.event par l’utilisation d’écouteurs
185
![Page 165: Vos premiers pas en Swing. Vous avez vu comment écrire la partie Modèle On va voir la partie Vue](https://reader036.vdocuments.mx/reader036/viewer/2022062511/551d9d8d497959293b8c2d60/html5/thumbnails/165.jpg)
LA LIBRAIRE GRAPHIQUE SWING• Permet de réaliser des applications
– Lourdes qui s’exécutent localement– « légères » au-travers des applets
• Gère les événements au-travers de la couche awt.event par l’utilisation d’écouteurs
186