Applets Et Swing
Applets Et Swing
Applets Et Swing
Les applets
et Swing
VI-1 JMF
les applets et bibliothèque Swing le langage Java
La balise APPLET
les applets sont chargées à partir d'une page HTML
contenant la balise :
<APPLET ...>
...
</APPLET>
Syntaxe générale
'<' 'APPLET'
['CODEBASE' '=' repURL]
'CODE' '=' fichier_applet.class
['ARCHIVE' '=' liste_de_fichiers_archive]
['ALT' '=' texte_de_remplacement]
['NAME' '=' nom_de_l_applet]
'WIDTH' '=' pixels 'HEIGHT' '=' pixels
['ALIGN' '=' alignement]
['VSPACE' '=' pixels] ['HSPACE' '=' pixels]
'>'
VI-2 JMF
les applets et bibliothèque Swing le langage Java
VI-3 JMF
les applets et bibliothèque Swing le langage Java
HTML_de_remplacement
est affiché par les browsers ne comprenant pas la balise
<APPLET>.
VI-4 JMF
les applets et bibliothèque Swing le langage Java
Exemples
<applet code="MyApplet.class"
width=100 height=140>
</applet>
indique au browser d'afficher l'applet dans une zone de
100 par 140 pixels. Le byte code se trouve dans le même
répertoire que la page HTML dans le fichier
MyApplet.class.
exemple 2:
<applet
codebase="http://www.javasoft.com/applets/applets/NervousT
ext"
code="NervousText.class" width=400 height=75
align=center >
<param name="text" value="This is the Applet Viewer.">
<blockquote>
<hr>If you were using a Java-enabled browser, you would see
dancing text instead of this paragraph.<hr>
</blockquote>
</applet>
indique au browser de charger le byte code
http://www.javasoft.com/applets/applets/NervousTex
t/NervousText.class
La taille initiale de la zone d'affichage est 400 par 75
pixels. Cette zone est alignée au centre de la fenêtre du
browser.
Le code de l'applet s'attend à recevoir un argument de nom
text. La valeur passée à cet argument est : This is
the Applet Viewer.
Un browser ne pouvant pas exécuter Java mais
comprenant la balise APPLET affichera le texte HTML
entre <blockquote> et </blockquote>
VI-5 JMF
les applets et bibliothèque Swing le langage Java
La balise ARCHIVE
L'obtention des ressources d'une applet (une nouvelle
classe à charger, une image, un fichier son, ...) est faite à
l'exécution, au moment où l'applet en a besoin (évaluation
paresseuse). Pour chaque ressource de l'applet, une
connexion HTTP est nécessaire et ceci est préjudiciable.
VI-6 JMF
les applets et bibliothèque Swing le langage Java
Sécurité et applets
Charger du code "inconnu" est un risque d'insécurité. De
ce fait, les browsers lisant Java ou les applet viewers ont
implantés une sous classe de la classe
java.lang.SecurityManager de sorte à interdire à
une applet :
- de lire ou d'écrire dans des fichiers locaux
- de détruire des fichiers locaux (soit en se servant de
File.delete() soit en lançant une commande
système rm ou del)
- de renommer des fichiers locaux (soit en se servant de
File.renameTo() soit en lançant une commande
système mv ou rename)
- de créer un répertoire sur le système local (soit en se
servant de File.mkdir() soit ou File.mkdirs()
en lançant une commande système mkdir)
- lister le contenu d'un répertoire local.
- vérifier l'existence, la taille, le type, la date de dernière
modification d'un fichier local
- créer une connexion vers un ordinateur autre que celui
d'où vient l'applet
- écouter, accepter des connexions d'un port du système
local.
- créer une fenêtre "toplevel" sans indiquer qu'elle
provient d'une applet.
- obtenir le nom, le répertoire de connexion de l'utilisateur
VI-7 JMF
les applets et bibliothèque Swing le langage Java
VI-8 JMF
les applets et bibliothèque Swing le langage Java
applet = ?
Une applet est une classe chargée par le browser Web. En
local l'interpréteur Java instancie un objet de cette classe
et lance la méthode init() sur cet objet. Parfois c'est cet
objet qui est appelé une applet.
Cette classe est obligatoirement une classe dérivée
public de la classe Applet. On doit donc écrire :
public class MonApplet extends java.applet.Applet {
...
}
VI-9 JMF
les applets et bibliothèque Swing le langage Java
VI-10 JMF
les applets et bibliothèque Swing le langage Java
VI-11 JMF
les applets et bibliothèque Swing le langage Java
VI-12 JMF
les applets et bibliothèque Swing le langage Java
Exemple
import java.applet.*;
import java.awt.*;
VI-13 JMF
les applets et bibliothèque Swing le langage Java
Exemple (suite)
avec le fichier HTML :
fichier second.html
<html>
<head><title>Seconde applet</title></head>
<body>
<h1>Bienvenue sur cette nouvelle page</h1>
Exécution de cette seconde applet :<P>
VI-14 JMF
les applets et bibliothèque Swing le langage Java
VI-15 JMF
les applets et bibliothèque Swing le langage Java
Exemple (fin)
Un outil de développement permet de ne visionner que la
partie
<APPLET ...> </APPLET> d'un fichier html. Ce
mini-browser plus rapide que netscape est toujours livré
avec les versions du JDK correspondantes (c'est d'ailleurs
une application indépendante) et est compatible avec ces
versions. Cet outil est appletviewer et il est
encouragé de l'utiliser.
% appletviewer second.html
VI-16 JMF
les applets et bibliothèque Swing le langage Java
<html>
<head><title>Hello World Parametre
</title></head>
<body>
VI-17 JMF
les applets et bibliothèque Swing le langage Java
VI-18 JMF
les applets et bibliothèque Swing le langage Java
Exemples (suite)
les images
Java lit les formats .gif et les affichent sans problème.
Si le fichier ladybug.gif se trouve dans le répertoire
images, sous-répertoire du répertoire du fichier de
l'applet, le code :
import java.awt.Graphics;
import java.awt.Image;
VI-19 JMF
les applets et bibliothèque Swing le langage Java
VI-20 JMF
les applets et bibliothèque Swing le langage Java
VI-21 JMF
les applets et bibliothèque Swing le langage Java
VI-22 JMF
les applets et bibliothèque Swing le langage Java
VI-24 JMF
les applets et bibliothèque Swing le langage Java
VI-25 JMF
les applets et bibliothèque Swing le langage Java
Java Plug In
Pendant de nombreuses années (1996 à 2000 environ), un
problème récurant survenait pour les applets : la JVM
intégrée dans les navigateurs n’était pas à jour par rapport
au version des applets chargées. Ca a été particulièrement
préjudiciable lors des évolutions des versions d’interface
graphique (gestions des événements de 1.0 à 1.1 en 1996)
et de versions de bibliothèques graphiques (de AWT à
Swing en 1998).
Il fallait ajouter un plug-in aux navigateurs de votre
machine pour prendre en charge les mises à jour d’une
nouvelle JVM. Ce plug-in et le Java plug-in.
Désormais (depuis Java 1.2 vers 1998), lorsqu’on installe
un JRE ou SDK sur une machine, l’installation repère les
navigateurs et installe la JVM courante comme Java plug-
in de ces navigateurs.
Il n’y a donc plus vraiment de problème aujourd’hui (en
janvier 2006) si vous installer le SDK APRES vos
navigateurs. Entre autre les applets chargées par la balise
applet fonctionnent.
VI-26 JMF
les applets et bibliothèque Swing le langage Java
Introduction à
Java Foundation
Class et Swing
VI-27 JMF
les applets et bibliothèque Swing le langage Java
Présentation
Java Foundation Class (JFC) est un ensemble regroupant
des ajouts à Java 1.1 qui sont désormais intégrés au SDK
1.2 et suivants (Java 2 Platform).
JFC comprend :
-les composants Swing. C’est l’objet de ce cours. Ce sont
des composants avancés complètement écrits en
langage Java. Très souvent le code ne fait pas appel aux
composants de la plate-forme.
-Java 2D. Utilisation de classes Graphics 2D amenant des
manipulations complexes de la couleur, la manipulation
simple des transformation affines (rotation, homothétie,
…), traitement des textures, …
-L’accessibilité : la manipulation simple des ordinateurs
pour les personnes handicapés moteurs
-Le « drag and drop » : glisser-déposer entre application
quelconque (pas forcément Java) sur une plate-forme.
VI-28 JMF
les applets et bibliothèque Swing le langage Java
Applet
Dialog Frame
JApplet
FileDialog
JFrame JComponent
...
AbstractButton
JTextComponent JLabel JPanel
JToggleButton JButton
JTextArea JTextField
JRadioButton
Remarques générales
VI-29 JMF
les applets et bibliothèque Swing le langage Java
maFrame.getContentPane().add(monJButton,
BorderLayout.NORTH) ;
maFrame.getContentPane().setLayout(new BorderLayout());
VI-30 JMF
les applets et bibliothèque Swing le langage Java
VI-31 JMF
les applets et bibliothèque Swing le langage Java
JLabel et JTabbedPane
Voici un programme qui utilise ces composants :
import java.awt.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;
VI-32 JMF
les applets et bibliothèque Swing le langage Java
public TabTest() {
setLayout(new BorderLayout());
jtp = new JTabbedPane();
add(jtp, BorderLayout.CENTER);
}
VI-33 JMF
les applets et bibliothèque Swing le langage Java
VI-34 JMF
les applets et bibliothèque Swing le langage Java
VI-35 JMF
les applets et bibliothèque Swing le langage Java
VI-36 JMF
les applets et bibliothèque Swing le langage Java
Divers L&F
Les différents L&F de la plate-forme Windows
VI-37 JMF
les applets et bibliothèque Swing le langage Java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
* Cette classe illustre le changement
dynamique de L&F
*/
public class LnF extends JPanel {
private JButton jb = new JButton("A Button");
private String [] cbitems = {"One", "Two",
"Three"};
private JComboBox jcb = new
JComboBox(cbitems);
private JTextField jtf = new JTextField("Hello",
14);
private JRadioButton jrbHost = new
JRadioButton("Windows", false);
private JRadioButton jrbCross = new
JRadioButton("CrossPlatform", true);
private JRadioButton jrbMotif = new
JRadioButton("Motif", true);
private ButtonGroup bg = new ButtonGroup();
VI-38 JMF
les applets et bibliothèque 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.MotifLookAndFe
el");
SwingUtilities.updateComponentTreeUI(LnF.this
);
} catch (Exception e) {}
}
}
);
VI-39 JMF
les applets et bibliothèque 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");
VI-40 JMF
les applets et bibliothèque Swing le langage Java
LnF lnf = new LnF();
jf.getContentPane().add(lnf);
jf.pack();
jf.setVisible(true);
}
}
VI-41 JMF
les applets et bibliothèque Swing le langage Java
L&F compléments
On peut aussi récupérer le L&F Metal par la méthode de
statique de la classe UIManager.
public static String
getCrossPlatformLookAndFeelClassName()
et le L&F de la plate-forme par la méthode statique de la
classe UIManager :
public static String
getSystemLookAndFeelClassName()
VI-42 JMF
les applets et bibliothèque Swing le langage Java
L'architecture MVC
Swing utilise fondamentalement une architecture
d’interface homme-machine inspiré de Smalltalk :
l’architecture Model-View-Controller.
Cette architecture est composée de trois parties :
-le modèle qui est la partie décrivant les données à afficher
-la vue qui est la représentation graphique de ces données
-le contrôleur qui est la partie qui traite des interactions du
composant avec l’utilisateur.
Modèle Vue
double valeur = 6.89
Augmenter Diminuer
Contrôleur
VI-43 JMF
les applets et bibliothèque Swing le langage Java
VI-44 JMF
les applets et bibliothèque Swing le langage Java
VI-45 JMF
les applets et bibliothèque Swing le langage Java
VI-46 JMF
les applets et bibliothèque Swing le langage Java
Cellules
Les éléments d’une JTable ainsi que les nœuds d’un
JTree sont appelés des cellules (cell). Ces cellules sont
similaires aux éléments d’un JList ou d’une
JComboBox et sont dessinées par des « renderer ». Ce
renderer est une « machine » (factory) pour fabriquer des
Component (i.e. des cellules).
En fait l’objet construit est un Component ou plutôt un
objet d’une sous classe, par défaut un JLabel construit à
partir de la chaîne String obtenue en ayant lancé la
méthode toString() sur la cellule.
Ainsi les composants JXXX affichent des Component.
VI-47 JMF
les applets et bibliothèque Swing le langage Java
Le composant JList
Une JList modélise, comme une java.awt.List,
une liste. Contrairement à une List, une JList n’a pas
de barre de défilement par défaut . Aussi on met souvent
une JList dans une JScrollPane :
JList maJList = … ;
JScrollPane maJSP = new JScrollPane(maJlist) ;
JList utilise l’arborescence : interface ListModel
implémentée par la classe abstraite
AbstractListModel dont dérive la classe concrète
DefaultListModel.
VI-49 JMF
les applets et bibliothèque Swing le langage Java
Le Contrôleur
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
* Cette classe est un JTextField qui est un
* contrôleur pour un modèle de liste.
* Il ajoute des items à ce modèle
* 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()) ;
}
}
);
}
}
VI-50 JMF
les applets et bibliothèque Swing le langage Java
Le composant JTree
modélise une arborescence.
utilise l’interface TreeModel et la classe
DefaultTreeModel (il n’y a pas de
AbstractTreeModel).
Construire un arbre
On définit tout d’abord les nœuds comme instance de la
classe DefaultMutableTreeNode. En général on
utilise le constructeur :
public DefaultMutableTreeNode(Object
userObject, boolean allowsChildren) qui
crée un nœud sans parent et sans enfant, initialisé avec
l’objet indiqué. Si allowsChildren vaut false ce
nœud restera une feuille.
Par la suite, lorsque tous les nœuds ont été créés comme
objet DefaultMutableTreeNode, ils sont assemblés
pour construire un arbre à l’aide de la méthode add() de
DefaultMutableTreeNode et l’arbre final est
construit à l’aide de JTree(TreeNode root).
VI-51 JMF
les applets et bibliothèque Swing le langage Java
Exemple de JTree
Pour faire afficher :
il suffit d'écrire :
import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
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);
}
}
VI-53 JMF
les applets et bibliothèque Swing le langage Java
VI-54 JMF
les applets et bibliothèque Swing le langage Java
VI-55 JMF
les applets et bibliothèque Swing le langage Java
Le composant JTextPane
Ce composant permet d’éditer du texte formaté :
différentes polices, styles, couleurs, .... Un tel texte est
appelé un document.
Plus précisément un JTextPane peut contenir des
images (Icon) ou des Component Swing.
La plupart des classes et interfaces utilisées se trouve dans
le paquetage javax.swing.text.
VI-56 JMF
les applets et bibliothèque Swing le langage Java
frame.setSize(640, 480);
frame.setVisible(true);
}
}
VI-57 JMF
les applets et bibliothèque Swing le langage Java
Le Copier/Couper/Coller
En fait cela ne fait pas parti de Swing mais des JFC.
VI-58 JMF
les applets et bibliothèque Swing le langage Java
VI-59 JMF
les applets et bibliothèque Swing le langage Java
VI-60 JMF
les applets et bibliothèque 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 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);
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();
VI-61 JMF
les applets et bibliothèque Swing le langage Java
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);
}
});
VI-62 JMF
les applets et bibliothèque 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);
}
});
}
VI-63 JMF
les applets et bibliothèque Swing le langage Java
Bibliographie
John Zukowski’s Definition Guide to Swing for Java 2 ;
John Zukowski ed Apress ISBN 1-893115-02-X
VI-64 JMF