Interface Homme Machine Java

publicité
Iremia, R.Courdier
Chapitre 4 : AWT - SWING
Interface Homme Machine
Java
© Rémy Courdier
1996-2007 - Java AWT SWING - Version du cours 2.10
1
Sommaire
AWT : Abstract Window Toolkit
Applet et application
Frame, Panel et Layout
Composants GUI
Les menus
Les layouts
Les images
Animations
Les polices
Gestion des événements
© Rémy Courdier
03/27/99
SWING
Nouvelle hiérarchie
Quelques composants
Quelques Thèmes
Les applets
Les composants
1996-2007 - Java AWT SWING - Version du cours 2.10
2
1
Iremia, R.Courdier
AWT – SWING
Présentation
AWT
Première interface graphique proposée par Sun
Appel direct au système d’exploitation pour l’affichage des composants
Interface différente selon l’OS
Mais + rapide
Peu de composants
SWING
Objectif : 100% de portabilité
Les composants sont dessinés par Java (seuls les codes de base accèdent à
l’OS via l’AWT)
Aspect identique
Plus gourmand en ressources
Plus de 40 composants différents
© Rémy Courdier
1996-2007 - Java AWT SWING - Version du cours 2.10
3
AWT : Abstract Window Toolkit
Applet - Application - AWT
Applet
Applets : Restrictions
Code Java lancée par un navigateur
Web
La classe Applet est fournie dans
java.applet
une applet dérive d’un Panel
Application
code exécutable de manière autonome
possède en générale une Frame
AWT
Couche d’interfaçage graphique portable
Pour Applets et Applications Java
Protocoles d’agencement d’éléments
graphiques
Protocoles de gestion d’événements
la boite à outils AWT est fournie dans
java.awt
© Rémy Courdier
03/27/99
pas d’accès au disque
pas de menus
pas de boites de dialogues
modales
problèmes de gestions de boites
de dialogues.
Points de vigilance
temps de chargements Java
propose les fichier JAR (Java
ARchive) : compression dans un
fichier signé chargeable en une
seule transaction réseau de toutes
les ressources d’une applet
perte d’informations possible
quand l’utilisateur change de page
ou ferme son navigateur
inopinément
1996-2007 - Java AWT SWING - Version du cours 2.10
4
2
Iremia, R.Courdier
AWT : Abstract Window Toolkit
Développement d’une Applet
//Fichier HTML pour Applet
Les méthodes
init() : invoquée lorsque l’applet
est chargée pour les initialisations
destroy() : invoquée lorsque
l’applet est déchargée de la mémoire
pour libérer les ressources utiles à
l’appl
stop(): invoquée chaque fois que
l’applet n’est plus visible dans le
browser Web et avant destroy()
start() : invoquée chaque fois que
l’applet est visible dans le navigateur
Web et après le init()
paint() : appelée pour chaque fois
qu’il y a une mise à jour de la fenetre
des élements graphiques de l’applet
(fait partie du scénario d’”update()”
d’un Component awt)
© Rémy Courdier
...
<applet code=“Applet1“
width=200 height=200>
</applet>
...
//Fichier Applet1.java
import java.applet.*;
import java.awt.*;
public class Applet1 extends Applet
{ public void paint (Graphics g)
{
g.drawString(“applet“,25,10);
}
}
// pour récupérer un param. String
// <param name=color1 value=“vert”>
// s=getParameter(“NomParam”);
1996-2007 - Java AWT SWING - Version du cours 2.10
5
AWT : Abstract Window Toolkit
Développement d’une Application Java
Une application Java a l’avantage ultime
d’être portable sur toutes les plate-formes
informatiques majeurs : MS-Windows,
UNIX OSF/Motif, Mac OS7/8,
OS/2 Presentation Manager, etc.
// Fichier Appi.java
import java.awt.*;
public class Appli extends Frame {
public Appli() {
// constructeur joue le role
// de la methode init() de
// l’applet
...
}
Il peut y avoir certaines modifications du
look-and-feel de l’OS natif induites par
l’AWT qui impose son propre mécanisme
de gestion des éléments d’interfaces
graphique.
Attention a réaliser du code 100% “pure”
Java. (...Java SDK 2.0 de Microsoft,
encore lui... )
public static void main (...) {
Appli app = new Appli();
app.show();
}
}
© Rémy Courdier
03/27/99
1996-2007 - Java AWT SWING - Version du cours 2.10
6
3
Iremia, R.Courdier
AWT : Abstract Window Toolkit
Principales classes “component“ de l’AWT
Component : classe de base
Container : gestionnaire de
composants
Window : Fenêtre sans bordure
Frame : Fenêtre avec bordure
Dialog : Boite de dialogue
Panel : conteneur pour agencement
Canvas : Fenêtre pour dessiner
Contrôles de Dialogue :
Button : Boutton
Checkbox : Boite à cocher + Radio
Choice : sorte de combo box
Label : Texte statique
List : Liste à choix
Scrollbar : Barre de défilement
TextArea : champs de texte multiligne
TextField : champ de texte simple
© Rémy Courdier
Component
Button
Canvas
Checkbox
Choice
Container
Panel
Applet
Window
Dialog
FileDialog
Label
List
Scrollbar
TextComponent
TextArea
TextField
1996-2007 - Java AWT SWING - Version du cours 2.10
7
AWT : Abstract Window Toolkit
Principales méthodes utiles de la classe Component
void show() :
void hide() :
Dimension size() :
void resize(int larg, int haut) :
Rectangle bounds() :
void enable() :
void disable() :
void repaint() :
void update(Graphics g) :
void paint(Graphics g) :
void pack():
avec getPreferedSize()
© Rémy Courdier
03/27/99
Affiche le composant
Masque le composant
Retourne la taille largeur, hauteur
Re-dimensionne le composant
Défini une zone rectangulaire
Active le composant
Désactive le composant
pour demander de rafraichissement
Appelé par repaint(),
par défaut efface le fond
Appelé par update()
Redessine le composant
Retaille la fenêtre principale pour
l’adapter au composant
1996-2007 - Java AWT SWING - Version du cours 2.10
8
4
Iremia, R.Courdier
AWT : Abstract Window Toolkit
Principales autres classes de l’AWT
dessin : la classe Graphics
classe utilisée pour dessiner, afficher du
texte, etc dans une Fenêtre
exemple : drawLigne, drawRect,
fillRect, fillPolygon,
drawString, etc...
cette classe possède également des
méthodes pour changer de Font ou de
Color
L’accès à cette classe s’effectue
généralement dans la méthode paint() des
composants
Agencement : les classes Layout
les “layout” permettent d’agencer les
Components dans un Container
Ne pas positionner par programme les
composants graphiques.
...Problème de résolution d’écrans, de
système d’exploitation,...
Panel p = new Panel();
p.setLayout(new GridLayout(2,3));
© Rémy Courdier
Color
Dimension
Event
Component
Button
...
Graphics
Image
Point
MenuComponent
MenuBar
MenuItem
Menu
LayoutManager
BorderLayout //West East Center
//
North South
CardLayout
//onglets simples
FlowLayout
//par défaut
GridBagLayout//Grille flexible
GridLayout
//Grille
1996-2007 - Java AWT SWING - Version du cours 2.10
9
AWT : Abstract Window Toolkit
Principaux types de layout
© Rémy Courdier
03/27/99
1996-2007 - Java AWT SWING - Version du cours 2.10
10
5
Iremia, R.Courdier
AWT : Abstract Window Toolkit
La gestion d’un menu
La barre de menu : la Classe MenuBar
Frame fr = new Frame();
MenuBar mb = new MenuBar();
fr.setMenuBar(mb);
Menu déroulant de base : la classe Menu
Menu menuFichier = new Menu (“Fichier”);
Menu menuEdition = new Menu (“Edition”);
Menu menuAide = new Menu (“Aide”);
mb.add(menuFichier ); mb.add(menuEdition );
// menu d’aide positionné à droite de la barre
mb.add(menuAide); setHelpMenu(menuAide);
sous-menu dans un Menu : la classe MenuItem
MenuItem itemOuvrir = new MenuItem (“Ouvrir”);
MenuItem itemFermer = new MenuItem (“Fermer”);
menuFichier.add(itemOuvrir);
menuFichier.add(itemFermer );
menuFichier.addSeparator(); ...
© Rémy Courdier
1996-2007 - Java AWT SWING - Version du cours 2.10
11
AWT : Abstract Window Toolkit
Les images
Classe Image
représente les images de fomats normalisés : GIF, JPEG, ...
Chargement d’une image :
Différence de méthode selon le type de code : Application ou Applet
Application :
Toolkit tk= Toolkit.getDefaultToolkit();
Image uneImage = tk.getImage(“image.gif”);
Applet :
Image uneImage = getImage(getDocumentBase(), “image.gif”);
Affichage d’une image :
public void paint (Graphics g) {
g.drawImage(uneImage,0,0,this);
}
Icone d’une fenêtre:
uneFrame.setIconImage(uneImage);
© Rémy Courdier
03/27/99
1996-2007 - Java AWT SWING - Version du cours 2.10
12
6
Iremia, R.Courdier
AWT : Abstract Window Toolkit
Les images
Par défaut le chargement réel des images s’effectue lors
de son l’affichage
Principe pour forcer le chargement des images au début
du programme
public void chargeFond(String strFond) {
MediaTracker tracker = new MediaTracker(this);
Image m_fond =
Toolkit.getDefaultToolkit().getImage(strFond);
// Force le chargement de l'image
tracker.addImage(m_fond,0);
try { tracker.waitForID(0); }
catch (InterruptedException e) { System.err.println(e); }
}
© Rémy Courdier
1996-2007 - Java AWT SWING - Version du cours 2.10
13
AWT : Abstract Window Toolkit
Animation
Une animation consiste à afficher une suite
d’images et à forcer le rafraîchissement
public void paint(Graphics g) {
g.drawImage(mesImage[numimage],x,y,this);
}
while(true) {
x+= vitessex;
y+= vitessey;
numimage++;
repaint();
}
Pour éviter le scintillement, méthode du doublebuffering
// Buffer offscreen
Image bufferImage;
Graphics bufferGraphics;
public void update(Graphics g) {
// création d’une image non visible et son «Graphic»
if (bufferImage==null) {
bufferImage = createImage(getSize().width,getSize().height);
bufferGraphics = bufferImage.getGraphics();
}
// réalisation de tous nos dessins sur cette image
paint(bufferGraphics);
// « transfert » de l’image sur l’écran
g.drawImage(bufferImage,0,0,this);
}
© Rémy Courdier
03/27/99
1996-2007 - Java AWT SWING - Version du cours 2.10
14
7
Iremia, R.Courdier
AWT : Abstract Window Toolkit
Les Polices de caractères
Classe Font
représente une police de caractères indépendante de l’OS
Récupération de la liste des polices disponibles
String strFontTab [];
strFontTab = (Toolkit.getDefaultToolkit()).getFontList();
system.out.println(“nombre de polices : “ + strFontTab.length);
for (int i = 0; i< strFontTab.length; i++){
// affiche chaque nom de police Helvetica, Arial, ...
System.out.println(strFontTab[i]);
}
Sélection d’une Font :
Label unLabel; // une zone de texte
unLab.setFont(new Font(“Courier“, Font.Bold, 12);
© Rémy Courdier
1996-2007 - Java AWT SWING - Version du cours 2.10
15
AWT – SWING
Les évènements
Programmation événementielle
pilotage du code par des événements (si click de souris alors…)
Les environnements actuels multi-fenêtres X Windows, MS-Windows, Mac OS,...
utilisent ce principe
Principe
Tout component peut déclencher un événement
Chaque type d’événement est défini par une classe spécifique
Lorsqu’un événement est déclenché il peut être capté par des “listeners”
(écouteurs) qui réalisent alors des traitements appropriés
La source d’un événement et les traitements associés sont séparés
© Rémy Courdier
03/27/99
1996-2007 - Java AWT SWING - Version du cours 2.10
16
8
Iremia, R.Courdier
AWT – SWING
Les évènements
Quelques Listeners (écouteurs)
Clavier: KeyListener
Clicks de la souris: MouseListener
Déplacement de la souris: MouseMotionListener
Roulette de la souris: MouseWheelListener
Ouverture,Femeture….Fenêtre: WindowListener
Changement de valeur dans une zone de texte: TextListener
Action (p.ex appui sur un boutton) : ActionListener
HyperlinkListener, MenuListener…..
Voir java.awt.event et javax.swing.event
© Rémy Courdier
1996-2007 - Java AWT SWING - Version du cours 2.10
17
AWT – SWING
Les évènements
Soit XXXEvent un Type d’Event
peut être ActionEvent, KeyEvent, FocusEvent, MouseEvent,...
pour capter un événement XXXEvent
on s’enregistre auprès du Event Handler avec un XXXListener
unComponent.addXXXListener(new CListener());
// désactivation par : removeXXXListener();
on implémente notre Classe Listener
class CListener implements XXXListener {
...// définir ici toutes les méthodes de XXXListener
}
// OU lorsque XXXListener définit plusieurs méthodes
class CListener extends XXXAdapter {
...// définir ici certaines méthodes de XXXListener
}
On peut aussi utiliser une classe anonyme
monboutton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println(«boutton » +e.getSource()+« appuyé»);
}
});
© Rémy Courdier
03/27/99
1996-2007 - Java AWT SWING - Version du cours 2.10
18
9
Iremia, R.Courdier
AWT : Abstract Window Toolkit
La gestion des événements : exemple
/** Fichier AppEvent.java */
import java.awt.*
import java.awt.event.*
import java.applet.*
public class AppEvent extends Applet {
Button
b1 = new Button(“Bouton1”),
b2 = new Button(“Bouton2”);
TextField t1 = new TextField(30);
public init() {
b1.addActionListener(new LB1());
b2.addActionListener(new LB2());
t1.addTextListener(new LT1T());
t1.addActionListener(new TK1A());
t1.addKeyListener(new TK1K());
add(b1); add(b2); add(t1);
}
public class LB1
implements ActionListener {
public void actionPerformed
(ActionEvent e)
...}
© Rémy Courdier
public class TK1K extends KeyAdapter {
public void KeyTyped (KeyEvent e) {
if (e.getKeyChar() ==
KeyEvent.VK_BACK_SPACE) {...}
...}
public static void main (...) {
AppEvent myApplet = new AppEvent();
Frame aFrame =new Frame(“titre”);
WindowAdapter wa =
new WindowAdapter() {
public void windowClosing
(WindowEvent e)
{ system.exit(0); }
aFrame.addWindowListener (wa);
aFrame.add(“Center”, myApplet);
aFrame.setSize(250,250);
myApplet.init();
myApplet.start();
aFrame.setVisible(true);
}
} // programme Appli ou Applet
1996-2007 - Java AWT SWING - Version du cours 2.10
19
Java AWT
Couleurs du “desktop”
Les couleurs de l’environnement graphique (Bureau)
courant sont initialisés automatiquement dans des
variables static de la classe SystemColor
deskstop
activeCaption
activeCaptionText
activeCaptionBorder
inactiveCaption
inactiveCaptiveText
inactiveCaptionBorder
window
windowBorder
windowText
menu
© Rémy Courdier
03/27/99
menuText
text
textText
textHighlight
textHighlightText
textInactiveText
control
controlText
controlHighlight
controlLtHighlight
controlShadow
controlDkShadow
scrollbar
info
infoText
1996-2007 - Java AWT SWING - Version du cours 2.10
20
10
Iremia, R.Courdier
Java AWT
Impression
l’impression est possible
depuis les application Java
mais pas depuis une Applet
Java
/** objet PrintJob */
...
class PrintData {
public PrintJob pj;
public int pageWidth, pageHeight;
PrintData(String jobName) {
pj = getToolkit().getPrintJob(
PrintDemo.this, jobName,
null);
if (pj!= null) {
récupération d’un objet
PrintJob depuis un objet
Toolkit par la méthode
getPrintJob()
pW=pj.getPageDimension().width;
les mécanismes d’impression
Java ne sont pas
completement automatisés
pH=pj.getPageDimension().height;
g = pj.getGraphics;
}
}
}
© Rémy Courdier
1996-2007 - Java AWT SWING - Version du cours 2.10
21
AWT
Le presse-papier “clipboard”
Fonctionnalités offertes
Java supporte un certain nombre de fonctionnalités du clipboard
uniquement sur les String
possibilité de copier un objet String dans le clipboard au format text et
de lire un texte du clipboard dans un String
le modèle de gestion du clipboard est extensible avec la notion de
“Flavors”
Principe
import java.awt.datatransfer.*
...
Clipboard cl = getToolkit().getSystemClipboard();
...
cl.setcontents(aClipString, aClipString);
...
Transferable clipData=cl.getcontents(...);
try {
ClipString = (String)clipData.getTransferData(DataFlavor.stringFlavor);
catch { /* exception levé si pas de stringFlavor dans le clipboard ...*/ }
© Rémy Courdier
03/27/99
1996-2007 - Java AWT SWING - Version du cours 2.10
22
11
Iremia, R.Courdier
Sommaire
AWT : Abstract Window Toolkit
Applet et application
Frame, Panel et Layout
Composants GUI
Les menus
Les layouts
Les images
Animations
Les polices
Gestion des événements
© Rémy Courdier
SWING
Nouvelle hiérarchie
Quelques composants
Quelques Thèmes
Les applets
Les composants
1996-2007 - Java AWT SWING - Version du cours 2.10
23
SWING
Différences par rapport à l’AWT
Plus grande variété de composants
Arbres, Tables, ToolTips..
boutons avec images, bordures…
Gestion des thèmes «LookAndFeel »
Selon l’OS: Windows,MacOs…
Thémes personnalisés…
Gestion automatique du double buffering
S’appuie en partie sur l’AWT
Consommateur de ressources
© Rémy Courdier
03/27/99
1996-2007 - Java AWT SWING - Version du cours 2.10
24
12
Iremia, R.Courdier
Swing
Une nouvelle hiérarchie
© Rémy Courdier
1996-2007 - Java AWT SWING - Version du cours 2.10
25
SWING
Quelques composants
© Rémy Courdier
03/27/99
1996-2007 - Java AWT SWING - Version du cours 2.10
26
13
Iremia, R.Courdier
Swing
Quelques « Look & Feel »
© Rémy Courdier
1996-2007 - Java AWT SWING - Version du cours 2.10
27
Swing
Les applets
Comme un pluggin standard: Java Plug In
Utilisation d'une autre balise que APPLET
OBJECT dans le cas de Explorer.
EMBED dans le cas de Netscape.
<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH
= 400 HEIGHT = 50
codebase="http://java.sun.com/products/plugin/1.1.2/jinstall112-win32.cab#Version=1,1,2,0">
L’outil de SUN HTML Converter
Il permet de convertir les balises APPLET en OBJECT/EMBED avec
des scripts d’installation automatique du pluggin
© Rémy Courdier
03/27/99
1996-2007 - Java AWT SWING - Version du cours 2.10
28
14
Iremia, R.Courdier
Swing
Les composants
De haut niveau
JFrame, JDialog & JApplet
Pour leur ajouter des composants, il faut
passer par leur ContentPane
maFenetre.getContentPane().
add(new JButton(« test »));
Intermédiaires
Les JPanel, JScrollPane,JTabbedPane
monPanel.add(new JScrollPane(new
JLabel(«Test »)));
Atomiques
Les JButton, JLabel….
© Rémy Courdier
1996-2007 - Java AWT SWING - Version du cours 2.10
29
Références
Trail: Creating a GUI with JFC/Swing
http://java.sun.com/docs/books/tutorial/uiswing/
Le langage JAVA
http://cedric.cnam.fr/~farinone/Java/
© Rémy Courdier
03/27/99
1996-2007 - Java AWT SWING - Version du cours 2.10
30
15
Téléchargement