Académique Documents
Professionnel Documents
Culture Documents
Interfaces graphiques
Java
1. Interface graphique
2. MVC
3. Javadoc
2
AWT vs Swing
Abstract Window Toolkit (java.awt.*)
"Figé" depuis 1.1
Présent dans les navigateurs sans plug-in
Gestion des événements obsolète
Composants système -> pb portabilité
Swing (javax.swing.*)
Toujours en évolution
Plus complexe qu'AWT
Surcouche d'AWT (Jcomposant)
3
Swing
Composants de haut-niveau
JFrame, JDialog, JApplet
Conteneurs
JPanel, JScrollPane, JToolBar
Composants basiques
JMenu, JButton, JLabel
Dessiner
Canvas (AWT), JPanel (Swing)
Index graphique des composants Swing
http://docs.oracle.com/javase/tutorial/ui/features/components.html
4
5
6
7
Premier exemple
8
Premier exemple (2)
JFrame contient tous les autres.
JPanel est un container intermédiaire
JButton & Jlabel composants atomiques
9
Premier exemple : code
import javax.swing.*;
import java.awt.*;
public class Exemple1 {
public static void main(String[] args) {
JFrame frame = new JFrame("exemple");
JButton button = new JButton("clic clic");
JLabel label = new JLabel("un petit texte");
JPanel pane = new JPanel();
pane.add(button);
pane.add(label);
frame.getContentPane().add(pane,BorderLayout.CENTER);
}
}
10
Ajouter des composants ?
Que se passe-t'il ?
// apres frame.getContentPane().add(pane...)
frame.getContentPane().add(new JLabel("2"));
Nécessité de positionner les éléments
Qui peut recevoir des composants ?
Composants de haut niveau
Conteneurs
Panels
11
Positionnement
Placer des composants
Taille (minimale, maximale et préférée)
Position relative (portabilité)
Position absolue
Politique de placement d'un conteneur : Layout
JFrame, JDialog, JPanel, …
Complexe à manipuler
Conteneurs et Layouts spécialisés en cascade
GUI Builder
Matisse / Netbeans avec GroupLayout
VEP / Eclipse
IntelliJ
12
Layout Manager (1)
13
http://java.sun.com/docs/books/tutorial/uiswing/layout/visual.html
Layout Manager (2)
Flow
Card
Box
GridBag
Border
Spring
Grid
Aucun
14
Utilisation : Border Layout
Ajouter au panel avec une contrainte
frame.getContentPane().add(pane, BorderLayout.CENTER);
définir le layout du JPanel avec
pane.setLayout(new BorderLayout());
15
Exemple 2
JFrame frame = new JFrame("exemple");
JButton button = new JButton("clic clic");
JLabel label = new JLabel("un petit texte");
JButton button2 = new JButton("deuxieme bouton");
JPanel pane = new JPanel();
pane.setLayout(new BorderLayout());
pane.add(button, BorderLayout.NORTH);
pane.add(label, BorderLayout.CENTER);
pane.add(button2, BorderLayout.SOUTH);
frame.getContentPane().add(pane, BorderLayout.CENTER);
frame.show();
16
Exemple 3
JFrame frame = new JFrame("exemple");
JButton button = new JButton("clic clic");
JLabel label = new JLabel("un petit texte");
JButton button2 = new JButton("deuxieme bouton");
JButton button3 = new JButton("troisieme bouton");
JButton button4 = new JButton("quatrieme bouton");
JPanel pane = new JPanel();
pane.setLayout(new GridLayout(3,2));
pane.add(button);
pane.add(label);
pane.add(button2);
pane.add(button3);
pane.add(button4);
frame.getContentPane().add(pane,BorderLayout.CENTER);
frame.show(); 17
Exemple 4
JFrame frame = new JFrame("exemple");
JButton button1 = new JButton("bouton1");
JLabel label1 = new JLabel("texte1");
JLabel label2 = new JLabel("texte2");
JButton button2 = new JButton("bouton2");
JButton button3 = new JButton("bouton3");
JButton button4 = new JButton("bouton4");
JButton button5 = new JButton("bouton5");
JPanel pane1 = new JPanel(new BorderLayout());
/* on peut spécifier le layout à la construction */
JPanel pane2 = new JPanel(new BorderLayout());
JPanel pane3 = new JPanel(new BorderLayout());
pane1.add(button1, BorderLayout.EAST);
pane1.add(label1, BorderLayout.WEST);
pane1.add(pane2, BorderLayout.CENTER);
pane2.add(button2, BorderLayout.NORTH);
pane2.add(button3, BorderLayout.SOUTH);
pane2.add(pane3, BorderLayout.CENTER);
pane3.add(button4, BorderLayout.EAST);
pane3.add(button5, BorderLayout.WEST);
pane3.add(label2, BorderLayout.CENTER);
frame.getContentPane().add(pane1, BorderLayout.CENTER); 18
frame.show();
Arborescence
19
Exemple 5
JFrame frame = new JFrame("exemple");
JButton button1 = new JButton("Ô rage");
JButton button2 = new JButton("Ô désespoir");
JButton button3 = new JButton("Ô vieillesse ennemie");
JLabel label1 = new JLabel(new ImageIcon("duke.gif"));
JPanel pane1 = new JPanel(new GridLayout(0, 1));
pane1.add(button1);
pane1.add(button2);
pane1.add(button3);
frame.getContentPane().add(pane1, BorderLayout.EAST);
frame.getContentPane().add(label1, BorderLayout.CENTER);
frame.show();
Classe JOptionPane
Méthodes statiques showXXXDialog
Message, Confirm, Option, Input
JOptionPane.showConfirmDialog(frame,"Alors, ça vous plaît ?");
21
Événements
Communication entre les composants d'une
application et avec l'utilisateur
Envoi de messages
Gestion des événements incompatible entre AWT
et Swing
Réaction au moindre événement
Action
Souris ? (déplacement, clic, action)
Clavier ? (appui, focus)
Fenêtre ? (déplacement, visibilité)
22
Gestionnaire d'événements
Surveiller (écouter) les messages/événements
Délégation des actions à réaliser
1.Écrire le gestionnaire
Implémentation de Listener (interface)
OU
Spécialisation d'Adapter (classe)
2.Enregistrer le gestionnaire
23
Appuyer sur un bouton
class Gestionnaire extends AbstractAction {
public void actionPerformed(ActionEvent e) {
// ce qu'il y a a faire
} OPTION 1
}
// Ecrire le gestionnaire
class Gestionnaire implements ActionListener {
public void actionPerformed(ActionEvent e) {
// ce qu'il y a a faire
} OPTION 2
}
// enregistrement du gestionnaire
JButton bouton = new JButton("Libelle");
bouton.addActionListener(new Gestionnaire()); 24
Boutons
button1 = new JButton();
ActionListener myActionListener = new ActionListener();
button1.addActionListener(myActionListener);
...
class MyActionListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
if(event.getSource() == button1) {
// button1 clicked
} else {
...
}
}
}
25
WindowsListener
private class MyWindowListener implements WindowListener {
public void windowActivated(WindowEvent event) {
}
public void windowDeactivated(WindowEvent event) {
}
public void windowClosing(WindowEvent event) {
System.exit(0);
}
public void windowClosed(WindowEvent event) {
}
public void windowIconified(WindowEvent event) {
}
public void windowDeiconified(WindowEvent event) {
}
public void windowOpened(WindowEvent event) {
}
}
private class MyWindowListener extends WindowAdapter {
public void windowClosing(WindowEvent event) {
System.exit(0);
} 26
}
Barre de menus
Zone
Zonespéciale
spéciale≠≠BorderLayout.NORTH
BorderLayout.NORTH
Fichier
Fichier
menuBar = new JMenuBar();
Nouveau
Nouveau frame.setJMenuBar(menuBar);
Ouvrir
Ouvrir
Sauvegarder
Sauvegarder menu = new JMenu("Fichier");
menuBar.add(menu);
Quitter
Quitter item = new JMenuItem("Nouveau");
menu.add(item);
menu.addSeparator();
27
Exemple Menu
JFrame frame = new JFrame("exemple");
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("File");
JMenu submenu = new JMenu("Property");
menu.add(new JMenuItem("New"));
menu.add(new JMenuItem("Open"));
menu.add(new JMenuItem("Save"));
menu.add(new JSeparator());
menu.add(submenu);
submenu.add(new JMenuItem("Big"));
submenu.add(new JMenuItem("Small"));
menuBar.add(menu);
frame.setJMenuBar(menuBar);
frame.show();
28
Plan
1. Interface Graphique
2. MVC
3. Javadoc
29
Modèle Vue Contrôleur
Modèle
Mi
Inf
se
o rm
à jo
ur d
el ec
e
um
dèl
on t
odè
mo
rôl
le e
du
eur
n fo
uel
d 'u
act
nct
nc
ion
t
ha n
éta
des
e l'
g em
nd
éve
e nt
ma
nem
De
d'é
nts e
ta t
reçus
Action utilisateur : on contrôle
Vue La vue doit être mise à jour Contrôleur
30
Modèle
Contient les données manipulées
Gère / garantit l’intégrité de ses données
Méthodes pour récupérer ses données
La couche métier
31
Vue
Interface avec laquelle l'utilisateur
interagit
Présenter les résultats
Recevoir toutes les actions de l'utilisateur
Événements sont envoyés au contrôleur
La vue n'effectue aucun traitement
32
Contrôleur
Définit le comportement de l'application
Gestion des événements
Mettre à jour la vue ou le modèle et les
synchroniser
Effectue les traitements
Calculs
Appels réseau
...
33
Modèle MVC
Modèle
Données
Vue
Interface(s) graphique(s) pour l’affichage et
l’interaction avec l’utilisateur
Contrôleur
Communication entre les composants
Traitements
34
Nouveau système pour la gestion des commandes
35
Main
class ExempleViewController{
public static void main() {
//notre modèle est autonome
CommandeModele model = new CommandeModele();
//ces références dépendent du modèle
CashierController vc1 = new CashierController(model);
CashierController vc2 = new CashierController(model);
CookController vc3 = new CookController(model);
CookController vc4 = new CookController(model);
}
}
36
Le Modèle
public class CommandeModele extends Observable {
Vector orders; // liste de toutes les commandes
// ...CommandeModele()...
// ...getCommandeIterator()...
public void ajouterCommande(Commande newOrder) {
orders.add(newOrder); // modification du modele
setChanged(); // le modele a change (vecteur)
notifyObservers(); // notification globale
}
// idem avec supprimerCommande()
// ...
}
37
Le Contrôleur
public class CookController implements Observer,CuisineController {
CommandeModele model;
CuisineVue view;
public CookController(CommandeModele inModel) {
model = inModel;
model.addObserver(this);
view = new CookView(this) ; Appelée par
} notifyObservers()
@Override
public void update(Observable o, Object arg) {
if (model.getNombreDeCommandes() == 0)
view.disableRemoveButton();
view.miseAJourVue(model.getListCommande());
}
public void onButtonAddClicked() {
Commande c = view.getCurrentCommand();
model.ajouterCommande(c);
}
} 38
La Vue
public class CookView implements CuisineVue {
CuisineController controller;
JButton buttonRemove, buttonAdd;
JButton buttonNext;
public CuisineVue(CuisineController controller) {
this.controller = controller; Appelée par
initialiserVue();
} le contrôleur()
public void miseAJourVue(List<Commande> list ) {
// ...mettre à jour ce qui est vu à l'écran
}
39
La classe Observable (java.util)
Cette classe représente un objet observable par
d'autres, au niveau du modèle de données.
Un objet observable possède un ou plusieurs
observateur, ajoutés par la méthode
addObserver(Observer o)
40
La classe Observable (java.util)
La méthode notifyObservers permet de notifier
les observateurs d ’une modification dans l ’état.
Une modification est reflétée par la méthode
setChanged().
Une fois les observateurs notifiés, la méthode
clearChanged permet d ’indiquer que l ’objet
n ’est plus dans l ’état modifié.
41
L'interface Observer (java.util)
42
L'interface Observer (java.util)
Le premier paramètre est l ’objet qui
notifie.
Le second paramètre est un objet passé
à la méthode update, au moyen d ’un
appel à la méthode notifyObserver(Object
o)
43
Plan
1. Interface Graphique
2. MVC
3. Javadoc
44
Introduction Javadoc
javadoc est le 3e programme essentiel
fourni avec le SDK (java, javac)
Génère documentation au format de html
Utiliser cet outil est fondamental pour
programmer en Java : bonnes manières
/**
* documentation pour
* methode/classe/attributs/parametres/etc.
*/
45
Exemple
package prog ;
/**
*@author Chuck Noris
*La classe personne modelise une personne
*/
public class Personne implements Cloneable {
/**
*l'age de la personne ,doit etre positif
*/
private int age ;
/**
*le nom de la personne , une simple chaine de caracteres
*/
private String name ;
46
Exemple (2)
/**
*constructeur pour la classe Personne
*@param age un entier >= 0
*@param aName le nom de la personne
*/
public Personne ( int age , String aName) {
this.age = age ;
name = aName;
}
/**
*modifie l'age de la personne
*@param age un entier >= 0
*@throws NegativeAgeException si l'age est negatif
*/
public void setAge ( int age ) throws NegativeAgeException {
if ( age < 0 ) {
throw (new NegativeAgeException ("erreur : l'age doit etre > 0");
this.age = age ;
}
}
47
Exemple (3)
@Override
/**
*cree une representation sous forme de string de l'objet personne
* @return une chaine de caracteres
*/
public String toString ( ) {
return name + " age : " + age ;
}
48
49
Utilisation
En ligne de commande :
option -d : répertoire destination
arguments : noms de package
(prog.nompackage) et/ou noms de fichiers
.java
man javadoc
javadoc d doc prog
50
Quelques Tags
51
Exercice
52
Exercice
Écrire le programme suivant
++ / -- un entier
53
public class Exercice {
private int count = 0;
private JLabel label;
private JButton buttonPlus;
private JButton buttonMoins;
public Exercice() {
JFrame frame = new JFrame("exemple");
frame.addWindowListener(new MyWindowListener());
buttonPlus = new JButton("plus");
buttonMoins = new JButton("moins");
buttonPlus.addActionListener(new MyActionListener());
buttonMoins.addActionListener(new MyActionListener());
label = new JLabel("0", SwingConstants.CENTER);
JPanel pane = new JPanel(new BorderLayout());
JPanel buttons = new JPanel(new GridLayout(0, 1));
buttons.add(buttonPlus);
buttons.add(buttonMoins);
pane.add(buttons, BorderLayout.WEST);
pane.add(label, BorderLayout.CENTER);
frame.getContentPane().add(pane, BorderLayout.CENTER);
frame.show();
}
54
private class MyActionListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
if(event.getSource() == buttonPlus) {
count++;
} else {
count;
}
label.setText(Integer.toString(count));
}
}
}
55