Universite d’Aix-Marseille III - Licence de math-info 2eme anneeI4 : Programmation objet - L’interface graphique avec SwingSwing est une bibliotheque de classes qui permet de creer une interface utilisateur graphique (GUI). Avecce type d’application, nous nous trouvons dans le cadre de ce qu’on appelle la programmation evenementielle.On cree et assemble di erents composants (fen^etres, boutons, champs textuels, menus, etc) pour composerl’interface et on associe des methodes aux di erents evenements pouvant survenir (appui sur un bouton,fermeture de fen^etre, entree d’un texte dans un champ textuel, selection d’un item dans un menu, etc).Ce qui suit n’est qu’une presentation tres partielle et succinte de ce qu’on peut faire avec Swing, avecpour seul objectif que vous puissiez resoudre les exercices qui vous seront donnes en TP. Pour avoir une vuegenerale et complete de Swing, on pourra par exemple consulter le tutorial a l’adresse :http://java.sun.com/docs/books/tutorial/uiswing/Voici un exemple de programme Java utilisant Swing :import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;class Fenetre implements ActionListenerfprivate JLabel label = new JLabel("0");private int nbClics;public void actionPerformed(ActionEvent e)fnbClics++;label.setText("" + nbClics);gpublic void lanceFenetre()fJFrame frame = new JFrame("Compteur");frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE);frame ...
I4 :Programmation objet - L’interface graphique avec Swing
Swingestunebibliothequedeclassesquipermetdecreeruneinterfaceutilisateurgraphique(GUI).Avec ce type d’application, nous nous trouvons dans le cadre de ce qu’on appelle lammaroitavenenementielleogpr. Oncreeetassembledierentscomposants(feneˆtres,boutons,champstextuels,menus,etc)pourcomposer l’interfaceetonassociedesmethodesauxdierentsevenementspouvantsurvenir(appuisurunbouton, fermeturedefenˆetre,entreed’untextedansunchamptextuel,selectiond’unitemdansunmenu,etc). Cequisuitn’estqu’unepresentationtrespartielleetsuccintedecequ’onpeutfaireavecSwing,avec pourseulobjectifquevouspuissiezresoudrelesexercicesquivousserontdonnesenTP.Pouravoirunevue generaleetcompletedeSwing,onpourraparexempleconsulterletutorialal’adresse: http://java.sun.com/docs/books/tutorial/uiswing/ Voici un exemple de programme Java utilisant Swing: import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*;
class Fenetre implements ActionListener{ private JLabel label = new JLabel(”0”); private int nbClics;
public void actionPerformed(ActionEvent e){ nbClics++; label.setText(”” + nbClics); }
public void lanceFenetre(){ JFrame frame = new JFrame(”Compteur”); frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE);
frame.getContentPane().setLayout(new FlowLayout()); JButton bouton = new JButton(”Incrementation”); frame.getContentPane().add(bouton); frame.getContentPane().add(label);
bouton.addActionListener(this);
frame.pack(); frame.setVisible(true); } }
public class TesteFenetre{ public static void main(String[] args){ Fenetre f = new Fenetre(); f.lanceFenetre(); } }
class Fenetre ...{ ... public void lanceFenetre(){ JFrame frame = new JFrame(”Titre”); frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); ... frame.pack(); frame.setVisible(true); } }
public class TesteFenetre{ public static void main(String[] args){ Fenetre f = new Fenetre(); f.lanceFenetre(); } } JFrame frame = new JFrame("Titre");neer,”itretlet”Titserarceteedepmredonˆetrefenerun creantl’instanceframede typeJFrame.frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); indiquequelafenˆetresefermerasioncliquesurleboutondefermeturestandarddesfeneˆtres.Apresqu’onait ajoutetouslescomposantsdelafenˆetre,frame.pack();calcule sa structure interne.frame.setVisible(true); permetderendrelafenˆetrevisible.
Ajoutdecomposantsdansunefenˆetre frame.getContentPane().setLayout(new FlowLayout()); JButton bouton = new JButton(”Incrementation”); frame.getContentPane().add(bouton); frame.getContentPane().add(label); Les instances deJFrame(ici :frameunntd’ammeesotonstnospmoc)panneau ”contenu”, de typeContainer, destinearecevoirdescomposants,c’est-a-diredesinstancesdeclassesderiveesdeComponent.Container estelle-mˆemeuneclassequiheritedeComponent. L’accesseurContainer getContentPane()retourne le panneau ”contenu” deframe.frame.getContentPane().setLayout(new FlowLayout());choisit leges-tionnaire de mise en forme (layout)de typeFlowLayoutpour le panneau. Les gestionnaires de mise en forme
2
determinentlafacondontlescomposantsserontdisposesautomatiquementsurlepanneau.Ici,ceserafaiten alignantlescomposantshorizontalementaufuretamesurequ’ilssontajoutes,enpassantalalignesuivante desqueleborddroitdelafenˆetreestatteint.Lorsquelafeneˆtreseraredimensionnee,lescomposantsse repositionnerontautomatiquementsuivantlemeˆmeprincipemaisenfonctiondesnouvellesdimensionsdela feneˆtre.Ilexisted’autrestypesde”layout”:BoxLayout,GridLayout,BorderLayout, etc. La methodevoid add(Component)mposantaupanneauteedarojturenuocrmpeeuot.It”ouayajna,ocicepsernel”eltnat unbouton,puisunlabel,tousdeuxdesinstancesdeclassesquideriventdeComponent.
Liaisonevenement-action Uneinterfacegraphiquesertarecevoirdesentreesviadesevenementsnestnega,racesiranemeeve executantcertainesactions(desmethodessontappelees)etaachergraphiquementleresultatdecesactions. Parexemple,onassocieunemethodeaunevenementdetype”action”pouvantsurvenirauneinstancede JButtongrceˆaedohalatemvoid addActionListener(ActionListener)elassein(dlscadenaJButton). Leparametredecettemethodeestuneinstanced’uneclasseimplementantl’interfaceActionListeneret denissantlamethodepublic void actionPerformed(ActionEvent). C’est cette methode qui sera appelee lorsque qu’on appuiera sur le bouton. Il est possible que plusieurs composants (par exemple, deux boutons) associentleurevenement”action”aunemˆemeinstancedeActionListeneruvpordoiteeinrmreI.fluaatolsr quelestlecomposantsourcedel’evenemental’interieurdelamethodeactionPerformed. C’est la methode Object getSource()de la classeActionListenerretournant l’instance de l’objet sur lequel est apparu l’evenementquipermetdeledeterminer.ActionListenereritedehEventListener, qui est la racine de la hierarchiedes”eventlisteners”.Sesautressous-classes(interfaces)sont:ComponentListenerpour reagir quanduncomposantchangedetaille,depositionoudevisibilite,FocusListenerpour reagir quand un composant obtient le focus ou le perd,KeyListeneralefocusreagisselaa’ppiuuorqouppmoceleuiuqtnaso au relachement d’une touche,MouseListenereotrenisursolandauqrigaerruopgeduchadea’a’ridtlesuro composant ou qu’on clique dessus, qu’on appuie ou qu’on relache un bouton de souris,MouseMotionListener pourreagiraudeplacementdelasourisaudessusducomposant,qu’unboutondelasourissoitpresseou non,etc.Chacunedecesinterfaceslistesaseriedemethodesadenirenreactionauxevenements.Le parametrepasseal’executiondecesmethodesestuneinstanced’unesous-classedeEventObjectet permet derecupererdesinformationscomplementairessurl’evenementquiestsurvenu(ex:coordonneesdupointeur de la souris lorsqu’on clique sur la souris).
Exemple L’applicationgraphiquesuivanteestconstitued’unefenˆetrecontenantunboutonOui,unboutonNonet deux labels. Le premier label ache le nom du bouton au-dessus duquel se trouve la souris. Le second label achelenomdudernierboutonsurlequelonaclique.LaclasseFenetreimplementeActionListeneret MouseListenermethodesdel’intafreec.eL5sMouseListenertnenofllsetreed’enais3iesmstdoncdonne rien.Voicil’etatdel’applicationlorsqueledernierboutonsurlequelonaappuyeestleboutonNonetque lepointeurdelasourissetrouveendehorsdeszonesoccupesparlesboutons: