Cours de Java Cours III : Les Benjamin FAUCHER Cubis-Helios Consulting
Cours III : Les Interfaces Graphiques I. Introduction II. AWT : Frame et Panel III. AWT : Composants graphiques IV. Evènements V. javax.swing 2
I. Introduction Interfaces graphiques = IHM : Interface Home-Machine = GUI : Graphical User Interface En java, les Interfaces graphiques sont basées sur des objects dont les classes appartiennent aux paquetage java.awt et javax.swing Les composants de ces deux paquetages fonctionnent de la même manière mais ne sont pas compatibles Les interfaces crées avec AWT produit une interface à l aide du gestionnaire de fenêtre de l OS sur lequel la JVM est installée. Les interfaces crées avec SWING ne crée par contre qu une image d interface, sans appeler le gestionnaire de fenêtre (donc plus rapide). Nous allons d abord voir comment marche le interfaces sous AWT, puis nous verrons le fonctionnement (quasi-similaire) de SWING 3
II. AWT : Frame et Panel 1. Introduction Le Sommet de la hiérarchie de classe de AWT se trouve la classe Component, une classe abstraite qui encapsule tous les attributs d un élément visuel. Parmi ces composants, on trouve une sous-classe appelée Container, qui comme son nom l indique sert à contenir d autre objets (graphiques). Lorsque l on crée une IHM avec AWT, il faut d abord chercher à définir quel sera l élément qui contiendra l ensemble des objets graphiques et ceci grâce à un objet de type Container. Parmi ces Container, deux principales classes : Panel et Frame Un Panel sert à contenir des objets graphiques et à les organiser graphiquement Frame, hérite de la classe Window et génère donc une fenêtre avec le gestionnaire de fenêtre de l OS, qui peut contenir d autres objets graphiques 4
II.2 Hiérarchie des classes AWT 5
II.3 La classe Frame 1/2 La classe Frame étend la classe Window qui permet de créer une fenêtre sur le bureau (comme toute application) prenant la forme des fenêtre de l OS sur lequel la JVM est installée, avec une barre de titre, des bordures et des boutons de redimentionnement. Par défaut, toutes ces fonctionnalités (redimentionnement, titre ) ne sont pas définies. Pour afficher une fenêtre vide avec Java, il faut donc créer un objet qui étend la classe Frame ou instancier un objet Frame : Ex : Frame frame = new Frame(); ou new Frame(«titre»); La classe Frame hérite de Container, il faut donc par la suite «remplir» cet objet par d autre élément graphiques (ou Component) 6
II.3 La classe Frame 2/2 La classe Frame définit ou hérite d une certain nombre de méthodes : settitle(string str) : définit le titre de la fenêtre setsize(int long, int haut) : définie la taille de la fenêtre pack() : réduit la taille de la fenêtre à la taille minimum supportée par ses composants graphiques setvisible(boolean b) : déclare la fenêtre visible ou invisible setresizable(boolean b) : déclare la fenêtre resizable ou pas setmenubar(menubar mb) : ajoute une barre de menu à la fenêtre seticonimage(image ico) : change l icône de l application addwindowlistener(windowlistener) : ajout d un écouteur sur la fenêtre ( voir événements ) 7
II.4 La classe Panel La classe Panel sert à définir des cadres à l intérieur d une fenêtre ( = d une Frame ), c est donc un sous-cadre. On peut définir une hiérarchie infinie de sous cadre à l intérieur d une fenêtre, ou à l intérieur d un autre cadre. Elle hérite également de Container, et on peut donc la remplir de Component. Déclaration : Panel paneltest = new Panel(); Elle dispose des méthodes héritées : setsize(int long, int haut) : définie la taille de la fenêtre setvisible(boolean b) : déclare la fenêtre visible ou invisible setlocation(point p) : définit l emplacement (point haut gauche) 8
II.5 Les Container Les container sont des conteneurs d objet graphique Component : Ajout de Component : add(component cp) ou add(component cp, int place) ( dépend du gestionnaire de placements) Retirer un Component : remove(component cp) ou remove(int place) setlayout(layoutmanager lm) : définie le gestionnaire de placement à respecter pour l organisation géographique (graphique) des Component. Pour placer graphiquement les Component qu on ajoute dans un Container, on peut choisir ou définir un gestionnaire de placement. Le java propose un certain nombre de gestionnaires, héritant de la classe LayoutManager. 9
II.6 Les gestionnaires de placement Gestionnaires les plus fréquemment utilisés : FlowLayout() (Par défaut) : ajoute les Component en ligne à la suite et va à la ligne quand il n y a plus de place BorderLayout() : place les des zones géographiques NORTH, SOUTH, WEST, EAST, CENTER : Ex : setlayout(new BorderLayout()); add(new Panel(), BorderLayout.SOUTH); GridLayout(int long,int haut) : tableau qui divise l espace en case de même tailles ( change donc la taille du Component si nécessaire) BoxLayout(Container cible,int axe) : ajoute les Component en ligne suivant l axe définit : BoxLayout.X_AXIS ou BoxLayout.Y_AXIS 10
III. AWT : Composants graphiques Nous allons maintenant voir les composants graphiques de bases (autres que Container) que nous pouvons ajouter dans les Container Nous allons d abord voir les propriétés qu ils ont hérités de Component : paint(graphics g) : qui gère son affichage setbackground(color col), setforeground(color col) : change les couleur d affichage du Component setsize(int long, int haut) : change la taille du Component setvisible(boolean b) : déclare la fenêtre visible ou invisible Diverses fonction pour connaître la position du bouton dans la fenêtre et sa taille ( voir API ) 11
III.1 Les Composants de bases Classe fonction méthodes spécifiques Button Label TextField TextArea bouton clickage zone de texte non modifiable zone de saisie de texte (une ligne), avc des ascensseurs lorsque la zone est trop grande zone de saisie de texte (plusieurs lignes) changement du nom : setlabel(string str) ajouter d'une action lorsqu'on clicke changement du texte affiché : settext(string str) récupération de la chaîne tapée par l'utilisateur : String gettext(); récupération de la chaîne tapée par l'utilisateur : String gettext(); Canvas zone de dessin - ScrollBar Choice, CheckBox, List barre de défilement ( ou jauge ) pour définir une valeur entière listes à choix multiples, à selectionner ou à cocher méthodes pour définir le pas d'incrémentation, ou récupérer la valeur : int getvalue(); méthode de retour des valeurs sélectionnées 12
III.2 Exemple 1/2 import java.awt.*; class TestGUI { Frame fenetre; Button bouton; TextField textfield; Label label = new Label(" Ceci est un Label"); TestGUI(){ fenetre = new Frame("Exemple de IHM : TestGUI"); fenetre.setlayout(new BorderLayout()); Panel panel = new Panel(); bouton = new Button("Clickez"); textfield = new TextField(); Canvas canvas = new Canvas(); canvas.setbackground(color.blue); canvas.setsize(200,100); 13
III.2 Exemple 2/2 panel.setlayout(new GridLayout(2,1)); panel.add(bouton); panel.add(textfield); fenetre.add(panel,borderlayout.north); fenetre.add(label,borderlayout.center); fenetre.add(canvas,borderlayout.south); //fenetre.pack(); fenetre.setsize(200,300); fenetre.setvisible(true); public static void main(string args[]){ TestGUI test = new TestGUI(); 14
IV. Les Evènements Nous savons créer une fenêtre composée d éléments graphiques, néanmoins pour l instant, ces éléments ne sont pas réactif : si on clicke sur un bouton, rien ne se passe. Il faut donc spécifier le comportement des éléments faces aux Evènements, qui sont des cas d utilisations (paquetage java.awt.event). Ex : clicker sur un bouton, ou sur la croix de fermeture de fenêtre... La gestion de ces évènements se fait en 2 étapes, au moyen d écouteurs : 1. On définit l action à faire si l événement se produit en créant une instance implémentant l interface correspondante à l écouteur d évènement, et en redéfinissant la méthode de réponse à l événement. 2. On abonne le composant graphique concerné par l événement à cette instance d écouteur, en mettant un «écouteur» sur cet évènement 15
IV.1 Evènement : Click sur un bouton Dans le cas d un bouton, l événement produit par un click est un ActionEvent, et linterface qui écoute ce type d événement est un ActionListener. Nous allons donc créer une classe qui implément cette interface : Ex : class monecouteur implements ActionListener { Pour implémenter cette interface, il faut redéfinir la méthode actionperformed (ActionEvent e), qui dit ce que doit faire le programme quand l ActionEvent se produit. Ex : class monecouteur implements ActionListener { public void actionperformed(actionevent e) {... Il reste ensuite à abonner notre objet à une instance de notre écouteur, pour cela on utilise la méthode addactionlistener(actionlistener al) de Button. Ex : bouton.addactionlistener(new monecouteur()); 16
IV.2 Evènement : Click sur un bouton : Exemple import java.awt.*; import java.awt.event.*; class CompteClick extends Frame{ private Button bouton; private int cp = 0; CompteClick(){ bouton = new Button("Clickez Moi"); bouton.addactionlistener(new MonEcouteur()); add(bouton); pack(); setvisible(true); // inner class : // classe interne invisible de l'extérieur class MonEcouteur implements ActionListener { public void actionperformed (ActionEvent event){ System.out.println("Click numero : "+cp++); public static void main(string args[]){ CompteClick test = new CompteClick (); 17
IV.3 Evènement : fermeture de la fenêtre Dans le cas de la fermeture de la fenêtre de l application ( = la Frame), l événement produit est un WindowEvent et l interface qui permet d écouter ce type d événement est WindowAdapter. Lorsque l on clique sur la croix de fermeture de la fenêtre, alors l interface WindowListener appelle la méthode windowclosing (WindowEvent e), c est donc le corps de cette méthode qu il faut redéfinir. Dans la pratique, on utilisera plutôt une classe du java implémentant déjà WindowListener, cette classe s appelle WindowAdapter. Il faut ensuite abonner l instance de notre Frame à notre écouteur en utilisant la méthode inclut dans Frame : addwindowlistener (WindowListener win); 18
IV.4 Evènement : fermeture de la fenêtre : Exemple class FermeFenetre { Frame mafenetre = new Frame("Test de Fermeture"); FermeFenetre(){ mafenetre.addwindowlistener(new Fermeture()); mafenetre.setsize(400,300); mafenetre.setvisible(true); class Fermeture extends WindowAdapter { public void windowclosing(windowevent event){ System.out.println(" Au revoir "); System.exit(0); // termine l'application public static void main(string args[]){ FermeFenetre test = new FermeFenetre(); 19
V. javax.swing Le paquetage javax.swing contient des classes équivalentes au Component de AWT. Ces classes sont issues Jcomponent et portent les mêmes noms qu en AWT avec un «J» devant : Ex : JButton, JFrame, JPanel, Ces classes comportent les mêmes méthodes, enrichies d un certains nombre d autres. Il subsiste quelques petites différences entre SWING et AWT : En SWING, on ne peut pas ajouter de Jcomponent directement à une Jframe; on doit passer par la méthode : JPanel getcontentpane(); Ex : majframe.getcontentpane().add(monjcomposant); En SWING, on peut définir plus facilement la fermeture de la fenêtre : majframe.setdefaultcloseoperation(jframe.dispose_on_close); 20