Le Langage Java Swing
Le Langage Java Swing
Le Langage Java Swing
le langage Java
Introduction
Java
Foundation
Class et
Swing
XV-1
JMF
Swing
le langage Java
Prsentation
JMF
Swing
le langage Java
Window
Dialog
Panel
...
TextComponent
TextField TextArea
List
...
CheckBox ScrollBar
Applet
Frame
JApplet
FileDialog
JFrame
JComponent
...
AbstractButton
JTextComponent
JLabel
JPanel
JToggleButton
JTextArea
JButton
JTextField
JRadioButton
Remarques gnrales
En Java 1.2, les classes Swing se trouve dans
le paquetage javax.swing ou ses sous
paquetages. Il est fortement dconseill de
mlanger des composants Swing et AWT dans
une interface graphique.
XV-3
JMF
Swing
le langage Java
Java Plug In
JMF
Swing
le langage Java
Java plug in : le
fonctionnement
Il faut utiliser une autre balise que la
balise APPLET pour utiliser la MV de SUN.
Ce sont les balises :
OBJECT dans le cas de Explorer.
EMBED dans le cas de Netscape.
Il faut donc changer les pages HTML. Un
outil est propos par SUN : HTML Converter
(pour 300 Ko environ en .zip pour Java 1.2)
voir documentation :
http://java.sun.com/products/plugin/1.1.1/docs/tags.h
tml
XV-5
JMF
Swing
le langage Java
De APPLET OBJECT
remarque
La balise OBJECT est une balise HTML
normalis.
classid est l'identificateur de classe du
Java plug-in. Sa valeur est celle ci dessus.
Les balises code (et codebase) ne sont pas
directement conserves du passage de
APPLET OBJECT : dans OBJECT on utilise la
sous-balise PARAM.
XV-6
JMF
Swing
le langage Java
De APPLET OBJECT
(fin)
L'attribut codebase de la balise OBJECT a
une autre signification : elle indique l'URL
de chargement du plug-in Java au cas o ce
plug-in ne se trouverait pas sur la machine
locale.
le champ type de PARAM indique au Java
plug-in le type de programme Java
excuter i.e. une applet ou un bean. C'est un
type MIME.
remarque
les 3 types de PARAM code, codebase et type
ne doivent pas apparatre dans les PARAM de
la balise APPLET.
XV-7
JMF
Swing
le langage Java
De APPLET EMBED
JMF
Swing
le langage Java
De APPLET EMBED
(suite)
XV-9
JMF
Swing
le langage Java
JMF
Swing
le langage Java
XV-11
JMF
Swing
le langage Java
XV-12
JMF
Swing
le langage Java
JLabel
On peut construire facilement un JLabel
comportant une image gif ou jpg
(accompagn dun texte ou non).
Icon image = new ImageIcon("tarde.jpg");
JLabel labelImage = new JLabel(image);
JTabbedPane
Les onglets nexistent pas en AWT. On cre
une bote onglets par le constructeur
public JTabbedPane(int tabPlacement)
qui indique o placer les titres des onglets,
ou bien par public JTabbedPane()
qui par dfaut les placent en haut.
On ajoute les composants (souvent des
JPanel) dans la bote par :
public void addTab(String title, Icon
icon, Component component, String tip)
ou des mthodes de mme nom avec moins
dargument.
XV-13
JMF
Swing
le langage Java
JLabel et JTabbedPane
import java.awt.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;
public class TabTest extends JPanel {
private JTabbedPane jtp;
private JLabel labelImage;
private JPanel panneau1 = new JPanel();
private JPanel panneau2 = new JPanel();
private JPanel panneau3 = new JPanel();
XV-14
JMF
Swing
le langage Java
public TabTest() {
setLayout(new BorderLayout());
jtp = new JTabbedPane();
Icon image = new ImageIcon("clouds.jpg");
labelImage = new JLabel("label avec texte et
image", image, SwingConstants.CENTER);
panneau1.add(labelImage);
Icon image2 = new ImageIcon("dog.gif");
panneau2.add(new JLabel(image2));
panneau3.add(new JLabel("JLabel avec du
texte seulement"));
jtp.addTab("Image & Texte", panneau1);
jtp.addTab("image seule", panneau2);
jtp.addTab("texte seul", panneau3);
add(jtp, BorderLayout.CENTER);
}
public static void main(String args[]) {
JFrame jf = new JFrame("Tabbed Pane Test");
TabTest tt = new TabTest();
jf.getContentPane().add(tt,
BorderLayout.CENTER);
jf.setSize(600,300);
jf.setVisible(true);
}
}
XV-15
JMF
Swing
le langage Java
XV-16
JMF
Swing
le langage Java
XV-17
JMF
Swing
le langage Java
de la classe UIManager.
Puis il faut indiquer la racine de
larborescence qui prend en compte ce L&F
par :
SwingUtilities.updateComponentTreeUI(racine);
XV-18
JMF
Swing
le langage Java
Divers L&F
JMF
Swing
le langage Java
public LnF() {
bg.add(jrbHost);
bg.add(jrbCross);
bg.add(jrbMotif);
add(jb);
add(jcb);
add(jtf);
add(jrbHost);
add(jrbCross);
add(jrbMotif);
jrbMotif.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent ev) {
// installe le L&F Motif
try {
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.motif.MotifLookAndFee
l");
SwingUtilities.updateComponentTreeUI(LnF.this
);
} catch (Exception e) {}
}
}
);
XV-20
JMF
Swing
le langage Java
jrbHost.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent ev) {
// installe le L&F de la plate-forme i.e. Windows
try {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName(
));
SwingUtilities.updateComponentTreeUI(LnF.this
);
} catch (Exception e) {}
}
}
);
jrbCross.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent ev) {
// installe le L&F Metal
UIManager.setLookAndFeel(
UIManager.getCrossPlatformLookAndFeelClass
Name());
SwingUtilities.updateComponentTreeUI(LnF.this
);
} catch (Exception e) {}
}
}
);
}
public static void main(String args[]) {
JFrame jf = new JFrame("LnF");
LnF lnf = new LnF();
jf.getContentPane().add(lnf);
jf.pack();
jf.setVisible(true);
}
}
XV-21
JMF
Swing
le langage Java
L&F complments
XV-22
JMF
Swing
le langage Java
Le modle MVC
Swing utilise fondamentalement une
architecture dinterface homme-machine
inspir de Smalltalk : larchitecture ModelView-Controller.
Cette architecture est compose de trois
parties :
-le modle qui est la partie dcrivant les
donnes afficher
-la vue qui est la reprsentation graphique
de ces donnes
-le contrleur qui est la partie qui traite
des interactions du composant avec
lutilisateur.
Vue
Modle
double valeur = 6.89
Augmenter
Diminuer
Contrleur
XV-23
JMF
Swing
le langage Java
Intrts de larchitecture
MVC
- meilleure modularit
-possibilit dassocier plusieurs vues
distinctes un mme modle
(histogramme, courbes, camembert, valeur
flottante, ...)
-possibilit de changer limplmentation
dun modle (optimisation,
rorganisation, ...) sans rien changer aux
vues et aux contrleurs.
XV-24
JMF
Swing
le langage Java
Implmenter le modle
MVC
On sappuie sur une technique quon
retrouve dans dautres parties du langage
Java (Java Beans, ...) et qui utilise le
mcanisme des vnements par dlgation
(Java 1.1 et suivant).
Le modle permet dinscrire des objets qui
seront couteurs de ce modle. Lorsque les
donnes changent le modle envoie des
renseignements sous forme dun objet
vnement ces (ses ! !) couteurs en leur
demandant dexcuter une mthode
convenue.
Dans le modle MVC, ce sont :
-les contrleurs qui demandent changer
une donne du modle
-les vues qui sont les couteurs du modle
et qui sont avertis du changement des
donnes.
Pour cela, les vues doivent senregistrer
auprs du modle. Celui-ci possde des
mthodes appropries (addXXXListener()).
XV-25
JMF
Swing
le langage Java
Implmenter le modle
MVC (suite)
Les tapes pour construire cet ensemble
sont :
1) Dfinir une classe vnement qui
contiendra les informations envoyer du
modle vers ses vues. Lvnement qui sera
gnr est parfois appel lvnement
source. Le gnrateur de cet vnement est
appel parfois l"objet source de
lvnement".
2) dfinir une mthode convenue que
devront lancer les vues lorsquelles seront
informes dun vnement. Mettre cette
mthode dans une interface que devront
implmenter les vues.
XV-26
JMF
Swing
le langage Java
Implmenter le modle
MVC (suite)
La classe vnement dfinir est souvent
une sous classe de java.util.EventObject
qui contient dj des mthodes appropries
pour cette architecture. Par exemple
retourner lobjet source de lvnement par
la mthode :
public Object getSource()
On a donc :
public class XXXEvent extends
java.util.EventObject { ... }
La mthode lancer peut tre de nom
quelconque mais les conventions proposent
quelle soit de la forme :
public void nomQuelconque(XXXEvent e)
{...}
De mme il est convenu que cette mthode
soit dans une interface de la forme :
public interface XXXListener {
public void nomQuelconque(XXXEvent e)
{...}
}
XV-27
JMF
Swing
le langage Java
Implmenter le modle
MVC (suite)
Le modle qui enregistre, retire, diffuse les
vnements aux diffrents listeners propose
par convention :
public MonModele {
Vector lesListener = new Vector() ;
public void addXXXListener(...){ ...}
public void removeXXXListener(...){ ...}
public void fireXXXEvent(...){ ...}
}
XV-28
JMF
Swing
le langage Java
JMF
Swing
le langage Java
XV-30
JMF
Swing
le langage Java
Cellules
Les lments dune JTable ainsi que les
nud dun JTree sont appels des cellules
(cell). Ces cellules sont similaires aux
lments dun JList ou dune JComboBox et
sont dessines par des renderer . Ce
renderer est une machine (factory)
pour fabriquer des Component (i.e. des
cellules).
En fait lobjet construit est un Component ou
plutt un objet dune sous classe, par dfaut
un JLabel construit partir de la valeur de
la cellule sur lequel est lanc toString(),
et les composants JXXX affichent des
Component.
XV-31
JMF
Swing
le langage Java
Le composant JList
Une JList modlise comme une
java.awt.List, une liste. Contrairement
une List, une JList na pas de barre de
dfilement par dfaut . Aussi on met
souvent une JList dans une JScrollPane :
JList maJList = ;
JScrollPane maJSP = new JScrollPane(maJlist) ;
Linterface ListModel
et
public void
removeListDataListener(ListDataListener
l) ;
XV-32
JMF
Swing
le langage Java
Le composant JList
(suite)
La classe AbstractListModel
La classe DefaultListModel
XV-33
JMF
Swing
le langage Java
JList (suite)
Le code habituel quon crit est :
- construire une classe concrte modle de
liste partir de la classe
DefaultListModel qui implante beaucoup
de fonctionnalits ncessaires pour les
listes.
- construite une JList laide de ce modle.
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class EssaiJList {
// declaration du tableau de donnees
private static String [] data = {
"Et un", "Et deux", "Et trois", "Zro" };
public static void main(String args[]) {
JFrame jf1 = new JFrame("Essai JList");
DefaultListModel dlm = new
DefaultListModel();
// remplir le modele de donnees
for (int i = 0; i < data.length; i++)
dlm.addElement(data[i]);
JList jl1 = new JList(dlm) ;
jf1.getContentPane().add(jl1,
BorderLayout.CENTER);
// Crer un controleur et le mettre dans l'IHM
jf1.getContentPane().add(new
ListController(dlm), BorderLayout.SOUTH);
jf1.pack();
jf1.setVisible(true); }
}
XV-34
JMF
Swing
le langage Java
Le Contrleur
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
* Cette classe est un JTextField qui est un
* controleur pour un modele de liste.
* Il ajoute des items a ce modele
* lorsque l'utilisateur appuie sur " Enter ".
*/
public class ListController extends JTextField {
private final DefaultListModel model;
public ListController(DefaultListModel lm) {
model = lm;
// Ce controleur est son propre ActionListener
// Lorsque l'utilisateur appuie sur Entrer,
// la chaine (String) est ajoutee au modele.
// Ceci est effectue par une classe anonyme
// qui implemente l'interface ActionListener.
addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent ev)
{
// On utilise la methode getActionCommand()
// de l'ActionEvent
// pour recuperer le texte du JTextField
// et l'ajoute au modele.
model.addElement(ev.getActionCommand()) ;
}
}
);
}
}
XV-35
JMF
Swing
le langage Java
Le composant JTable
JTable modlise un tableau cest dire une
structure prsentant des lignes et des
colonnes, bref un tableur. Les cellules de ce
tableur sont des Component.
Cest un composant complexe et beaucoup de
classes dont il dpend sont dans le
paquetage javax.swing.table.
En gnral on met une JTable dans une
JScrollPane. Si ce nest pas le cas les enttes des colonnes napparaissent pas.
Les donnes dun JTable sont dans le
modle javax.swing.table.TableModel.
Plus prcisment, on a larchitecture :
- public interface TableModel {}
- public abtract class
AbstractTableModel implements
TableModel, Serializable
- public class DefaultTableModel
extends AbstractTableModel { }
Voici un exemple crant une JTable de 10
lignes et 10 colonnes dInteger.
TableModel dataModel = new AbstractTableModel() {
public int getColumnCount() { return 10; }
public int getRowCount() { return 10;}
public Object getValueAt(int row, int col) { return new
Integer(row*col); }
};
JTable table = new JTable(dataModel);
JScrollPane scrollpane = new JScrollPane(table);
XV-36
JMF
Swing
le langage Java
XV-37
JMF
Swing
le langage Java
Linterface TableModel
JMF
Swing
le langage Java
La classe
DefaultTableModel
propose plusieurs constructeurs pour crer
un modle de table.
DefaultTableModel()
DefaultTableModel(int numRows, int
numColumns)
DefaultTableModel(Object[][] data,
Object[] columnNames)
DefaultTableModel(Vector columnNames,
int numRows)
DefaultTableModel(Vector data, Vector
columnNames)
...
puis
Object [][] donnees = {
{"Pierre", Boolean.FALSE},
{"Paul", Boolean.FALSE},
{"Jacques", Boolean.TRUE}
};
String [] enTete = {
"Nom", "Est Inscrit ?"
};
MonTableModel dtm = new MonTableModel(donnees,
enTete);
JTable jt = new JTable(dtm);
JScrollPane jsp = new JScrollPane(jt);
XV-39
JMF
Swing
le langage Java
XV-40
JMF
Swing
le langage Java
JMF
Swing
le langage Java
Exemple de renderer
XV-42
JMF
Swing
le langage Java
Le composant JTree
modlise une arborescence.
utilise linterface TreeModel et la classe
DefaultTreeModel (il ny a pas de
AbstractTreeModel).
Construire un arbre
XV-43
JMF
Swing
le langage Java
Exemple de JTree
Pour faire afficher :
il suffit d'crire :
import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
public class TreeTest {
private static Object [] nodeNames = { "one",
"two", "three", "four", "five", "six", "seven",
new Integer(8), new Integer(9), new Float(10) };
private static boolean [] leaf = { false, true, true,
false, true, true, false, true, true, true };
public static void main(String args[]) {
JFrame jf = new JFrame("Tree Test");
DefaultMutableTreeNode [] nodes = new
DefaultMutableTreeNode[10];
for (int i = 0; i < nodes.length; i++) {
nodes[i] = new
DefaultMutableTreeNode(nodeNames[i], !leaf[i]);
}
XV-44
JMF
Swing
le langage Java
nodes[0].add(nodes[1]);
nodes[0].add(nodes[2]);
nodes[0].add(nodes[3]);
nodes[0].add(nodes[6]);
nodes[0].add(nodes[9]);
nodes[3].add(nodes[4]);
nodes[3].add(nodes[5]);
nodes[6].add(nodes[7]);
nodes[6].add(nodes[8]);
JTree jt = new JTree(nodes[0]);
jf.getContentPane().add(jt,
BorderLayout.CENTER);
jf.pack();
jf.setVisible(true);
}
}
XV-45
JMF
Swing
le langage Java
Linterface TreeModel
Les principales manipulations pour arbre
sont dj dclares dans cette interface.
On trouve :
void
add/removeTreeModelListener(TreeModelL
istener l)
Object getChild(Object parent, int
index) retourne le indexime fils de
parent.
int getChildCount(Object parent)
int getIndexOfChild(Object parent,
Object child)
Object getRoot()
boolean isLeaf(Object node)
XV-46
JMF
Swing
le langage Java
XV-47
JMF
Swing
le langage Java
XV-48
JMF
Swing
le langage Java
Le composant JTextPane
XV-49
JMF
Swing
le langage Java
Les styles
XV-50
JMF
Swing
le langage Java
XV-51
JMF
Swing
le langage Java
Le Copier/Couper/Coller
XV-52
JMF
Swing
le langage Java
XV-53
JMF
Swing
le langage Java
Rcuprer du presse
papier
Il suffit :
- de rcuprer le presse papier par :
Clipboard c =
getToolkit().getSystemClipboard();
lancer sur un Component.
- de rcuprer la donne du presse papier
par:
Transferable t = c.getContents(this);
(le paramtre de cette mthode n'est pas
utilis pour l'instant).
- rcuprer les diffrents types possibles
(DataFlavor) pour la donne du presse
papier par t.getTransferDataFlavors().
On obtient un tableau et de ce tableau, on
peut avoir la donne pour chaque
DataFlavor par :
Object o =
t.getTransferData(flavors[i]).
XV-54
JMF
Swing
le langage Java
Programme
Copier/Couper/Coller
import java.awt.*;
import java.awt.event.*;
import java.awt.datatransfer.*;
import java.io.*;
import javax.swing.*;
public class Clip extends JPanel implements
ClipboardOwner {
JTextArea text = new JTextArea();
JButton cutButton = new JButton("Cut");
JButton copyButton = new JButton("Copy");
JButton pasteButton = new JButton("Paste");
public Clip() {
setLayout(new BorderLayout());
JScrollPane jsp = new JScrollPane(text);
add(jsp, BorderLayout.CENTER);
add(cutButton, BorderLayout.NORTH);
add(copyButton, BorderLayout.EAST);
add(pasteButton, BorderLayout.SOUTH);
XV-55
JMF
Swing
le langage Java
pasteButton.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Paste!");
Clipboard c =
getToolkit().getSystemClipboard();
Transferable t = c.getContents(this);
DataFlavor [] flavors =
t.getTransferDataFlavors();
for (int i = 0; i < flavors.length; i++) {
try {
Object o = t.getTransferData(flavors[i]);
System.out.println("Flavor " + i + " gives "
+ o.getClass().getName());
if (o instanceof String) {
text.insert((String)o,
text.getCaretPosition());
}
} catch (Exception ex) { ex.printStackTrace();
}
}
}
});
cutButton.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Cut!");
Clipboard c =
getToolkit().getSystemClipboard();
StringSelection ss = new
StringSelection(text.getSelectedText());
text.replaceRange("",
text.getSelectionStart(), text.getSelectionEnd());
c.setContents(ss, Clip.this);
}
});
XV-56
JMF
Swing
le langage Java
copyButton.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Copy!");
Clipboard c =
getToolkit().getSystemClipboard();
StringSelection ss = new
StringSelection(text.getSelectedText());
c.setContents(ss, Clip.this);
}
});
}
public void lostOwnership(Clipboard c,
Transferable t) {
System.out.println("Lost clipboard");
}
public static void main(String args[]) {
JFrame f = new JFrame("Clipboard Test");
Clip c = new Clip();
f.getContentPane().add(c,
BorderLayout.CENTER);
f.setSize(300, 200);
f.setVisible(true);
}
}
XV-57
JMF
Swing
le langage Java
Bibliographie
John Zukowskis Definition Guide to Swing
for Java 2 ; John Zukowski ed Apress ISBN
1-893115-02-X
Tutorial Swing en ligne :
http://java.sun.com/docs/books/tutorial/ui
swing/index.html
XV-58
JMF