Академический Документы
Профессиональный Документы
Культура Документы
Eric Lecolinet
Tlcom Paristech Dept. INFRES
www.telecom-paristech.fr/~elc
Il y en a trois !
AWT Components, obsolte Swing repose sur AWT
Swing support par Oracle (autrefois Sun) mais Swing != AWT !
SWT libre, initi par IBM / Eclipse JButton != Button !
tous (+ ou -) multi-plateformes
Interacteurs
Texte
JTextField
JPasswordField
JTextArea :
texte simple multilignes
Ascenseur :
cf. JScrollPane JEditorPane : texte avec styles
compatible HTML et RTF
JScrollPane:
... avec ascenseurs intgrs
JSplitPane:
avec diviseur intgr
Conteneurs
JTabbedPane:
onglets
JTree
JTable
Fentres
JRootPane implicitement cr
par JApplet, JDialog, JFrame
et JInternalFrame
JFileChooser JColorChooser
Particularit
peuvent tre crs :
comme composants internes
ou comme botes de dialogue
Attention
restrictions diverses (accs aux fichiers,
sockets...) pour des raisons de scurit
Menus
raccourci
clavier
(accelerator)
mnmonique
Arbre dinstanciation
arbre de filiation des instances de composants graphiques
Arbre dinstanciation
Arbre dinstanciation
public BipBip() {
button = new JButton ("Please Click Me !");
getContentPane().add(button); // en gris : ncessaire avant version 5
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Bib Bip");
pack(); // calcule la disposition spatiale
setVisible(true); // fait apparatre linterface
}
}
Exemple : version 0
Notes et rappels
package javax.swing
une seule classe public par fichier, le fichier doit avoir le mme nom
button est une variable dinstance (on peut linitialiser contrairement C++)
toplevel est une variable locale
Evnements
envoys lapplication cible
chaque action lmentaire de lutilisateur
Lance automatiquement
la fin de la fonction main() dans le cas de Java
Evnements Java
Event Listeners
chaque classe dvnement correspond une classe dEventListener
(en gnral)
Exemple : ActionEvent
Evnement : ActionEvent
Listener : ActionListener
Mthode : actionPerformed(ActionEvent)
Observateurs dvnements
Exemple : MouseEvent
Evnement : MouseEvent
Listener : MouseListener
Mthodes :
Listener : MouseMotionListener
mouseClicked(MouseEvent)
Mthodes :
mouseEntered(MouseEvent)
mouseDragged(MouseEvent)
mouseExited(MouseEvent)
mousePressed(MouseEvent) mouseMoved(MouseEvent)
mouseReleased(MouseEvent)
Remarque
toutes les mthodes doivent tre implmentes
car les Listeners sont des interfaces (au sens du langage Java)
Exemple : version 1
import javax.swing.*;
import java.awt.event.*;
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
}
}
Exemple : version 1
import javax.swing.*;
class Ecoute implements ActionListener {
import java.awt.event.*;
BipBip mainWin;
public class BipBip extends JFrame {
JButton button; public Ecoute (BipBip mainWin) {
JLabel label = new JLabel(); this.mainWin = mainWin;
}
public static void main(String argv[ ]) {
new BipBip(); public void actionPerformed(ActionEvent e) {
} System.out.println("Done!");
mainWin.label.setText("Done!");
public BipBip() {
}
button = new JButton ("Do It!");
add(button); }
Exemple : version 2
import javax.swing.*;
import java.awt.event.*;
Exemple : version 2
import javax.swing.*;
import java.awt.event.*; public void actionPerformed(ActionEvent e) {
if (e.getSource() == doIt)
public class BipBip extends JFrame
implements ActionListener { label.setText("Done!");
JButton doIt, close; else if (e.getSource() == close)
JLabel label = new JLabel();
System.exit(0);
public static void main(String argv[ ]) { }
}
new BipBip();
}
Solution
public BipBip() {
distinguer les boutons grce
add(doIt = new JButton ("Do It"));
add(close = new JButton ("Close")); getSource() ou
getActionCommand()
doIt.addActionListener(this);
close.addActionListener(this); la 1ere solution est plus sre
setDefaultCloseOperation(EXIT_ON_CLOSE); peu adapt si beaucoup de
pack(); commandes
setVisible(true);
}
Version 1 Version 2
plus souple : plus simple mais limit :
autant de listeners que l'on veut on ne peut avoir qu'une seule
mais lourd et peu concis : mthode actionPerformed()
on multiplie les objets et les lignes
peu adapt si beaucoup de
de code
commandes
Synthse
Remarques
les classes imbriques peuvent galement servir encapsuler limplmentation
public BipBip() {
JButton doIt = new JButton ("Do It");
add(doIt);
......
public BipBip() {
add(new MyButton("Do It")) {
public void actionPerformed(ActionEvent e) {
label.setText("Done!");
}
});
......
Conflits
Constructeur de classe
sert effectuer des oprations sur les variables de classe (initialisations)
nexiste pas en C++
Applet (appliquette)
Programme pour navigateur Web
interprt par navigateur Web ou commande appletviewer
attention: restrictions daccs (fichiers, sockets ...)
Structure
hrite de JApplet
mthode init() (pas de new !)
<html>
<body>
<applet code=Scribble.class width=300 height=300> </applet>
</body>
</html>
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
addMouseMotionListener(
new MouseMotionAdapter ( ) {
public void mouseDragged(MouseEvent e) {
// mme code que dans la prcdente version
....
}
} );
Persistance de laffichage
Solution
mmoriser la liste des oprations graphiques dans une display list
rafficher le dessin quand le composant qui le contient est rafrachi
Divers
Appeler revalidate() dans certains cas de changements de taille
JFileChooser
if (returnVal == JFileChooser.APPROVE_OPTION) {
System.out.println("You chose to open this file: "
+ chooser.getSelectedFile().getName());
}
Les LayoutManagers
calculent automatiquement la disposition spatiale
des enfants des Containers
Configurabilit
accessibilit : indpendance par rapport aux tailles des polices
internationalisation : indpendance par rapport la longueur du texte
langues orientales : texte ~1/3 plus petit que l'anglais
franais, allemand : texte ~1/3 plus grand que l'anglais
Configurabilit
accessibilit : indpendance par rapport aux tailles des polices
internationalisation : indpendance par rapport la longueur du texte
langues orientales : texte ~1/3 plus petit que l'anglais
franais, allemand : texte ~1/3 plus grand que l'anglais
FlowLayout
dfaut des JPanel
met les objets la suite comme un "flux textuel" dans une page
de gauche droite puis la ligne
Principaux LayoutManagers
BorderLayout
dfaut des JFrame et JDialog
retaille automatiquement les enfants du conteneur
disposition de type points cardinaux
via constantes: BorderLayout.CENTER, EAST, NORTH, SOUTH, WEST
GridLayout
divise le conteneur en cellules de mme taille (grille virtuelle)
de gauche droite et de haut en bas
retaille automatiquement les enfants
GridBagLayout
grille + contraintes spatiales
les enfants n'ont pas tous la mme taille
spcification par des
GridBagConstraints
CardLayout
empile les enfants (et les met la mme taille)
usage typique: pour les onglets
BoxLayout
disposition verticale ou horizontale
exemple vu prcdemment :
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
SpringLayout
contraintes entre les bords des enfants
AWT Components
"Abstract Widget Toolkit"
plus ancien et moins puissant que Swing
attention: mme noms que Swing mais ... sans le J !
exemple: JButton (Swing) et Button (AWT)
SWT
"Standard Widget Toolkit"
dvelopp pour Eclipse
open source
mme type d'architecture que AWT
AWT
couche "abstraite" qui encapsule les widgets natifs de la plateforme
look & feel diffrent suivant l'OS
Swing
rimplmente tous les widgets en simulant les look & feel natifs
=> look & feel indpendant de l'OS
=> comportement ( peu prs) homogne qq soit l'OS
architecture logicielle plus sophistique
bien plus puissant !
Architecture Swing
source: enode.com
But de MVC
mieux structurer les applications
reprsentations multi-vues
un modle peut tre associ plusieurs vues source: enode.com
Remarques
en pratique V est fortement li C
plusieurs variantes de MVC !
Modles et multi-vues
(la plupart des) JComponent Swing crent implicitement un Modle
qui peut tre "export" et partag avec un autre JComponent
Exemple
JSlider et JScrollbar : mme modle BoundedRangeModel
mise commun du modle => synchronisation automatique
Exemple
Dans lAPI de JSlider et JScrollBar :
public BoundedRangeModel getModel();
public void setModel(BoundedRangeModel);
Java Metal
Windows
UIManager.setLookAndFeel(
com.sun.java.swing.plaf.windows.WindowsLookAndFeel
);
source: Sun
Quelques caractristiques
systme de coordonnes indpendant du type de sortie (cran, imprimante)
et transformations affines : translations, rotations, homothties
package java.awt.geom
transparence
AlphaComposite, BITMASK , OPAQUE, TRANSLUCENT ...
Composition
Paths et Shapes
Fonts et Glyphs
etc... (voir dmo Java2D de Sun)