7.1 Premières Notions
7.2 Création et manipualtion de Fenêtre : JFrame
7.3 Manipulation de component
7.4 Manipulation de Container - Les LayoutManager
7.5 Gestion des évenements
7.6 Quelques exemples
7.7 Une classe Graphique
En informatique, les débats sont nombreux sur les formes que doivent prendre les modèles objets relatifs à la programmation graphique
: les notions qui apparaissent dans le modèle objet de java ou la manière de les manipuler restent des choix de
programmation particuliers qui font l'objet de débats théoriques.
Le cours se contente de signaler ces débats sans les développer.
Comme le cours sur le modèle objet de java l'indique, deux bibliothèques constituent l'API graphique, c'est à dire
les ressources pour la programmation graphiques : java.awt, javax.swing.
Historiquement, java.awt est plus ancien.
Les notions principales à distinguer :
JFrame fen=new JFrame(); Dimension d=fen.getSize();
Le code suivant suffit à la création et l'affichage d'une fenêtre, les commentaires expliquent ce à quoi correspond chaque instruction :
import javax.swing.JFrame; public class TestJFrame{ public static void main(String[] args) { /*Création de la fenetre*/ JFrame fen=new JFrame(); /*Reglage de la taille de la fenêtre*/ fen.setSize(300,300); /*Positionnement de la fenêtre*/ fen.setLocation(10,10); /*Cette instruction permet de faire que le programme s'arrête avec un clic sur la croix en haut à droite*/ /*Il existe d'autres méthodes pour réaliser cela*/ /*Tester l'exécution de la fenêtre sans cette instruction*/ fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /*Jusque là la fenêtre était créée mais pas affichée : setVisible(true) appelle son affichage*/ fen.setVisible(true); } }
fen.getContentPane();On peut ensuite ajouter des élements au sein du container de la fenêtre :
import javax.swing.*; import java.awt.*; public class TestJFrame{ public static void main(String[] args) { /*Création de la fenetre*/ JFrame fen=new JFrame(); /*Reglage de la taille de la fenêtre*/ fen.setSize(300,300); /*Positionnement de la fenêtre*/ fen.setLocation(10,10); /*Cette instruction permet de faire que le programme s'arrête avec un clic sur la croix en haut à droite*/ /*Il existe d'autres méthodes pour réaliser cela*/ /*Tester l'exécution de la fenêtre sans cette instruction*/ fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fen.getContentPane().add(new JButton("Test")); /*Jusque là la fenêtre était créée mais pas affichée : setVisible(true) appelle son affichage*/ fen.setVisible(true); } }
Pour un composant n'en contenant pas d'autres,
lorsque le système veut l'afficher, il utilise la fonction paint(Graphics) de ce composant en fournissant l'objet
Graphics qui correspond au contexte graphique pour l'affichage : vous n'avez donc pas à vous préoccuper de cet objet. Lorsque le système affiche
un composant composé de plusieurs composants, il utilise les fonctions paint des sous-composants ou des sous sous-composants si les sous-composants
sont eux-mêmes composés de composants.
Pour les composants qui sont donnés tels quels (les boutons, les menus, JFrame etc...),
la méthode paint(Graphics) est déjà définie et détermine ce qui apparaît à l'affichage du Component. Elle est appellée par la JVM à chaque fois
qu'il est nécessaire de réafficher (lorsque une fenêtre a été ouverte par dessus par exemple).
Pour certains objets, il est possible de la surdéfinir et de donner soit même une forme au composant. Donc pour définir un composant affichable :
on fait une classe qui hérite de JPanel et on surdéfinit la méthode paint(Graphics) en décrivant l'affichage.
Dans ce qui suit, on explique comment définir ce qui est à dessiner sur un component. Notons d'abord le système de coordonnées utilisés.
Le système de coordonnées est tel que le point en haut à gauche est l'orgine, soit un Panel de taille 100*100 :
alors le point en haut à gauche est (0,0), le point en bas à gauche est (0,100) et le point en bas à droite : (100,0). Les valeurs entières sont
traduites en pixels (picture elements).
paint(Graphics g) { ... g.setColor(Color.BLUE); g.drawLine(10,100,100,10); ... }Par défaut, la couleur est initialement à BLACK.
Un Container est composé de un ou plusieurs composants. Cependant, il faut gérer l'organisation de ces composants : lequel placer en haut à gauche ?
Lequel mettre en bas à droite ? etc... Un attribut du Container est de type LayoutManager, il est possible de fixer le LayoutManager en diposant d'un
objet lay de type LayoutManager : setLayoutManager(lay);
On donne pour l'instant un unique exemple qui montre différents modes d'organisation : TestLayout.java
Pour un composant, on peut lui associer des listeners/écouteurs qui contiennent un code qui sera associé à certains évenements.
Prenons le cas de l'interface MouseListener : un objet qui l'implémente réagit aux évenements de la souris. Si on veut rendre un composant réactif
aux évenements de la souris : on fait du composant un mouseListener OU on lui associe un objet qui est un MouseListener et on ajoute cet objet
à la liste des listeners associés au composant.
/*SOL1 comp est d'une classe qui implémente MouseListener, on associe le listener this à la liste des listeners*/ comp.addMouseListener(this); /*Dans ce cas comp s'écoute lui même*/
/*SOL2, on a un objet de type MouseListener ml et on l'associe au composant : */ comp.addMouseListener(ml); /*Dans ce cas ml s'écoute les évenements de la souris sur comp*/