Création d'une Interface Graphique en Java
Création d'une Interface Graphique en Java
import [Link].* ;
public class Premfen0{
public static void main (String args[]){
JFrame fen = new JFrame() ;
[Link] (300, 150) ;
[Link] ("Ma premiere fenetre") ;
[Link] (true) ;
}
}
import [Link].* ;
class MaFenetre extends JFrame{
public MaFenetre (){
setTitle ("Ma premiere fenetre") ;
setSize (300, 150) ;
}
}
public class Premfen1{
public static void main (String args[]){
JFrame fen = new MaFenetre() ; // créer un cadre
[Link] (true) ; // rendre visible la fenêtre
}
}
La fenêtre principale
Actions sur les caractéristiques d’une fenêtre
- [Link](x,y,lg,ht)
place le coin supérieur de la fenêtre en x,y et donne à la
fenêtre la taille lg*ht
- [Link]([Link])
impose un comportement lors de la fermeture de la
fenêtre
• JFrame.EXIT_ON_CLOSE // ferme l’application à la
fermeture de la fenêtre
• JFrame.DO_NOTHING_ON_CLOSE // ne rien faire
(inhiber l’icône détruire)
Exemple : [Link]
import [Link].* ;
class MaFenetre extends JFrame
{ public MaFenetre () // constructeur
{ setTitle ("Ma premiere fenetre") ;
setBounds(500,40,300,150);
}
}
public class Premfen2
{ public static void main (String args[])
{
JFrame fen = new MaFenetre() ;
[Link](JFrame.EXIT_ON_CLOSE); //
cette ligne termine le prog quand la fenêtre se ferme
[Link] (true) ;
}
}
Gestion d’un clic dans la fenêtre
Programmation événementielle
- La plupart des événements sont créés par des composants
qu’on aura introduits dans la fenêtre
Menus, boutons, boîtes de dialogues…
- Avant de voir comment créer ces composants, nous allons
voir comment traiter les événements
Gestion d’un clic dans la fenêtre
Implémentation de l’interface MouseListener
- En Java, tout événement possède une source
C’est l’objet qui l’a créé, ici la fenêtre principale
- Pour traiter l’événement, on associe à la source un écouteur
un objet dont la classe implémente une interface particulière
correspondant à une catégorie d’événements
- Exemple
Il existe un écouteur souris qui correspond à la catégorie
d’événements souris, un objet dont la classe est MouseListener
MouseListener comprend 5 méthodes à redéfinir correspondant
à un événement particulier
• mousePressed, mouseReleased, mouseEntered, mouseExited et
mouseCliked
Gestion d’un clic dans la fenêtre
JFrame
extends
ents
implem
Fenêtre
MouseListener :
mouseClicked{}
mousePressed{}
…
Gestion d’un clic dans la fenêtre
L’instanciation de MouseListener consiste à définir
une classe qui l’«implémente» :
Class EcouteurSouris implements MouseListener
{
public void mouseClicked(MouseEvent ev) {}
public void mousePressed (MouseEvent ev) {}
public void mouseReleased(MouseEvent ev) {}
public void mouseEntered (MouseEvent ev) {}
public void mouseExited (MouseEvent ev) {}
// autres méthodes et champs de la classe
}
L’implémentation consiste à :
redéfinir toutes ces méthodes
ou ne rien faire et les laisser vides
Exemple : [Link] public void mousePressed (MouseEvent
ev) {
import [Link].* ; [Link] ("mousePressed");
import [Link].* ; // pour }
MouseEvent et MouseListener
public void mouseReleased(MouseEvent
class MaFenetre extends JFrame ev) {
implements MouseListener{ }
public MaFenetre (){
setTitle ("Gestion de clics") ; public void mouseEntered (MouseEvent
setBounds (10, 20, 300, 200) ; ev) {
addMouseListener (this) ; [Link] ("mouseEntered") ;
} }
public void mouseClicked (
MouseEvent ev) public void mouseExited (MouseEvent
{ ev) {}
[Link] ("clic }
dans fenetre") ; }
}
public class Clic1{
public static void main (String args[]){
MaFenetre fen = new MaFenetre() ;
[Link](true) ;
}
}
Gestion d’un clic dans la fenêtre
Commentaires
- Noter la présence de : [Link].*;
La gestion des événements fait appel au paquetage
[Link]
- Les méthodes telles que mouseClicked doivent être
déclarées publiques car une classe ne peut pas restreindre
les droits d’accès d’une méthode qu’elle implémente
- L’absence dans MaFenetre de addMouseListener(this) ne
conduit pas à une erreur, mais aucune réponse ne sera
apportée au clic
Gestion d’un clic dans la fenêtre
Utilisation de l’information associée à un événement
- On peut utiliser l’objet, MouseEvent ev, passé en paramètre
des méthodes de gestion de l’événement pour traiter
l’information contenue
- Exemple : récupérer les coordonnées de la souris :
[Link]
…
public void mouseClicked(MouseEvent ev)
{ int x = [Link]() ;
int y = [Link]() ;
[Link] ("clic au point de coordonnées " + x + ", " + y
);
}
Gestion d’un clic dans la fenêtre
La notion d’adaptateur
- Pour éviter de redéfinir toutes les méthodes, Java propose
une classe MouseAdapter qui implémente toutes les
méthodes avec un corps vide
Classe MouseAdapter implements MouseListener
{
public void mouseClicked (mouseEvent ev){}
public void mousePressed (mouseEvent ev){}
public void mouseReleased (mouseEvent ev){}
…
}
- Dans ces conditions, on peut facilement définir une classe
écouteur des événements souris ne comportant qu’une
méthode, en procédant ainsi :
Gestion d’un clic dans la fenêtre
Classe EcouteurSouris extends MouseAdapter
{
public void mouseClicked (mouseEvent ev){ //ici, on ne
redéfinit que la méthode qui nous intéresse
…
}
}
En résumé, voici comment il faut gérer les événements : [Link]
import [Link].* ;
import [Link].* ;
class MaFenetre extends JFrame
{ MaFenetre () // constructeur
{ setTitle ("Gestion de clics") ;
setBounds (10, 20, 300, 200) ;
addMouseListener ( new MouseAdapter()
{ public void mouseClicked(MouseEvent ev)
{ int x = [Link]() ;
int y = [Link]() ;
[Link] ("clic au point de coordonnees " + x + ", " + y ) ;
}
});
}
}
public class Clic3
{ public static void main (String args[])
{ MaFenetre fen = new MaFenetre() ;
[Link](true) ;
}
}
La fenêtre principale
Le composant Container
- Pour pouvoir placer des composants dans une fenêtre, il
faut tout d’abord créer le conteneur qui les accueillera,
puis placer ce conteneur dans la fenêtre
- Pour accéder à la classe container, il faut importer la
bibliothèque AWT
- Pour cela, la classe JFrame dispose d’une méthode :
JFrame [Link] () ;
getContentPane
- Exemple :
Container monConteneur = [Link] () ;
Container
Premier composant : un bouton
Création d’un bouton et ajout dans la fenêtre
- On crée le bouton en utilisant la classe JButton
JButton monBouton;
…
monBouton = new JButton("Essai");
- Ajout dans la fenêtre :
On nomme le contenu (de type Container), par ex :
JFrame
Container c = getContentPane();
getContentPane
On ajoute le bouton à ce contenu
[Link](MonBouton)
On aurait pu aussi faire directement :
Container getContentPane().add(MonBouton)
Premier composant : un bouton
Ajout dans la fenêtre :
- On nomme ce contenu (de type Container), par ex :
Container c = getContentPane();
- On ajoute le bouton à ce contenu
[Link](MonBouton)
- On aurait pu aussi faire directement :
getContentPane().add(MonBouton)
Exemple complet: [Link]
import [Link].* ;
import [Link].*;
extends
ents
implem
Fenêtre
ActionListener :
t ion Li s tener
addAc actionPerformed {}
Gestion de plusieurs composants
Entrée de plusieurs boutons
- Déclaration des boutons
- Ajout à la même fenêtre par add
- Exemple : [Link]
Gestion de plusieurs composants
La fenêtre écoute les boutons
- On peut faire de la fenêtre l’objet écouteur de tous les boutons :
- Dans ce cas :
Prévoir exactement la même réponse
Prévoir une réponse dépendant du bouton concerné, ce qui
nécessite de l’identifier
Tous les boutons déclenchent la même réponse : Boutons1
…
[Link](this); // la fenêtre écoute monBouton1
[Link](this); // la fenêtre écoute monBouton2
}
public void actionPerformed (ActionEvent ev) // gestion commune
{ [Link] ("action sur un bouton") ; // de tous les boutons
}
Gestion de plusieurs composants
Une seule méthode pour les deux boutons
- Mais action différente : grâce à la méthode getSource
Fournit une référence (de type Object) sur l’objet ayant déclenché
l’événement
Exemple : [Link]
public void actionPerformed (ActionEvent ev)
{ if ([Link]() == monBouton1)
[Link] ("action sur bouton numéro 1") ;
if ([Link]() == monBouton2)
[Link] ("action sur bouton numéro 2") ;
}
Gestion de plusieurs composants
Classe écouteur différente de la fenêtre
- Dans les exemples précédents, on a fait de la fenêtre l’objet
écouteur des boutons
- Voyons des situations où l’écouteur est différent de la
fenêtre
Deux possibilités :
• Une classe écouteur par bouton
• Une seule classe écouteur pour tous les boutons
Classe écouteur différente de la fenêtre : [Link]
import [Link].* ;
import [Link].* ;
import [Link].* ;
class Fen2Boutons extends JFrame
{
private JButton monBouton1, monBouton2 ;
public Fen2Boutons (){
setTitle ("Avec deux boutons") ;
setSize (300, 200) ;
monBouton1 = new JButton ("Bouton A") ;
monBouton2 = new JButton ("Bouton B") ;
Container contenu = getContentPane() ;
[Link](monBouton1) ;
[Link](monBouton2) ;
EcouteBouton1 ecout1 = new EcouteBouton1() ;
EcouteBouton2 ecout2 = new EcouteBouton2() ;
[Link](ecout1);
[Link](ecout2);
}
}
class EcouteBouton1 implements ActionListener{
public void actionPerformed (ActionEvent ev){
[Link] ("action sur bouton 1") ; }
}
class EcouteBouton2 implements ActionListener{
public void actionPerformed (ActionEvent ev){
[Link] ("action sur bouton 2") ;
}
}
public class Boutons4{
public static void main (String args[]){
Fen2Boutons fen = new Fen2Boutons() ;
[Link](true) ;
}
}
Premier dessin
Remarques :
- Java permet de dessiner sur n’importe quel composant en
utilisant des méthodes de dessin
- Cependant, si on utilise directement ces méthodes, le dessin
disparaît au premier changement de taille…
- Pour obtenir une permanence complète des dessins,
Il est nécessaire de placer les instructions de dessin dans une
méthode particulière du composant concerné, nommée
paintComponent
Cette méthode est automatiquement appelée par Java chaque fois
que le composant a besoin d’être dessiné ou redessiné
- On ne dessine pas dans la fenêtre, mais dans un panneau
Premier dessin
Création d’un panneau : [Link]
- Objet de la classe JPanel
Sorte de sous-fenêtre sans titre ni bordure
Rectangle qui reste invisible tant qu’on lui a pas donné de couleur
- Contrairement à la fenêtre :
Un panneau ne peut pas exister de manière autonome
- Voici comment le créer et l’ajouter à la fenêtre :
{ MaFenetre ()
{…
paneau = new JPanel() ;
getContentPane().add(paneau) ;
// on le définit ici car il est associé à la fenêtre
}
private JPanel paneau ;}
- On peut le colorier : setBackground([Link]);
Premier dessin
Dessin dans le panneau : [Link]
- Comme déjà dit auparavant :
Pour obtenir un dessin permanent dans un composant, il faut
redéfinir sa méthode paintComponent dont on sait qu’elle sera
appelée chaque fois que le composant aura besoin d’être redessiné
- Comme il s’agit de redéfinir une méthode de la classe JPanel
Il faut faire obligatoirement que notre panneau soit un objet dérivé
de la classe JPanel
- paintComponent possède cet entête:
Void paintComponent (Graphics g)
• Graphics :
• Classe qui contient toutes méthodes pour dessiner, colorier
• Gère également des paramètres courants comme : couleur de
fond, couleur de trait, style de trait, police, …
Premier dessin
Jpanel
paintComponent(Graphics g)
JFrame
dérive de dérive de À redéfinir
Fenêtre
Panneau propose plusieurs méthodes
de dessin
Premier dessin
Dessin dans le panneau : [Link]
…
pan = new Paneau() ;
getContentPane().add(pan) ;
[Link]([Link]) ; // couleur de fond = jaune
}
private JPanel pan ;
}
class Paneau extends JPanel
{ public void paintComponent(Graphics g)
{ [Link](g) ; // initialise l’objet g dans sa classe
[Link] (15, 10, 100, 50) ;
[Link](30, 30, 100, 50) ;
[Link](40, 10, 100, 50) ;
}
}…
Premier dessin
Forcer le dessin : [Link]
- On cherche à modifier le dessin en cours d’exécution
- On dispose de deux boutons :
Rectangle, Ovale
- Le panneau doit s’effacer à chaque
nouveau clic
On utilise dans ce cas la méthode
repaint qui va faire dessiner tout
le panneau dans la couleur de son
"background" puis faire appel à la méthode paint du panneau (une
instance de Jpanel) pour effacer le dessin
- On utilise le gestionnaire de position par défaut « BorderLayout »
Dispose les éléments au centre et aux quatre bords
[Link](null, "Hello");
Les boîtes de dialogue
La boîte de message usuelle : [Link]
- Cette possibilité peut très bien être exploitée dans un
programme en mode console, comme suit :
import [Link].* ;
import [Link].* ;
public class Mess2
{ public static void main (String args[])
{ [Link] ("avant message") ;
[Link](null, "Hello");
[Link] ("apres message") ;
}
}
- Dans ce cas, le programme ne crée pas de fenêtre graphique,
mais il affiche quand même la boîte de message
Les boîtes de dialogue
Autres possibilités :
- Il existe une autre variante de la méthode showMessageDialog
qui permet de choisir :
Le contenu du message,
Le titre de la boîte,
Le type d'icône parmi la liste suivante :
JMenuBr
JMenuBr
JMenu
Les menus, les actions et les
barres d'outils
Création d'un objet menu : [Link]
- Déclaration par le constructeur JMenu
- Ajout à la barre par add
JMenu couleur = new JMenu ("Couleur") ; // crée un menu de nom couleur
[Link](couleur) ; // l'ajoute à barre
Création d'une option
- Déclaration par appel au constructeur JMenuItem
- Ajout au menu par add :
Jmenu rouge = new JMenuItem ("Rouge") ; // crée une option de nom rouge
[Link](rouge) ; //l'ajoute au menu couleur
Les menus, les actions et les
barres d'outils
Raccourcis Clavier :
- Il existe deux sortes de raccourcis clavier :
Les caractères mnémoniques
Les accélérateurs
- Les caractères mnémoniques
Pour associer un caractère mnémonique à un menu ou à une option, on
utilise la méthode setMnemonic de la classe AbstractButton
Exemple :
JMenu couleur = new JMenu ("couleur")
[Link] ('c'); // C =caractère mnémonique du menu Couleur
JMenuItem rouge = new JMenuItem ("Rouge")
[Link] ('R'); // R =caractère mnémonique de l'option Rouge
On peut aussi préciser le mnémonique à la construction
JMenu couleur = new JMenu ("couleur", 'C')
Les menus, les actions et les
barres d'outils
Raccourcis Clavier :
- Les accélérateurs
Il s'agit là d'une combinaison de touches qu'on associe à une option et qui
s'affiche à droite de son nom
Pour associer une telle combinaison, on utilise la méthode setAccelerator
de la classe JMenuItem, à laquelle on fournit en argument, la combinaison
de touches voulues
Pour ce faire, on utilise la méthode statique getKeyStroke de KeyStroke
Exemple : associer CTR/R à une option rouge
JMenuItem rouge = new JMenuItem ("Rouge")
[Link]([Link](KeyEvent.VK_R,InputEvent.CTRL_
MASK)
Exemple : Accel1
Les menus, les actions et les
barres d'outils
La bulle d'aide : [Link]
- Message affiché qui apparaît quand on laisse la souris
appuyée sur certains composants
- Obtention :
L'associer au composant, par ex : ici rouge
[Link] ("fond rouge");
Les menus, les actions et les
barres d'outils
Composition des options :
- Une option peut à son tour faire apparaître une liste de sous-
options
- Pour obtenir ce résultat, il suffit d'utiliser dans un menu une
option qui soit non plus de type JMenuItem, mais de type
Jmenu
- Après, on peut rattacher à ce sous-menu les options de notre
choix
Exemple : Compos
Les menus, les actions et les
barres d'outils
Les barres d'outils
- Une barre d'outils est un ensemble de boutons disposés
linéairement sur un des bords de la fenêtre
- En général, ces boutons comportent des icônes plutôt que des
libellés
- Parfois, ces barres sont flottantes, i.e. on peut les déplacer d'un
bord à l'autre de la fenêtre
- Java permet de réaliser facilement de telles barres d'outils
Les menus, les actions et les
barres d'outils
Les barres d'outils : [Link]
- Création d'une barre d'outils
JToolBar barreCouleurs = new JToolBar();
- Introduction de boutons dans la barre
JButton boutonRouge = new Button ("Rouge");
[Link](boutonRouge);
JButton boutonVert = new Button ("Vert");
[Link](boutonVert);
- Ajout de la barre à la fenêtre fen
[Link]().add(barreCouleurs);
- Gestion de la barre
Identique à celle des boutons
Les menus, les actions et les
barres d'outils
Utilisation d'icônes dans une barre d'outils
- On sait qu'un bouton (JButton) peut être créé avec une icône
au lieu d'un texte
- Si on dispose d'un fichier nommé [Link] et contenant un
dessin d'un carré de couleur rouge, on peut créer un objet
icône de cette façon :
ImageIcon iconRouge = ImageIcon("[Link]")