Académique Documents
Professionnel Documents
Culture Documents
Java Avancé
3
Interface graphique
(Awt, Swing)
2014 - 2015 1
Java : Interface graphique
Java : un langage indépendant des plateformes (portable)
un même programme doit pouvoir être utilisé dans des
environnements (matériel et OS) différents sans
recompilation.
Nécessité d'offrir une API pour les interfaces graphiques indépendante elle
Java Avancé
MacOS X
MS Windows
...
2014 - 2015 3
1ére stratégie (1/2)
2014 - 2015 4
1er stratégie (2/2)
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
Java Avancé
2014 - 2015 5
2éme stratégie (1/2)
2014 - 2015 6
2éme stratégie (2/2)
Avantages / désavantages
(+) facilité d'éviter les différences entre plateformes
(+) n'importe quel nouveau composant d'interface est
immédiatement disponible sur toutes les plateformes
Java Avancé
2014 - 2015 7
Les objets graphiques
3 niveaux
Haut niveau
Définir une fenêtre
JApplet, JDialog, JFrame, JWindow
Java Avancé
Niveau intermédiaire
Pour composer la fenêtre
JPanel, JScrollPane, JSplitPane, …
Niveau inférieur
Les éléments de base
JButton, JCheckBox, JTextField, JTextArea, …
2014 - 2015 8
Exemple simple
import javax.swing.*; Importer le package
public class DisplayFrame {
public static void main (String[] args) {
Créer un objet
graphique
JFrame f = new JFrame("FrameDemo");
//… components are added to its content frame.
Java Avancé
2014 - 2015 9
Top-Level
Les composants top-level possèdent un content pane qui contient
tous les composants visibles d’un top-level
Un composant top-level peut contenir une barre de menu
Java Avancé
2014 - 2015 10
JFrame: Composer
Ajouter un composant dans Content Pane de JFrame
cp.add(b)
JPanel p = (JPanel)f.getContentPane();
p.add(label); Niveau
f.setSize(300,200); //alternative: f.pack(); intermédiaire
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
2014 - 2015 12
Composer une fenêtre
Créer une fenêtre (1)
Créer un ou des composants intermédiaires (2)
Pour JFrame, un JPanel est associé implicitement
(ContentPane)
Java Avancé
Afficher
2014 - 2015 13
Composant de base
JButton
JCheckBox
JRadioButton
JComboBox
Jlist
Java Avancé
Jmenu
Jslider
JTextField
Jlabel
JProgressBar
JToolTip
Jtree, Jtable.
JTextArea, JTextPane, JEditorPane
2014 - 2015 14
Java Avancé Swing components: Illustration
2014 - 2015 15
Composants intermédiaires
Utilisés pour organiser ou positionner d’autres composants (de base)
JPanel utilisé pour regrouper d’autres composants
JScrollPane fournir une vue avec scroll bars
JSplitPane divise en 2 composants
Java Avancé
2014 - 2015 16
JPanel
2014 - 2015 17
JScrollPane
Quelques méthodes:
public JScrollPane(Component comp);
public void setCorner(String key,Component comp);
2014 - 2015 18
JSplitPane
Quelques Méthodes :
public JSplitPane(int ori, Component comp, Component c);
public void setDividerLocation(double pourc);
2014 - 2015 19
JTabbedPane
Quelques méthodes :
public JTabbedPane();
public void addTab(String s, Icon i, Component c, String s);
public Component getSelectedComponent();
2014 - 2015 20
JToolBar
Quelques Méthodes :
public JToolBar();
public Component add(Component c);
public void addSeparator();
2014 - 2015 21
Conteneurs et composants
Les deux conteneurs les plus courants sont le JFrame et le JPanel.
Un JFrame représente une fenêtre de haut niveau avec un titre,
une bordure et des angles de redimensionnement.
La plupart des applications utilisent au moins un JFrame
comme point de départ de leur interface graphique.
Java Avancé
Un JPanel n'a pas une apparence propre et ne peut pas être utilisé
comme fenêtre autonome.
Les Panels sont créés et ajoutés aux autres conteneurs de la
même façon que les composants tels que les boutons
Les Panels peuvent ensuite redéfinir une présentation qui leur
soit propre pour contenir eux-mêmes d'autres composants.
2014 - 2015 22
Gestionnaire de présentation (1)
2014 - 2015 23
Gestionnaire de présentation (2)
2014 - 2015 24
FlowLayout (1)
2014 - 2015 25
FlowLayout (2)
La stratégie de disposition du FlowLayout est la suivante :
2014 - 2015 26
FlowLayout (3)
plus visible
OK Ouvrir Redimensionnement
OK Ouvrir Fermer
Fermer
2014 - 2015 27
FlowLayout (4)
Redimensionnement
Java Avancé
Redimensionnement
2014 - 2015 28
FlowLayout (5)
Redimensionnement
Java Avancé
Redimensionnement
2014 - 2015 29
BorderLayout (1)
BorderLayout divise son espace de travail en cinq zones
géographiques : North, South, East, West et Center.
Les composants sont ajoutés par nom à ces zones (un seul
composant par zone).
Exemple
Java Avancé
NORTH
SOUTH
2014 - 2015 30
BorderLayout (2)
public class EssaiBorderLayout extends JFrame
{
private JButton b1,b2,b3,b4, b5;
public EssaiBorderLayout() {
setLayout(new BorderLayout());
Java Avancé
2014 - 2015 31
BorderLayout (3)
N N
Java Avancé
Redimensionnement
O C E
O C E
S
2014 - 2015 32
BorderLayout (4)
Redimensionnement
Java Avancé
Redimensionnement
2014 - 2015 33
GridLayout (1)
Le GridLayout dispose les composants dans une grille.
Découpage de la zone d'affichage en lignes et en colonnes qui
définissent des cellules de dimensions égales.
Chaque composant à la même taille
Java Avancé
2014 - 2015 34
GridLayout (2)
import java.awt.*;
public class AppliGridLayout extends Frame
{
public AppliGridLayout()
{
Java Avancé
super("AppliGridLayout");
this.setLayout(new GridLayout(3,2));
for (int i = 1; i < 7; i++)
add(new Button(Integer.toString(i)));
this.pack();
this.show();
}
1 2 1 2
Java Avancé
Redimensionnement
3 4 4
3
5 6
5 6
Redimensionnement
2014 - 2015 36
CardLayout
Le CardLayout n'affiche qu'un composant à la fois :
2014 - 2015 37
GridBagLayout (1)
Le gestionnaire GridBagLayout fournit des fonctions de
présentation complexes
basées sur une grille dont les lignes et les colonnes sont de
tailles variables.
permet à des composants simples de prendre leur taille
Java Avancé
super("AppliComplexeLayout");
setLayout(new BorderLayout());
Panel pnorth = new Panel();
pnorth.add(b1); pnorth.add(b2);
pnorth.add(b3); pnorth.add(b4);
Java Avancé
this.add(pnorth,BorderLayout.NORTH);
2014 - 2015 39
D’autres gestionnaires?
On peut imposer à un objet « container » de n’avoir pas de
gestionnaire en fixant son LayoutManager à la valeur null
Frame f = new Frame(); f.setLayout(null);
A la charge alors du programmeur de positionner chacun des
composants « manuellement » en indiquant leur position
Java Avancé
2014 - 2015 40
Récapitulatif
FlowLayout
Flux : composants placés les uns derrière les autres
BorderLayout
Ecran découpé en 5 zones (« North », « West », « South »,
« East », « Center »)
Java Avancé
GridLayout
Grille : une case par composant, chaque case de la même
taille
CardLayout
« Onglets » : on affiche un élément à la fois
GridBagLayout
Grille complexe : plusieurs cases par composant
2014 - 2015 41
Les événements graphiques (1)
L'utilisateur effectue
une action au niveau de l'interface utilisateur (clic souris,
sélection d'un item, etc)
alors un événement graphique est émis.
Java Avancé
2014 - 2015 42
Les événements graphiques (2)
La gestion des événements passe par l'utilisation d'objets
"écouteurs d'événements" (les Listener) et d'objets sources
d'événements.
Un objet écouteur est l'instance d'une classe implémentant
l'interface EventListener (ou une interface “fille”).
Java Avancé
2014 - 2015 43
Les événements graphiques (3)
import java.awt.*;
import java.awt.event.*;
2014 - 2015 45
Les événements graphiques (5)
2014 - 2015 46
Java Avancé
Les événements graphiques (6)
2014 - 2015 47
Catégories d'événements graphiques (1)
catégorie d’événements.
2014 - 2015 48
Catégories d'événements graphiques (2)
2014 - 2015 49
Catégories d'événements graphiques (3)
(ComponentEvent)componentShown
(ComponentEvent)
Window WindowListener windowClosing (WindowEvent)
windowOpened (WindowEvent)
windowIconified (WindowEvent
windowDeiconified (WindowEvent)
windowClosed (WindowEvent)
windowActivated (WindowEvent)
windowDeactivated (WindowEvent)
Container ContainerListener componentAdded (ContainerEvent)
componentRemoved(ContainerEvent)
Text TextListener textValueChanged (TextEvent)
2014 - 2015 50
Catégories d'événements graphiques (4)
ActionListener
Action (clic) sur un bouton, retour chariot dans une zone de
texte, « tic d’horloge » (Objet Timer)
WindowListener
Java Avancé
TextListener
Changement de valeur dans une zone de texte
ItemListener
Sélection d’un item dans une liste
2014 - 2015 51
Catégories d'événements graphiques (5)
MouseListener
Clic, enfoncement/relâchement des boutons de la souris, etc.
MouseMotionListener
Java Avancé
AdjustmentListener
Déplacement d'une échelle
ComponentListener
Savoir si un composant a été caché, affiché …
2014 - 2015 52
Catégories d'événements graphiques (6)
ContainerListener
Ajout d'un composant dans un Container
Java Avancé
FocusListener
Pour savoir si un élément a le "focus«
KeyListener
Pour la gestion des événements clavier
2014 - 2015 53
Catégories d'événements graphiques (7)
import java.awt.*;
import java.awt.event.*;
public class EssaiActionEvent1 extends JFrame
implements ActionListener Implémentation de
{ l'interface ActionListener
public static void main(String args[])
Java Avancé
2014 - 2015 54
Catégories d'événements graphiques (8)
fenêtre)
super("Utilisation d’un ActionEvent");
b1 = new JButton("action1"); e.getSource()"
b2 = new JButton("action2"); renvoie l'objet source
b1.addActionListener(this); de l’événement. On
b2.addActionListener(this); effectue un test sur
add(BorderLayout.CENTER,b1); les boutons (on
add(BorderLayout.SOUTH,b2); compare les
pack();show(); } références)
public void actionPerformed( ActionEvent e ) {
if (e.getSource() == b1) setTitle("action1 cliqué");
if (e.getSource() == b2) setTitle("action2 cliqué");
}}
2014 - 2015 55
Catégories d'événements graphiques (9)
2014 - 2015 56
Un autre exemple
public PlayBalloon() {
setTitle("Balloon");
setLayout(new FlowLayout());
public static void main(String[] args) { myBalloon = new Balloon(20, 50, 50);
PlayBalloon f = new PlayBalloon();
f.setSize(300, 300); this.addWindowListener(this);
f.setVisible(true);
} } // fin constructeur PlayBalloon
Réactions Ballon
public void actionPerformed(ActionEvent event) { class Balloon {
if (event.getSource() == grow) private int diameter;
myBalloon.changeSize(10); private int xCoord, yCoord;
if (event.getSource() == shrink)
myBalloon.changeSize(-10); Balloon (int initialDiameter, int
repaint(); initialX, int initialY) {
if (event.getSource() == exit) diameter = initialDiameter;
System.exit(0); xCoord = initialX;
} yCoord = initialY;
public void windowClosing(WindowEvent event) { }
System.exit(0);
} public void changeSize (int
public void windowIconified(WindowEvent event) {} change) {
public void windowOpened(WindowEvent event) {} diameter = diameter+change;
public void windowClosed(WindowEvent event) {} }
public void windowDeiconified(WindowEvent event) {}
public void windowActivated(WindowEvent event) {} public void display (Graphics g) {
public void windowDeactivated(WindowEvent event) {} g.drawOval (xCoord, yCoord,
diameter, diameter);
}
public void paint (Graphics g) { }
myBalloon.display(g);
}
}
Les adapteurs (1)
Les classes « adapteur » permettent une mise en œuvre simple
de l'écoute d'événements graphiques.
2014 - 2015 59
Les adapteurs (2)
Solution en implémentant l’interface
class Terminator implements WindowListener
{
public void windowClosing (WindowEvent e) {System.exit(0);}
public void windowClosed (WindowEvent e) {}
Java Avancé
2014 - 2015 60
Les adapteurs (3)
Il existe 7 classes d'adapteurs (autant que d'interfaces
d'écouteurs possédant plus d'une méthode) :
ComponentAdapter
ContainerAdapter
Java Avancé
FocusAdapter
KeyAdapter
MouseAdapter
MouseMotionAdapter
WindowAdapter
2014 - 2015 61
Les adapteurs (4)
En pratique, et notamment avec la classe WindowAdapter, on
utilise très souvent une classe anonyme
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e)
{
System.exit(0);
} });
2014 - 2015 62
Les composants atomiques
Un composant atomique est considéré comme étant une entité
unique.
Java propose beaucoup de composants atomiques:
boutons, CheckBox, Radio
Combo box
Java Avancé
List, menu
TextField, TextArea, Label
FileChooser, ColorChooser,
...
2014 - 2015 63
Les boutons
2014 - 2015 65
JComboBox
Quelques méthodes:
public JComboBox(Vector v);
public JComboBox(ComboBoxModel c);
Object getSelectedItem();
void addItem(Object o);
2014 - 2015 66
JList
Quelques méthodes:
public JList(Vector v);
public JList( ListModel l);
Object[] getSelectedValues();
2014 - 2015 67
JSlider
Quelques méthodes:
public JSlider(int min ,int max, int value);
public void setLabelTable(Dictionary d);
2014 - 2015 68
JTextField
Quelques méthodes:
public JTextField(String s);
public String getText();
2014 - 2015 69
JLabel
tag HTML.
Quelques méthodes:
public JLabel(String s);
public JLabel(Icon i);
2014 - 2015 70
Les menus
Ex:
menuBar = new JMenuBar();
setJMenuBar(menuBar);
menu = new JMenu("A Menu");
menuBar.add(menu);
menuItem = new JMenuItem("menu item");
menu.add(menuItem);
2014 - 2015 71
JTree
Un JTree permet d’afficher des informations sous forme d’arbre. Les nœuds
de l’arbre sont des objets qui doivent implanter l’interface MutableTreeNode.
Une classe de base est proposée pour les nœuds : DefaultMutableTreeNode.
Pour construire un arbre il est conseillé de passer par la classe TreeModel qui
Java Avancé
2014 - 2015 72
JFileChooser
Ex :
JFileChooser fc = new JFileChooser();
int returnVal = fc.showOpenDialog(aFrame);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
}
2014 - 2015 73
JColorChooser
Une méthode :
public static Color showDialog(Component c , String title , Color initialColor);
2014 - 2015 74
JProgressBar
Quelques méthodes :
public JProgressBar();
public JProgressBar(int min, int max);
public void setValue(int i);
2014 - 2015 75
JTextArea
La zone de texte est un dispositif d'entrée de texte multi-
lignes, multi-colonnes avec éventuellement la présence ou
non de « scrollbars » (barres de défilement) horizontal et/ou
vertical.
Il peut être ou non éditable.
Java Avancé
Valeur constante
Texte par défaut mis précisant la
dans le TextArea présence ou
Nombre de colonnes l’absence de
Nombre de lignes (en nbre de caractères)
2014 - 2015 « scrollbar » 76
ImageIcon
La classe ImageIcon et l’interface Icon
Les objets de cette classe permettent de définir des icônes à
partir d’images (gif, jpg, etc.) qui peuvent être ajoutés au
classique texte d'un JLabel, d'un JButton, etc.
Java Avancé
// Un JLabel
JLabel monLabel = new JLabel("Mon Label");
monLabel.setIcon(monIcone);
monLabel.setHorizontalAlignment(JLabel.RIGHT);
// Un JButton
JButton monBouton = new JButton("Mon bouton", monIcone);
2014 - 2015 77
Quelques composants
JTextPane
un éditeur de texte qui permet la gestion de texte formaté, le
retour à la ligne automatique (word wrap), l'affichage
d'images.
JPasswordField
Java Avancé
2014 - 2015 78
Exemple de JEditorPane
import javax.swing.*;
import java.awt.*;
public class EditeurWEB {
public static void main(String[] args)
{
JFrame monFrame = new JFrame ("Mon Frame");
Java Avancé
monFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
JEditorPane monEditeur = new
JEditorPane("http://www.google.fr");
Container panneauContenu = monFrame.getContentPane();
panneauContenu.setLayout(new FlowLayout());
panneauContenu.add(monEditeur);
monFrame.pack();
monFrame.show();
}
catch (Exception e) {System.out.println(e.getMessage());};
} }
2014 - 2015 79
Bordures
Des bordures peuvent être dessinées autour de tous
composants graphiques. Swing en définit 9 types :
AbstractBorder : ne fait rien
BevelBorder : une bordure 3D en surépaisseur ou en creux
CompoundBorder : permet de composer des plusieurs
Java Avancé
bordures
EmptyBorder
EtchedBorder
LineBorder : bordures d'une seule couleur)
MatteBorder
SoftBevelBorder : une bordure 3D aux coins arrondis
TitledBorder : une bordure permettant l'inclusion d’une
chaîne de caractères
2014 - 2015 80
Java Avancé
Bordures
2014 - 2015 81
Java Avancé JOptionPane
String response =
JOptionPane.showInputDialog(frame, “Message Type”);
int value = convertToInt(response);
2014 - 2015 82
Java Avancé JOptionPane
int response =
JOptionPane.showConfirmDialog(frame, “Take over the world?”,
“The Brain”, JOptionPane.YES_NO_OPTION);
if (response == YES_OPTION) …
2014 - 2015 83