Академический Документы
Профессиональный Документы
Культура Документы
interface
graphique en Java
Introduction
à Java Swing
La conception d’interfaces graphiques étant loin d’être triviale, et les packages proposés
pour cela par le JDK étant parmi les plus « complexes » (29 packages) nous n’avons pas
la prétention d’être exhaustif. Il s’agit de donner les éléments de bases qui vous
permettront ensuite d’aller plus loin dans la création d’interfaces utilisateur.
Une partie de ce cours est basée sur un exemple tiré du chapitre 4 du livre « Java La Synthèse, 2ème
edition » de G. Clavel, N. Mirouze, S. Moucherot, E. Pichon et M. Soukal (InterEditions).
Certains éléments concernant la gestion des événements sont directement inspirés du cours « Swing
Crash course » de Matthias Hauswirth http://www.isbiel.ch/I/Resources/Comp/Sun/Java/Swing/
D'autres sont inspirés du cours « Graphical User Interface in Java » de Jonas Kvarnström
Nécessité d'offrir une API pour les interfaces graphiques indépendante elle
aussi des plateformes
Classes et interfaces java
TextField(String content)
TextField()
String getText()
...
X Window + gtk
MacOS X
API GUI cible
MS Windows
...
API Java Adaptater GUI cible
Application
Java
Avantages / désavantages
(+) apparence et le comportement (look and feel) des interfaces Java identique à celui
d'applications « ordinaires »
(+) pas besoin de réimplémenter des composants existants
(-) ne permet de ne fournir que les composants disponibles sur toutes les plateformes
Classe abstraite
TextField décrit caractéristiques
Object
communes à tous les composants pouvant
Choice composants contenir d’autres
composants
List Component
Label Button
Checkbox TextField TextArea Window Panel ScrollPane
Frame Dialog
Frame Panel
FileDialog
Avantages / désavantages
(+) facilité d'éviter les différences entre plateformes
(+) n'importe quel nouveau composant d'interface est immédiatement disponible
(-) les applications java n'ont pas le même look and feel que les applications
« ordinaires »
(-) lenteur ?
– Prennent en charge leur affichage sans passer par des objets « Peers » gérés par le
système
– multiplication des composants plus riches en fonctionnalités (listes arborescentes, grilles….)
Penser à étudier des programmes sources pour apprendre à se servir des swing
composants de base
conteneurs
fenêtres
*d'après « Java La Synthèse , 2ème edition » de G. Clavel, N. Mirouze, S. Moucherot, E. Pichon et M. Soukal (InterEditions).
l’application
La fenêtre joue le rôle de « conteneur » dans lequel vont être disposés
contrôles (IHM)
widgets (Xwindow-Motif)
Dans le constructeur
lb.setIcon(new ImageIcon("info.gif"));
Spécification de la position du texte par rapport à l’icône
lb.setVerticalTextPosition(SwingConstants.BOTTOM);
lb.setHorizontalTextPosition(SwingConstants.CENTER);
Mise en forme du texte
setText supporte HTML
Modification du texte
Par interaction de l’utilisateur
jtf.setText("le texte");
Récupérer le texte
JComponent
jtf.getText();
Copier / Coller
jtf.copy() ou jtf.cut() JTextComponent
JTextField a des frères
jtf.paste();
Interdire saisie
JTextArea JTextField JEditorPane
jtf.setEditable(false);
et des fils
Saisie de Saisie avec
JPasswordField JFormattedField vérification d'un
mot de passe
format
© Sofia Zaidenberg CNRS Mai 2007 16
Composants
Composants graphiques
graphiques Swing
Swing JButton
JButton
Usage : un bouton permettant de déclancher une action
setDisabledIcon()
Association d'un raccourci clavier
jbt.setMnemonic('b'); // Alt + b
ON JToggleButton JButton
OFF
Forcer l'état
jtbt.setSelected(true)
Consulter l'état
jtbt.isSelected() true ou false
Usage : JComponent
cases à cocher (états indépendants)
ButtonGroup
et boutons radio
AbstractButton
(états dépendant au sein d'un groupe
de boutons)
JToggleButton JButton
JCheckBox cb1 = new JCheckBox("Chin");
JCheckBox cb2 = new JCheckBox("Glasses");
JCheckBox cb3 = new JCheckBox("Hair");
JCheckBox cb4 = new JCheckBox("Teeth"); JRadioButton JCheckBox
isEnabled() boolean
isVisible() boolean
setForeGroundColor(java.awt.Color)
…
swing
Window Panel JComponent Box ...
Component add(Component)
Component add(Component, int)
...
void remove(int)
void remove(Component)
...
int getComponentCount()
Component getComponent(int)
composant bouton 1
qui affiche
du texte
bouton 2
fenêtre
contient
panneauGauche.add(composantTexte);
panneau gris foncé
panneauDroite.add(bouton1);
panneauDroite.add(bouton2);
panneau gauche panneau droite
panneauGris.add(panneauGauche);
panneauGris.add(panneauDroite);
composant texte bouton1 bouton2
fenêtre.add(panneauGris);
awt Component
dispose() permet de libérer les ressources natives utilisées par le système pour afficher
la fenêtre et les composants qu'elle contient
Par défaut à la fermeture d'une fenêtre, elle est simplement rendue invisible
on verra plus tard comment définir nos propres comportements
prédéfinis
setDefaultCloseOperation(int operation)
WindowConstants.HIDE_ON_CLOSE
WindowConstants.DO_NOTHING_ON_CLOSE
WindowConstants.EXIT_ON_CLOSE
WindowConstants.DISPOSE_ON_CLOSE
© Sofia Zaidenberg CNRS Mai 2007 27
Fenêtre
Fenêtre d’application
d’application
Toute fenêtre d’application est représentée par une classe dérivant
ou utilisant la classe JFrame du package javax.swing
import javax.swing.JFrame; • se comporte comme toute
public class MyFrame extends JFrame {
fenêtre du système
d’exploitation :
final static int HAUTEUR = 200; • peut être redimensionnée,
final static int LARGEUR = 300; déplacée, …
public MyFrame() {
an
setTitle("Ma première Fenêtre");
e la f en ê tre à l’écr
setSize(LARGEUR,HAUTEUR); • affich n
t h rea d » d’exécutio
• lance un « ractions sur cette
setVisible(true);
} r inte
pour gére
fenêtre
public static void main(String[] args) {
new MyFrame();
do {
System.out.println("dans le thread principal");
System.out.println("voulez vous poursuivre le thread • par défaut la fermeture de
principal ?"); la fenêtre la rend simplement
} while (LectureClavier.lireOuiNon()); invisible elle ne termine pas
System.out.println("fin thread principal"); son thread d'exécution !
}
}
Les composants qui seront visibles dans la fenêtre seront placés dans un
conteneur particulier associé à celle-ci : Content Pane
pour récupérer ce conteneur :
getContentPane() Container
import javax.swing.*;
import java.awt.*;
public class MyFrame extends JFrame {
public class MyFrame extends Frame {
final static int HAUTEUR = 200;
final static int HAUTEUR = 200;
final static int LARGEUR = 300;
final static int LARGEUR = 300;
public MyFrame() {
public MyFrame() {
setTitle("Ma première Fenêtre");
setTitle("Ma première Fenêtre");
setSize(LARGEUR,HAUTEUR);
setSize(LARGEUR,HAUTEUR);
Button b = JButton b =
new Button("Mon 1er composant"); new JButton("Mon 1er composant");
add(b); this.getContentPane().add(b);
show();
setVisible(true);
}
}
}
}
Classes utilisées :
JMenuBar : représente
la barre de menu d’une
fenêtre Fichier Aide
Nouveau A propos
Quitter
JMenu : options
visibles dans la barre
de menu
AbstractButton
JFrame
JMenuItem
0..1
JMenuBar JMenu
} // MenuEditeur
import java.swing.*;
public MyFrame() {
setTitle("Ma première Fenêtre");
setSize(LARGEUR,HAUTEUR);
setJMenuBar(new MenuEditeur());
setVisible(true);
} setJMenuBar prend en paramètre une instance de la
classe JMenuBar :
• soit une instance directe de JMenuBar qui aura été
public static void main(String[] args) modifiée grâce aux méthodes add(…)
{ • soit une instance d’une classe dérivée de JMenuBar
new MyFrame(); comme dans le cas présent
}
}
JPanel :
Aspect réduit au minimum :
rectangle invisible dont on peut
fixer la couleur de fond
Utilisé pour regrouper des
composants dans une fenêtre
JSplitPane:
permet de séparer son
contenu en deux zones
distinctes dont les surfaces
respectives peuvent varier
dynamiquement
JToolBar:
barre d'outils (regroupe JTabbedPane:
des boutons) tableau à onglets
JDesktopPane:
permet de définir des
fenêtres internes
dans une fenêtre
import java.awt.*;
import javax.swing.*;
} // BarreOutils }
– composants placés les uns après les autres dans leur ordre d’ajout
– le tout doit être centré
réordonnancement automatique des composants lorsque la fenêtre est redimensionnée
FlowLayout
GridLayout
CardLayout
GridBagLayout
North three
one one
two two three
import javax.swing.*;
import java.awt.*; JPanel
JLabel
public class BarreEtat extends JPanel { GrigLayout : 1 ligne, 2 colonnes
private JLabel coord, info;
Associe un GridLayout en
public BarreEtat() { spécifiant le nombre de
this.setBackground(Color.darkGray); lignes et colonnes
this.setLayout(new GridLayout(1,2));
this.add(info = new JLabel());
this.add(coord = new JLabel());
} Ajout des composants dans
les différentes cellules
public void afficheCoord(int x, int y) définies par le layout
{
coord.setText("x : " + x + " y : " + y);
}
Zone dessin
« Center »
BarreEtat
« South»
public MyFrame () {
BarreEtat barreEtat;
Associe un BorderLayout en setTitle("Ma première Fenêtre");
spécifiant espacement entre setSize(LARGEUR,HAUTEUR);
setJMenuBar(new MenuEditeur());
les composants this.getContentPane().setLayout(new BorderLayout(2,2));
this.getContentPane().add(new BarreOutils(),"North");
this.getContentPane().add(new ZoneGraphique(),"Center");
Ajout des composants dans this.getContentPane().add(barreEtat = new BarreEtat(),"South");
les différentes régions barreEtat.afficheCoord(0,0);
définies par le layout barreEtat.afficheInfo("coordonnées du cruseur");
setVisible(true);
}
setMinimumSize.
public BarreOutils() {
JComboBox listeCouleurs;
String[] libelleCouleurs = {"Bleue", "Rouge", "Jaune", "Vert"};
Les applications comportant une interface graphique sont dirigées par les
événements (event-driven)
elles ne font rien jusqu'à ce que l'utilisateur bouge la souris, clique un bouton
Objectifs de conception
simple et facile à apprendre
Ce nouveau modèle est utilisé par AWT, Swing et sert également dans de
nombreuses API Java (servlets, SAX, java BEANS, …)
D’objets événements
actionPerformed(unEvnt) JButton
Récepteur Source
MonBouton d’événements
d’événements unObjet
2
Activer
getSource()
3 1 new ActionEvent()
ActionEvent
unEvnt
pointeur souris
Les différents types d’événements sont représentés par des classes différentes
ActionEvent, MouseEvent …
Object
EventObject
les différents types d’événements
liés à AWT héritent de AWTEvent
EventObject(Object source) sont rangés dans le package
Object getSource( ) java.awt.event
AWTEvent
Permet d’identifier plusieurs types
int id d’événements dans une même classe
KeyEvent MouseEvent
• Une touche du clavier • Clic souris, déplacement
a été pressée ou relâchée du pointeur de la souris
pour chaque classe d’événements une interface spécifique définit les méthodes
à appeler pour notifier les événements de cette classe
toute classe désirant recevoir des notifications d’un événement donné devra
implémenter cette interface
un récepteur d’ActionEvent doit implémenter l’interface ActionListener
la forme <EventType>Listener
exemple : les événements de AWT et les interfaces correspondantes pour les
récepteurs
Les méthodes définies dans les interfaces d’écoute doivent se conformer au schéma standard :
void <eventOccurenceMethodName>(<EventObjectType> evt);
où
eventOccurenceMethodName décrit clairement l’événement qui sera déclenché
java.util.EventObject
© Sofia Zaidenberg CNRS Mai 2007 51
Sources
Sources d’événements
d’événements
Événements générés par des sources d’événements (« event sources »)
Source d’événements, un objet capable de :
Pour être averti des événements produits par une source un récepteur doit
se faire enregistrer auprès de la source
1 addActionListener(unObjet)
actionPerformed(unEvnt ) 2 JButton
Récepteur Source
MonBouton
d’événements unObjet ... d’événements
Activer
actionPerformed(unEvnt ) 3
4 removeActionListener(unObjet)
d’événements
tS
ou
Activer
r ce
()
1
new ActionEvent( )
ActionEvent
unEvnt
Récepteur d’événements ?
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
} // ZoneGraphique
this.getContentPane().add(new BarreOutils(),"North");
this.getContentPane().add(new ZoneDessin(barreEtat),"Center");
this.getContentPane().add(barreEtat,"South");
barreEtat.afficheInfo("coordonnées du cruseur");
setVisible(true);
}
} // MyFrame
© Sofia Zaidenberg CNRS Mai 2007 58
Pour
Pour conclure
conclure (momentanément)
(momentanément)
Pour gérer les événements il faut :
Identifier l’objet à l’origine des événements (souvent un composant)
veut gérer
le choix de cette classe n’est pas neutre