Outils de développement des interfaces Graphiquesmountaz/Ens/DessTni/Ihm/Cours/c2-outils.pdf ·...
Transcript of Outils de développement des interfaces Graphiquesmountaz/Ens/DessTni/Ihm/Cours/c2-outils.pdf ·...
1
1
Outils de développement des interfacesGraphiques
La toolkit de JAVA
2Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Plan
• Introduction– X/Motif, TCL-TK, Java-AWT, ...
• La toolkit de Java : de jdk1.0 à jdk 1.2,1.3,1.4 enpassant par Swing– Evolution et différences
– Aperçu des composants swing
– Caractéristiques communes
– Placement
– Gestion d ’événements
– La forme générale d ’un programme
• Conclusion
2
3Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Outils de développement• Systèmes graphiques et systèmes de fenêtrage
– gestion des périphériques d ’entrée sortie– apporte le concept de fenêtre aux applications– ex: Windows, X, Next, etc.
ÍBoites à outils– utilisées pour construire la plupart des applications actuelles– repose sur la notion de widget– ex: Motif, Tk, AWT-Swing, IlogViews, etc
• Générateur d ’interface– permet de construire une interface en la « dessinant »– ex: VisualBasic, VisualCafe (symantex), VisualJ++ (ms),
VisualAge(IBM)
4
De AWT 1.0 à AWT 1.2en passant par SWING
La toolkit JAVA
3
5Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
AWT = Abstract Windowing Toolkit
– Plusieurs versions radicalement différentes• AWT 1.0 [~95]
– Une librairie avec des composants de base et un modèle de gestion desévénements primitifs
• AWT 1.1 [~ 97]– Nouveau modèle de gestion des évènements
• AWT 1.1 + swing ou AWT 1.2 [ 98]» Nouveaux types de composants légers (intégration de Swing)
» Swing fait partie du Java Foundation Class (JFC)
• Depuis les modifications sont plus « légères » pour la base de la
toolkit
– par contre évolution vers des extensions java2D, java3D
6Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Les composants Swing
• Composants légers– composants écrits en Java au
dessus de AWT
– utilise AWT pour la créationde fenêtre
– portabilité immédiate
– Comparaison avec AWT 1.0 et1.1
• composants écrits en code Cnatif.
• implémentation différente surchaque plate forme
• problème portabilité
• Look and feel interchangeable– Quel look and feel faut-il donner
aux composants légers?– Look and feel, séparé du
composant• Jbutton : composant
• ButtonUI : look and feel ducomposant
• Orientation MVC
NB: Composant = widget ~ fenêtre dotée d ’un comportement ~ objetinteractif
4
7Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
AWT1.0
Evolution des composantsde Java 1.0 à Java 1.2 (Swing)
• Hiérarchie des composants prédéfinis dans AWT 1.0 et 1.1
• Hiérarchie des composants prédéfinis dans AWT 1.2– Tous ceux de AWT1.1 + ceux de Swing
AWT1.2
8
Démos
5
9Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Les composants TOP-LEVELAWT 1.2 - Swing
• Les fenêtres de base (ou top-level)– Les seules fenêtres qui peuvent se dessiner
seules• JFrame, JDialog et JApplet
– Ces fenêtres de bases contiennentimplicitement un composant JRootPane
• composant qui gère le contenu du toplevel
• indirections supplémentaires par rapport àawt1.1
• possibilité de gérer des fenêtres internes et deslayers
– tous les autres composantsont besoin d’être rattachésà une fenêtre de base (via le contentPane durootPane) pour s’afficher JFrame
JRootPane
ContentPane
JLayeredPane
JMenuBar
10Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Les composants - CONTAINERAWT 1.2 - Swing
• Les containers intermédiaires
– Utiles pour regrouper descomposants dans unpanneau de contrôle
– Panneau (Jpanel), Box,Panneau multi-couche(JLayeredPane),PanneauDivisable (JSplitPane), Onglet(JTabbedPane), Panneaudéroulant (ScrollPane), etc
6
11Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Autres composantsAWT 1.2 - Swing
• Les viewer– barre de progression,
bulles d ’aide, label
• Les contrôles– boutons, combo box, listes, menus, slider, champs textuels, palette d ’outils
• Les éditeurs– table, texte, sélecteur de fichier, sélecteur de couleur, arbre
12Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Caractéristiques communes descomposants Swing (1)
• Caractéristiques définies dans la classe Jcomponent– Bordures, Tailles par défauts, Bulles d ’aide,Rendu lent pour debugger,
Défilement automatique, Double-buffer, Raccourcis clavier, Icones, Actions
• Bordures– Bordure visible du composant
• ex: ligne qui fait le tour d ’un bouton
– Utilisation/motivation• structuration visuelle de l'IHM (regrouper les widgets qui vont ensemble)• création d ’une bordure (class Border) et affection de cette bordure
(setBorder) à un composant
– Bordures prédéfinies• EmptyBorder blanc
• LineBorder: ligne en couleur
• BevelBorder : Bordure 3D
7
13Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Caractéristiques communes descomposants Swing (2)
• Tailles– la classe Jcomponent définit trois tailles pour un composant
• minimum, maximum, preferred• utilisées lors du re-dimensionnement de la fenêtre
– pour redéfinir les tailles par défaut on utilise les méthodes deJcomponent:public Dimension getMinimumSize ();public Dimension getMaximumSize ();public Dimension getPreferredSize ();
• Bulles d ’aide– Tout composant a une bulle d ’aide associée
– Pour redéfinir le texte de cette bulle d’aide:public void setToolTipText (String txt);
14Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Caractéristiques communes descomposants Swing (3)
• Rendu ralenti pour debugger– Pour optimiser le code
• Un composant peut flasher dans une couleur particulière chaque fois qu ’ ilse redessine
• Défilement automatique– auto-scrolling
• pour les composants qui se trouvent dans une zone partiellement visiblepublic void setAutoscrolls(boolean trueFalse);
– défilement d ’une zone rectangulaire• rendre visible une zone particulière du composantpublic void scrollRectToVisible(Rectangle AVoir);
8
15Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Caractéristiques communes descomposants Swing (4)
• Icones– Tout graphique supporté par la plateforme Java, peut faire office
d ’icone
– Tout composant peut utiliser un icone• => boutons avec icone (impossible dans AWT1.1)
– Swing définit une interface et une classeImageIcon icon = new ImageIcon("images/truc.gif")
• Double Buffer– Eviter le scintillement lors du rendu
• tous les composants peuvent se dessiner dans un buffer hors écran qui estensuite copié à l ’écran.
– Utilisation optimisée des buffers• prise en compte de la hiérarchie des composants et partage de buffers entre
parents et enfants
16Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Caractéristiques communes des composantsSwing (5)
• Raccourcis clavier– Tout composant peut définir des raccourcis clavierpublic void registerKeyboardAction(ActionListener a,KeyStroke k,int condition)
• Actions– Une action représente une fonction spécifique d ’un programme
partagée par différents widgets• Exemple
– copier/coller qui est accessible par un menu et par une palette
• Les actions peuvent être « enabled » ou « disabled »
• Les actions implémentent l ’interface ActionListener
– Swing définit une interface et une classe• Action et AbstractAction
9
17Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Organisation des composants• Gestionnaire de placement (gp)
– Objet qui gère l ’organisation des composants au sein d ’uncontainer
– avec AWT• gestionnaires de placement de base
• Des plus simples– FlowLayout, GridLayout
• Un peu plus sophistiqués– BorderLayout, CardLayout
• Pour les panneaux de contrôle plus compliqués– GridBagLayout
– avec swing• gp spécifiques
• Borders : composant servant à regrouper d ’autres composants
• Box: pour placer des composants horizontalement ou verticalement
18Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
FlowLayout• Caractéristiques
– mise en page par défaut des JPanel
– ligne par ligne, de gauche à droite, centrage vertical
– respect de la taille "préférée" des composants
• Construteurs– public FlowLayout()
– public FlowLayout(int alignment)fi FlowLayout.LEFT, FlowLayout.CENTER, or FlowLayout.RIGHT
– public FlowLayout(int alignment,int horizontalGap, intverticalGap)
horizontalGap et verticalGap : espacement en pixel entre les éléments (par défaut 5)
• Exemple…
this.setLayout(new FlowLayout());
add(new Button("Button 1"));
add(new Button("2"));
add(new Button("Button 3"));
add(new Button("Long-Named Button 4"));
add(new Button("Button 5"));
10
19Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
BorderLayout
• Caractéristiques– mise en page par défaut des classes JFrame, JOptionPane, JDialog
– découpe l ’espace en 5 régions en utilisant les points cardinaux
– placement au centre par défaut
– taille des items variable. L ’espace gagné est alloué au centre en priorité, lesautres espaces dépendent de la taille « préférée » des composants qui s ’ytrouvent
– Spécification des contraintes de placement lors de l ’ajout des éléments
• Constructeur– public BorderLayout(int horizontalGap, int verticalGap)
• Exemple
setLayout(new BorderLayout());add("North", new Button("North"));add("South", new Button("South"));add("East", new Button("East"));add("West", new Button("West"));add("Center", new Button("Center"));
20Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
GridLayout
• Caractéristiques– crée une grille avec une nb lignes nb colonnes spécifiés dans le
constructeur
– valeur 0 pour nb ligne(ou colonne) libre
– taille des items variable
• Constructeurspublic GridLayout(int rows, int columns)
public GridLayout(int rows, int columns, int horizontalGap, int verticalGap)
• Exemple…
setLayout(new GridLayout(0,2));
add(new Button("Button 1"));
add(new Button("2"));
add(new Button("Button 3"));
add(new Button("Long-Named Button 4"));
add(new Button("Button 5"));
11
21Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
CardLayout• ExempleJPanel cards;
final static String BUTTONPANEL = "boutons";
final static String TEXTPANEL = "texte";
//Initialisation du container et du gp
cards = new JPanel();
cards.setLayout(new CardLayout());
… //création d'un panel p1 avec des boutons
… //création d'un panel p2 avec du texte
//Ajout de p1 et p2 dans le panneau principalcards
cards.add(BUTTONPANEL, p1);
cards.add(TEXTPANEL, p2);
//Lorsque l'item de la combo change, le gpréagit
public void itemStateChanged(ItemEvent evt) { CardLayout cl =
(CardLayout)(cards.getLayout());
cl.show(cards, (String)evt.getItem());
}
• Caractéristiques– utile pour avoir des fenêtres
alternatives
– généralement contrôlé par uneComboBox (JComboBox)
22Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
GridBagLayout
• Caractéristiques– Gère un ensemble de composants qui ont tous un
placement propre
– Définition de contraintes pour chacun des composants
– Calcul automatique du placement après résolution descontraintes
– Tend à être remplacé par BoxLayout
• Exemple
12
23Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Modèles de gestion des entrées
• Modèle par échantillonage (polling)– le dispositif d’entrée mémorise son état courant
– l ’application consulte l ’état courant du dispositif à intervalles réguliers
– inconvénient: : attente active
Ì Modèle à événements– concept commun à tous les toolkits
• message émis par le « système » à chaque action de l ’utilisateur– Un événement décrit les changements d ’état d’un dispositif
– L ’application a accès à une file d ’événements remplie par les pilotes des dispositifsd ’entrée.
• caractérisé par un type (qui correspond à l ’action de l ’utilisateur)– structure de données pré-définie qui permet de représenter des infos complémentaires (ex: la
position (x,y) de la souris)
– exemple: type MotionNotify pour les mouvement de la souris
– mais avec des différences• Des types d ’événements différents selon les toolkits
• Des modèles de gestion d ’évènements différents
24Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Les types d ’évènementsde AWT 1.0
• La classe Event–Tous les évènements sontreprésentés par la classe Event
–Le champs id représente le type del ’événement
–Le champs target représente l ’objetqui a engendré l ’évènement ou quiest le composant sur lequell ’évènement s ’est produit
–Les autres champs peuvent ou nonêtre renseignés selon le type del ’évènement
• Les différents types ( i.evaleurs possibles pourevent.id)– Event.ACTION_EVENT
– Event.MOUSE_ENTER
– Event.MOUSE_EXIT
– Event.MOUSE_MOVE
– Event.MOUSE_DOWN
– Event.MOUSE_DRAG
– Event.MOUSE_UP
– Event.KEY_PRESS
– Event.KEY_ACTION
– Event.KEY_RELEASE
– Event.KEY_ACTION_RELEASE
– Event.GOT_FOCUS
– Event.LOST_FOCUS
13
25Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Les types d ’évènementsde AWT 1.1 et SWING
• Hiérarchie de classes pour représenter les différentstypes– Une classe prédéfinie par type d ’évènement– EventObject racine de la hiérarchie– définie avec 1.1, enrichie avec Swing
• Tout événement a un objet source (~target pour 1.0 )
• Les id demeurent– pour les classes qui encapsulent plusieurs types d ’évènements
– par ex FocusEvent FocusEvent.FOCUS_.GAINED Focus Event.FOCUS_LOST
26Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Les classes d ’évènementsde AWT 1.1 et SWING
Evt de haut niveau (enfoncer un bouton, taper return)
Chgt d ’une valeur (émis par les modèles)
Entrée ou sortie du curseur dans le composant
Super classe de MouseEvent et KeyboardEvent
Chgt de la selection
(pour les composants permettant une sélection simple ou multiple)
Touche enfoncée ou relachée
Chgt dans le contenu d ’une liste
Chgt de sélection dans une liste
Sélection d ’un menu ou annulation
Interaction avec la souris
Chgt état fenêtre (iconification, fermeture, etc.)
ActionEvent
ChangeEvent
FocusEvent
InputEvent
ItemEvent
KeyEvent
ListDataEvent
ListSelectionEvent
MenuEvent
MouseEvent
WindowEvent
14
27Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Modèle de gestion des évènements dansAWT 1.0
• Principe– C ’est le composant qui gère les évènements
– A chaque action de l ’utilisateur, un événement est créé et complètementrenseigné (voir class Event)
• target - l ’objet qui a provoqué l ’évènement.
• when - le moment auquel l ’événement s ’est produit.
• id - le type d ’ événement.
• x, y
• key - la touche tapée (pour les événements KeyPress).
• modifiers - l ’état des touches modifier (SHIFT, CTRL,etc).
– L ’événement est ensuite propagé à toute la hiérarchie de composition• l e composant directement concerné puis tous ceux qui le contiennent
– Gestion de l’événement par les composants• via la méthode handleEvent de chaque composant
• méthode héritée de la classe Component appelée pour traiter tout événement
28Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
La méthode handleEventdans AWT 1.0
• Fonctionnement par défaut de la méthode handleEvent– utilise des sous méthodes selon le type de l ’événement
– On peut la redéfinir mais attention aux effets de bord…• mieux vaut redéfinir les méthodes appelées pour chaque type d ’événement
• Ne pas oublier de retourner true
• Appeler la méthode de même nom de la classe mère
– Les « sous-méthodes » de handleEvent
• Redéfinir le comportement d ’un composant– Deux solutions
• redéfinir la méthode handleEvent (ou une sous-méthode) de chaque composant– inefficace car il faut créer une nouvelle classe par bouton par exemple.
• Redéfinir la méthode handleEvent (ou une sous-méthode) au niveau d ’uncomposant « container » et sélectionner le type d ’action en fonction du« target »
– pas satisfaisant non plus … d ’où le modèle de l ’awt1.1
15
29Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Modèle d’événements
• Dans AWT1.1 et Swing– Modèle de gestion d ’événements par délégation
• Ce n ’est pas le composant qui traite l ’événement mais un gestionnaired’événement (GE aussi appelé EventListener)
– Le composant reçoit l ’événement et notifie le GE
• Les GE héritent des interfaces xxxListener
GE
Evt
Composant(1) Enregistrer
(3) Notifier
(2) Diffuser
30Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Les Gestionnaires d ’événements
• Les gestionnaires d ’évènements sont représentés pardes interfaces et des classes qui implémentent cesinterfaces par défaut
• Rappels: Interfaces– Une interface est une spécification formelle de classe
• elle ne peut être instanciée
• toutes les méthodes sont abstraites• tous les attributs sont static final
– final: ne peut pas être redéfini (attribut constant)
– static : partagé par toutes les instances (attribut partagé)
– l'appel n'est pas possible sur une instance particulière , il doit se faire surla classe
» <nomClasse>.methode
16
31Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Rappels: Héritage, interface et classe
• Héritage simple: class A extends B– la sous classe hérite des attributs et méthodes de sa classe mère.
– redéfinition possible
• Héritage d'interface: class A implements B– il faut définir toutes les méthodes déclarées dans l'interface B dont
hérite la classe A
– s'il reste des méthodes non définies, la classe A est une classeabstraite et ne sera pas instanciable.
• Héritage multiple– possible avec les interfaces
– interdit avec les classes
32Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Les Gestionnaires d ’événements
• Listener– les gestionnaires d’événements sont prédéfinis dans AWT1.1
• par les interfaces xxxListerner
– Pour écrire un gestionnaire d ’évènement on peut• directement écrire une classe qui implémente l ’interface• utiliser une classe adapter
• Adapter– Pour chaque interface xxxlistener il existe une classe xxxAdapter– xxxAdapter: implémentation par défaut de ces interfaces
• Fonctions d ’enregistrement– Pour utiliser un GE, les composants doivent les enregistrer
• addxxxListener
17
33Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Les Gestionnaires d ’événements
• Les différents listeners– Toute classe xxxListener hérite de EventListener
– Adapters associés et méthodes à implémenter
ListenerInterface AdapterClass MethodsActionListener none actionPerformedAdjustmentListener none adjustmentValueChangedComponentListener ComponentAdapter componentHidden, componentMoved,
componentResized, componentShownContainerListener ContainerAdapter componentAdded, componentRemovedFocusListener FocusAdapter focusGained, focusLostItemListener none itemStateChangedKeyListener KeyAdapter keyPressed, keyReleased, keyTypedMouseListener MouseAdapter mouseClicked, mouseEntered,
mouseExited, mousePressed,mouseReleased
MouseMotionListener MouseMotionAdapter mouseDragged, mouseMovedTextListener none textValueChangedWindowListener WindowAdapter windowActivated, windowClosed,
windowClosing, windowDeactivated,windowDeiconified, windowIconified,windowOpened
34Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Gestion d ’événements typique
1. Créer un gestionnaire d ’événement– en héritant d ’une interface (xxxlistener)
• public class MonControleur implement ActionListener
– en héritant d ’une classe qui implémente une interface (xxxAdapter)• public class MonControleur extends ActionAdapter
2. Implémenter (ou redéfinir) les méthodes du gestionnaired ’événement– Dans la classe MonControleurpublic void actionPerformed(ActionEvent e) {...}
3. Enregistrer le gestionnaire d’événement auprès d ’un widget« source »– button.addActionListener(instanceDeMonControleur)
– myWidget.addxxxListener(instanceDeMonControleur)
NB : dans de nombreux exemples de code, il n'y a pas ou peu de séparation entre composant etlistener
18
35Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Structure d ’un programmeen AWT-Swing
• "Structure" générale du programme– Définition de la hiérarchie de composants
• Fenêtre principale (top-level)• Définition des fonctions de dessins des composants
– Définition de la gestion des événements• Gestionnaires d'évènements + association aux composants
– Appeler la méthode pack() sur le top-level• calcule la disposition des composants (récursivement)
– Appeler la méthode setVisible() sur le top-level• affiche les composants de l'interface (récursivement)
• Exemple
36Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
import java.util.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.text.*;
public class Exemple extends JFrame implementsActionListener{ JTextField textField; JTextArea textArea; String newline; public Exemple(){ JMenuBar bar = new JMenuBar(); JMenu menu = new JMenu("Fichier"); JMenuItem tmp; newline = System.getProperty("line.separator");/* creation du menu quitter et ajout du gestionnaired'evenement*/ tmp = new JMenuItem("Quitter"); tmp.addActionListener(this); tmp.setActionCommand("Quitter"); menu.add(tmp); bar.add(menu); this.setJMenuBar(bar);/* creation des zones de texte */ textField = new JTextField(20); textArea = new JTextArea(5,20); getContentPane().add(textField,"North"); getContentPane().add(textArea,"Center");
/* ajout d'un gestionnaire d'evenementssur le textField */ textField.addActionListener(this);
addWindowListener(new ExitWindow()); }
/* gestion des evenements sur le TextField */public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (cmd.equals("Quitter")) { ImageIcon icone = newImageIcon("adieu.gif"); JOptionPane.showMessageDialog(this,"
Adieu Monde Cruel !! ", "Quitter",JOptionPane.PLAIN_MESSAGE,icone);
setVisible(false); dispose(); System.exit(0); } else { String text = textField.getText(); textArea.append(text + newline); textField.selectAll(); }}
public static void main(String s[]){ ExempleGE frame = new ExempleGE(); frame.setForeground(Color.black); frame.setBackground(Color.lightGray); frame.pack(); frame.setVisible(true); }}
Petit exemple (version 1)
19
37Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
import java.util.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.text.*;
public class ExempleGE extends JFrame implementsActionListener{ JTextField textField; JTextArea textArea; String newline; public ExempleGE(){ JMenuBar bar = new JMenuBar(); JMenu menu = new JMenu("Fichier"); JMenuItem tmp; newline = System.getProperty("line.separator");/* creation du menu quitter et ajout du gestionnaired'evenement*/ tmp = new JMenuItem("Quitter"); tmp.addActionListener(this); tmp.setActionCommand("Quitter"); menu.add(tmp); bar.add(menu); this.setJMenuBar(bar);/* creation des zones de texte */ textField = new JTextField(20); textArea = new JTextArea(5,20); getContentPane().add(textField,"North"); getContentPane().add(textArea,"Center");
/* ajout d'un gestionnaire d'evenementssur le textField */ textField.addActionListener(new GEText());
addWindowListener(new ExitWindow()); }
/* classe interne pour evts textfield*/ class GEText implements ActionListener {
public void actionPerformed(ActionEvent e) { String text = textField.getText(); textArea.append(text + newline); textField.selectAll();}
/* gestion des evenements du menu*/ public void actionPerformed(ActionEvent e) {
ImageIcon icone = new ImageIcon("adieu.gif"); JOptionPane.showMessageDialog(this," Adieu Monde Cruel !! ", "Quitter", JOptionPane.PLAIN_MESSAGE,icone); setVisible(false); dispose(); System.exit(0);}
public static void main(String s[]){ Exemple frame = new Exemple(); frame.setForeground(Color.black); frame.setBackground(Color.lightGray); frame.pack(); frame.setVisible(true); }}
Petit exemple (version 2 - avec classe interne)
38Mou
ntaz
Has
coë t
, Uni
v . M
ontp
ellie
r II
, LIR
MM
Pour en savoir plus
• Bibliographie– Java in a nutshell, Flanagan, O'reilly, second edition , 1997.– Programming with JFC, Weiner et Asbury, Wiley Ed., 1998.
• Sites HTTP– Le site SUN
• http ://java.sun.com– nouveautés, faq, exemples
– Le tutorial [oct 2003]• http://java.sun.com/docs/books/tutorial (contient des liens vers la doc.
complète de swing et awt)• http ://java.sun.com/jfc/tsc/
– infos sur swing
– http://www.developer.com/java/• des centaines d'applets et d'applications JAVA classées par thèmes