64
les applets et bibliothèque Swing le langage Java VI-1 JMF L L e e s s a a p p p p l l e e t t s s e e t t S S w w i i n n g g

Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-1 JMF

LLeess aapppplleettss

eett SSwwiinngg

Page 2: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-2 JMF

La balise APPLET

les applets sont chargées à partir d'une page HTMLcontenant 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]

'>'

['<' 'PARAM' 'NAME' '=' param1 'VALUE' '=' value '> ']['<' 'PARAM' 'NAME' '=' param2 'VALUE' '=' value '> ']...[HTML_de_remplacement]'</APPLET>'

Page 3: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-3 JMF

Signification des champs'CODEBASE' '=' repURL (optionnel).Cet attribut optionnel indique l'URL du répertoire où setrouve le byte code. Lorsque que cet attribut n'est pasmentionné, c'est l'URL du répertoire de la page HTMLcourante.

'CODE' '=' fichier_applet.classindique le nom du fichier où se trouve le byte code. Sonnom est relatif à CODEBASE.

'ALT' '=' texte_de_remplacement(optionnel).indique un texte de remplacement à afficher pour lesbrowsers comprenant la balise applet mais ne pouvantexécuter Java.

'NAME' '=' nom_de_l_applet (optionnel).indique le nom de l'applet. Utilisé pour faire communiquer2 applets d'une même page HTML.

'WIDTH' '=' pixels 'HEIGHT' '=' pixelsindique la taille de la zone de dessin initiale dans laquellesera exécutée l'applet dans la page HTML.

Page 4: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-4 JMF

Signification des champs (suite)'ALIGN' '=' alignment (optionnel).indique l'alignement de la zone de dessin de l'applet dansla page HTML. Les valeurs possibles sont celles del'option ALIGN de la balise IMG (left , right , top ,texttop , middle , absmiddle , baseline ,bottom , absbottom ).

'VSPACE' '=' pixels 'HSPACE' '=' pixels (optionnel).indique le nombre de pixels à laisser dessus et dessous(VSPACE), à gauche et à droite (HSPACE) pour la zonedessin de l'applet dans la page HTML.

'<' 'PARAM' 'NAME' '=' param_i 'VALUE' '=' value'>' . . .

(optionnels). Ce sont les paramètres que passent la pageHTML à l'applet. Celle ci les récupère grâce à la méthodegetParameter() .

HTML_de_remplacementest affiché par les browsers ne comprenant pas la balise<APPLET>.

Page 5: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-5 JMF

Exemples<applet code="MyApplet.class"width=100 height=140></applet>

indique au browser d'afficher l'applet dans une zone de100 par 140 pixels. Le byte code se trouve dans le mêmerépertoire que la page HTML dans le fichierMyApplet.class .

exemple 2:

<applet codebase="http://www.javasoft.com/applets/applets/NervousText"code="NervousText.class" width=400 height=75align=center ><param name="text" value="This is the Applet Viewer."><blockquote><hr>If you were using a Java-enabled browser, you would seedancing text instead of this paragraph.<hr></blockquote></applet>

indique au browser de charger le byte codehttp://www.javasoft.com/applets/applets/NervousText/NervousText.class

La taille initiale de la zone d'affichage est 400 par 75pixels. Cette zone est alignée au centre de la fenêtre dubrowser.Le code de l'applet s'attend à recevoir un argument de nomtext . La valeur passée à cet argument est : This isthe Applet Viewer.Un browser ne pouvant pas exécuter Java maiscomprenant la balise APPLET affichera le texte HTMLentre <blockquote> et </blockquote>

Page 6: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-6 JMF

La balise ARCHIVEL'obtention des ressources d'une applet (une nouvelleclasse à charger, une image, un fichier son, ...) est faite àl'exécution, au moment où l'applet en a besoin (évaluationparesseuse). Pour chaque ressource de l'applet, uneconnexion HTTP est nécessaire et ceci est préjudiciable.

À partir de la version 1.1, on peut regrouper plusieursressources dans un fichier compressé qui est chargé parune seule connexion HTTP. Un tel fichier est un archivecompressée (par le même algorithme que les fichiers.zip ) : un .jar .

L'outil jar de construction d'archive compressée estdonné avec le jdk :% jar cf Neko.jar Neko.class images/*.gif

Le fichier HTML indique ce fichier archive ainsi que laclasse de l'applet (attribut CODE).

<APPLET ARCHIVE="Neko.jar" CODE="Neko.class"WIDTH=400 HEIGHT=150></APPLET>

Plusieurs fichiers archive peuvent être référencés parl'attribut ARCHIVE. Ils sont alors séparés par des virgules.Si un fichier recherché n'est pas dans ces archives, cefichier est recherché comme habituellement (compatibilitéascendante) par une nouvelle connexion HTTP.

Page 7: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-7 JMF

Sécurité et appletsCharger du code "inconnu" est un risque d'insécurité. Dece fait, les browsers lisant Java ou les applet viewers ontimplantés une sous classe de la classejava.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 deFile.delete() soit en lançant une commandesystème rm ou del )- de renommer des fichiers locaux (soit en se servant deFile.renameTo() soit en lançant une commandesystème mv ou rename )- de créer un répertoire sur le système local (soit en seservant 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èremodification d'un fichier local- créer une connexion vers un ordinateur autre que celuid'où vient l'applet- écouter, accepter des connexions d'un port du systèmelocal.- créer une fenêtre "toplevel" sans indiquer qu'elleprovient d'une applet.- obtenir le nom, le répertoire de connexion de l'utilisateur

Page 8: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-8 JMF

Sécurité et applets (suite)- lancer un programme local (par Runtime.exec() ,Runtime.exit(), System.exit()- charger des librairies locales

Certaines de ces "interdictions" peuvent être levées parcertains browsers.

De même si ces applets proviennent de certaines partiesdu réseau (Intranet, firewall, ...) : cf. hotjava .

Plus précisément, toute application Java implante sapropre sécurité à l'aide d'un objet chargé une et une seulefois au début du lancement de l'application : un objet d'unesous classe de la classe SecurityManager . C'est le casdes browsers.Cet objet est unique à l'intérieur d'une application Java, nepeut pas être remplacé et pour les browsers, les applets nepeuvent pas le référencer.

Page 9: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-9 JMF

applet = ?Une applet est une classe chargée par le browser Web. Enlocal l'interpréteur Java instancie un objet de cette classeet lance la méthode init() sur cet objet. Parfois c'est cetobjet qui est appelé une applet.Cette classe est obligatoirement une classe dérivéepublic de la classe Applet . On doit donc écrire :

public class MonApplet extends java.applet.Applet {...}

Une applet est aussi un conteneur d'objets graphiques àl'intérieur du browser. On obtient cela grâce à l'héritage :Object -> Component -> Container -> Panel ->Applet .

Page 10: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-10 JMF

Méthodes fondamentales d'uneapplet

Ce sont :

public void init() { ... }

lancée au moment où l'applet est chargée par le browser

public void start() { ... }

lancée après init() et aussi lorsque l'applet est "visitée"i.e. lorsque le browser revient sur la page HTMLcontenant l'applet (par appui sur le bouton "back" dunavigateur ou bien après désiconification du navigateur)

public void stop() { ... }

lancée lorsque l'applet n'est plus à l'écran : par exemplequand le browser quitte la page HTML contenant l'applet(ou lorsque le browser est iconifié).

public void destroy() { ... }

lancée lorsque le browser "décharge" l'applet (ou quel'exécution du browser se termine).

Page 11: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-11 JMF

Automate des états d'une applet

Page 12: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-12 JMF

Méthodes fondamentales d'uneapplet (suite)

En général on met :dans init() :

création d'objets, chargement d'images, de polices,initialisation de champ globaux à la classedans start() :

lancement de tache (thread)dans stop() :

l'arrêt de thread.dans destroy() :

libération de ressources de l'applet (images, polices,...)en résumé :init()

start()stop()

destroy()

Page 13: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-13 JMF

Exempleimport java.applet.*;import java.awt.*;

public class MonApplet extends Applet { static final String message = "Hello World"; private Font font;

public void init() { font = new Font("Helvetica", Font.BOLD,48); }

public void paint(Graphics g) { // Un ovale plein rose g.setColor(Color.pink); g.fillOval(10, 10, 330, 100);

// Un contour ovale rouge épais. Le contour// java sont seulement d'épaisseur un pixel. Il // faut donc en dessiner plusieurs. g.setColor(Color.red); g.drawOval(10,10, 330, 100); g.drawOval(9, 9, 332, 102); g.drawOval(8, 8, 334, 104); g.drawOval(7, 7, 336, 106); // le texte g.setColor(Color.black); g.setFont(font); g.drawString(message, 40, 75); }}

Page 14: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-14 JMF

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&eacute;cution de cette seconde applet :<P>

<applet code="MonApplet.class" WIDTH=400HEIGHT=200>Si vous voyez ce texte c'est que votre browserne supporte pas la balise applet</applet></body></html>

donne l'affichage dans netscape :

Page 15: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-15 JMF

Page 16: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-16 JMF

Exemple (fin)Un outil de développement permet de ne visionner que lapartie<APPLET ...> </APPLET> d'un fichier html. Cemini-browser plus rapide que netscape est toujours livréavec les versions du JDK correspondantes (c'est d'ailleursune application indépendante) et est compatible avec cesversions. Cet outil est appletviewer et il estencouragé de l'utiliser.

Le fichier html ci dessus exécuté par appletviewerdonne :

% appletviewer second.html

Page 17: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-17 JMF

Récupérer les paramêtres du.html dans l'applet

On utilise la méthode getParameter() de la classeApplet . Par exemple soit le fichier html :

<html><head><title>Hello World Parametre</title></head>

<body>

<applet code="HwParam.class" width=400height=200><param name="msg" value="Bonjour a tous"></applet></body></html>

On veut, dans l'applet, récupérer la valeur du message àafficher.

Page 18: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-18 JMF

Récupérer les paramêtres du.html dans l'applet (suite)

Voici l'applet :

import java.applet.*;import java.awt.*;

public class HwParam extends Applet { private String message; private Font font;

public void init() { font = new Font("Helvetica", Font.BOLD, 48); message= getParameter("msg"); }

public void paint(Graphics g) { // Un ovale plein rose g.setColor(Color.pink); g.fillOval(10, 10, 330, 100); // Un contour ovale rouge épais. g.setColor(Color.red); g.drawOval(10,10, 330, 100); g.drawOval(9, 9, 332, 102); g.drawOval(8, 8, 334, 104); g.drawOval(7, 7, 336, 106); // le texte g.setColor(Color.black); g.setFont(font); g.drawString(message, 40, 75); }}

Page 19: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-19 JMF

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épertoireimages , sous-répertoire du répertoire du fichier del'applet, le code :

import java.awt.Graphics;import java.awt.Image;

public class LadyBug extends java.applet.Applet{Image bugimg; public void init() { bugimg = getImage(getCodeBase(), "images/ladybug.gif");}public void paint(Graphics g) { g.drawImage(bugimg,10,10,this);}}

donne :

getCodeBase() retourne l'URL durépertoire de l'applet. getImage() fait la concaténationavec son second argument.

Page 20: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-20 JMF

Les images dans lesapplications Java

Il y a 2 méthodes getImage() en Java. L'une appartientà la classe Applet et on l'a utilisé ci dessus. L'autre estde la classe Toolkit et c'est la seule utilisable dans uneapplication Java autonome. Une application Java similableà l'applet ci dessus est :

import java.awt.*;

public class LadyBug extends Frame {Image bugimg;

public static void main(String args[ ]) { Toolkit tk = Toolkit.getDefaultToolkit(); Frame fr = new LadyBug(tk, "Coccinelle"); fr.setSize(200, 200); fr.show(); }

public LadyBug (Toolkit tk, String st) {super(st);bugimg = tk.getImage("ladybug.gif");

}

public void paint(Graphics g) { g.drawImage(bugimg,10,10,this); }}

Page 21: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-21 JMF

Passer d'une application à uneapplet

en général c'est un code "simplifié". En effet, dans uneapplet :- la taille de l'applet a été fixée par le fichier HTML (doncplus besoin de setSize() )- l'affichage est fait par le browser (donc plus besoin desetVisible(true) )- la création du premier objet (l'applet) est faite par lebrowser (donc plus besoin deFrame fr = new MonAppli(); )

Page 22: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-22 JMF

Passer d'une applet à uneapplication

La technique est de construire un objet de la classe applet,puis de mettre dans la Frame de l'application cette appletet de lancer ensuite init() et start() . On a donc

class MaClasseApplet extends Applet { • • • }

et on veut à partir de cela construire une applicationindépendante. On écrit alors un code comme :

class MonAppli extends Frame {• • • public MonAppli() {Applet monApplet = new MaClasseApplet();monApplet.init();monApplet.start();add("Center", monApplet);pack();setVisible(true); }

public static void main(String args[ ]) {new MonAppli(); }• • •}

Beaucoup de fonctionnalités des applets ne sont pasimplantées dans les applications indépendantes : exécutionde sons, récupération de paramêtres du fichier HTML (iln'y a plus de fichier HTML!!), méthodes trop spécifiquesaux applets et qui nécessitent le browser(getParameter() , showStatus() , getImage() ,...).

Page 23: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-23 JMF

L'applet "élastique" Javaimport java.awt.Graphics;import java.awt.Color;import java.awt.Event;import java.awt.Point;import java.awt.event.*;

public class Lines extends java.applet.Appletimplements MouseListener,MouseMotionListener {

Point starts[] = new Point[10]; // les points de // départPoint ends[] = new Point[10]; // les points// d'arrivéePoint anchor; // le début de la ligne couranteint currline = 0; // le nombre de lignesPoint currentpoint; // la fin de ligne

public void init() {setBackground(Color.white);addMouseListener(this);addMouseMotionListener(this);}

public void mouseClicked(MouseEvent e){}public void mouseEntered(MouseEvent e){}public void mouseExited(MouseEvent e){}public void mousePressed(MouseEvent e){int x = e.getX();int y = e.getY();anchor = new Point(x,y);}

Page 24: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-24 JMF

public void mouseReleased(MouseEvent e){int x = e.getX();int y = e.getY(); addline(x,y);}public void mouseDragged(MouseEvent e){

int x = e.getX();int y = e.getY();

currentpoint = new Point(x,y); repaint();}public void mouseMoved(MouseEvent e) { }void addline(int x,int y){ Point stmp[]; Point etmp[]; // toutes les 10 lignes, accroître les tableaux if (currline % 10 == 0) { stmp = new Point[currline + 10]; etmp = new Point[currline + 10]; System.arraycopy(starts, 0, stmp, 0,starts.length); System.arraycopy(ends, 0, etmp, 0,ends.length); starts = stmp; ends = etmp;} starts[currline] = anchor; ends[currline] = new Point(x,y); currline++; currentpoint = null; repaint();}

Page 25: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-25 JMF

public void paint(Graphics g){ // dessine toutes les lignes for (int i = 0; i < currline; i++) { g.drawLine(starts[i].x, starts[i].y,

ends[i].x, ends[i].y); }

// dessine la ligne courante en bleu g.setColor(Color.blue); if (currentpoint != null)g.drawLine(anchor.x,anchor.y,currentpoint.x,currentpoint.y); }}

Page 26: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-26 JMF

Java Plug InPendant de nombreuses années (1996 à 2000 environ), unproblème récurant survenait pour les applets : la JVMintégrée dans les navigateurs n’était pas à jour par rapportau version des applets chargées. Ca a été particulièrementpréjudiciable lors des évolutions des versions d’interfacegraphique (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 votremachine pour prendre en charge les mises à jour d’unenouvelle JVM. Ce plug-in et le Java plug-in.Désormais (depuis Java 1.2 vers 1998), lorsqu’on installeun JRE ou SDK sur une machine, l’installation repère lesnavigateurs et installe la JVM courante comme Java plug-in de ces navigateurs.Il n’y a donc plus vraiment de problème aujourd’hui (enjanvier 2006) si vous installer le SDK APRES vosnavigateurs. Entre autre les applets chargées par la baliseapplet fonctionnent.

Page 27: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-27 JMF

IInnttrroodduuccttiioonn ààJJaavvaa FFoouunnddaattiioonnCCllaassss eett SSwwiinngg

Page 28: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-28 JMF

PrésentationJava Foundation Class (JFC) est un ensemble regroupantdes ajouts à Java 1.1 qui sont désormais intégrés au SDK1.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 enlangage Java. Très souvent le code ne fait pas appel auxcomposants de la plate-forme.

-Java 2D. Utilisation de classes Graphics 2D amenant desmanipulations complexes de la couleur, la manipulationsimple des transformation affines (rotation, homothétie,…), traitement des textures, …

-L’accessibilité : la manipulation simple des ordinateurspour les personnes handicapés moteurs

-Le « drag and drop » : glisser-déposer entre applicationquelconque (pas forcément Java) sur une plate-forme.

Lorsque le SDK 1.5 est installé, on trouve unedémonstration de l’ensemble des composants Swing dansle répertoire INSTAL_SDK\demo\jfc\SwingSet2 eton lance :java –jar SwingSet2.jarouappletviewer SwingSet2.html

Page 29: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-29 JMF

Les classes SwingLes classes Swing s'appuient sur l'arborescence AWT. Lesprincipales classes Swing sont :

Component

TextComponent Button

TextField

LabelContainer

PanelWindow

AppletFrame

TextArea

Canvas

List CheckBox ScrollBar

Dialog

FileDialog

...

...

JComponent

AbstractButton

JButtonJToggleButton

JRadioButton

JLabel JPanelJTextComponent

JFrame

JApplet

JTextArea JTextField

...

Remarques générales

En Java 1.2 et suivant, les classes Swing se trouve dans lepaquetage javax.swing et ses sous paquetages. Il estfortement déconseillé de mélanger des composants Swinget AWT dans une interface graphique.

Page 30: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-30 JMF

Les composants "haut niveau"

Les composants dit de haut niveau sont :-les fenêtres fille de la fenêtre fond d’écran, objets des

classes JFrame , JWindow , JDialog-ainsi que les objets de la classe JApplet

Pour ces objets conteneurs, on n’ajoute pas leurs contenusdirectement dans ces objets (contrairement à AWT). Onpasse par l’intermédiaire de leur « ContentPane » quiest récupéré par la méthode getContentPane() . Parexemple :

JFrame maFrame = … ;JButton monJButton= … ;

maFrame.getContentPane().add(monJButton,BorderLayout.NORTH) ;

On se sert aussi du ContentPane pour positionner leLayout des composants haut niveau de Swing. Parexemple :

JFrame maFrame = … ;

maFrame.getContentPane().setLayout(new BorderLayout());

Page 31: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-31 JMF

Les ajouts SwingPar rapport à AWT, Swing propose des améliorationsnotoires sur certains composants (JLabel , JButton , ...,par rapport à Label , Button , ...) et de nouveauxcomposants (bulle d’aide, onglet, ...)

JLabelOn peut construire facilement un JLabel comportantune image gif ou jpg (accompagné d’un texte ou non).

Icon image = new ImageIcon("tarde.jpg");JLabel labelImage = new JLabel(image);

Le constructeur le plus complet de JLabel est :public JLabel(String text, Icon icon,horizontalAlignment)et il existe d'autres constructeurs avec des arguments enmoins.

JTabbedPaneLes onglets n’existent pas en AWT. On crée une boîte àonglets par le constructeurpublic JTabbedPane(int tabPlacement)qui indique où placer les titres des onglets, ou bien parpublic JTabbedPane()qui par défaut les placent en haut.On ajoute les composants (souvent des JPanel ) dans laboîte par :public void addTab(String title, Iconicon, Component component, String tip)ou des méthodes de même nom avec moins d’argument.

Page 32: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-32 JMF

JLabel et JTabbedPaneVoici un programme qui utilise ces composants :

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();

Page 33: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-33 JMF

public TabTest() { setLayout(new BorderLayout()); jtp = new JTabbedPane();

Icon image = new ImageIcon("clouds.jpg"); labelImage = new JLabel("label avec texteet image", image, SwingConstants.CENTER); panneau1.add(labelImage);

Icon image2 = new ImageIcon("dog.gif"); panneau2.add(new JLabel(image2));

panneau3.add(new JLabel("JLabel avec dutexte 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 PaneTest"); TabTest tt = new TabTest(); jf.getContentPane().add(tt,BorderLayout.CENTER); jf.setSize(600,300); jf.setVisible(true); }}

Page 34: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-34 JMF

Look and FeelSwing propose plusieurs aspects et utilisation del’interface graphique : Look and Feel (L&F).Le Look and Feel de Java est appelé Metal ou Java L&F :c’est le L&F par défaut. On peut aussi avoir les L&FMotif, Windows et Macintosh (contrôlé par des droits) etmême se créer son propre L&F.

On peut connaître les divers L&F utilisables sur unemachine à l’aide de la méthode statiqueUIManager.getInstalledLookAndFeels();qui retourne un tableau deUIManager.LookAndFeelInfo

Page 35: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-35 JMF

Look and Feel (suite)Par exemple le programme :

import javax.swing.*;

public class ListPlafs {public static void main (String args[]) {

UIManager.LookAndFeelInfo plaf[] =UIManager.getInstalledLookAndFeels();

for (int i=0, n=plaf.length; i<n; i++) {System.out.println("Nom : " +

plaf[i].getName());System.out.println("Nom de la classe : "

+ plaf[i].getClassName());}System.exit(0);

}}

retourne :Nom : MetalNom de la classe :javax.swing.plaf.metal.MetalLookAndFeelNom : CDE/MotifNom de la classe :com.sun.java.swing.plaf.motif.MotifLookAndFeelNom : WindowsNom de la classe :com.sun.java.swing.plaf.windows.WindowsLookAndFeel

Page 36: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-36 JMF

Look and Feel (suite)On positionne le L&F par la méthode statiquepublic static void setLookAndFeel(StringclassName)throws ClassNotFoundException,InstantiationException,IllegalAccessException,UnsupportedLookAndFeelExceptionde la classe UIManager .Puis il faut indiquer la racine de l’arborescence descomposants graphiques de l'interface qui prend en comptece L&F par :SwingUtilities.updateComponentTreeUI(racine);

en général cette racine est la fenêtre principale.

Page 37: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-37 JMF

Divers L&FLes différents L&F de la plate-forme Windows

sont obtenus par le programme :

Page 38: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-38 JMF

import java.awt.*;import java.awt.event.*;import javax.swing.*;/** * Cette classe illustre le changementdynamique de L&F */public class LnF extends JPanel { private JButton jb = new JButton("A Button"); private String [] cbitems = {"One", "Two","Three"}; private JComboBox jcb = newJComboBox(cbitems); private JTextField jtf = new JTextField("Hello",14); private JRadioButton jrbHost = newJRadioButton("Windows", false); private JRadioButton jrbCross = newJRadioButton("CrossPlatform", true); private JRadioButton jrbMotif = newJRadioButton("Motif", true); private ButtonGroup bg = new ButtonGroup();

Page 39: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-39 JMF

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(ActionEventev) { // installe le L&F Motif

try {UIManager.setLookAndFeel(

"com.sun.java.swing.plaf.motif.MotifLookAndFeel");SwingUtilities.updateComponentTreeUI(LnF.this);} catch (Exception e) {} } } );

Page 40: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-40 JMF

jrbHost.addActionListener( new ActionListener() { public void actionPerformed(ActionEventev) { // 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(ActionEventev) { // installe le L&F Metal

UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());SwingUtilities.updateComponentTreeUI(LnF.this);

} catch (Exception e) {} } } ); } public static void main(String args[]) { JFrame jf = new JFrame("LnF");

Page 41: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-41 JMF

LnF lnf = new LnF(); jf.getContentPane().add(lnf); jf.pack(); jf.setVisible(true); }}

Page 42: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-42 JMF

L&F complémentsOn peut aussi récupérer le L&F Metal par la méthode destatique de la classe UIManager .public static StringgetCrossPlatformLookAndFeelClassName()et le L&F de la plate-forme par la méthode statique de laclasse UIManager :public static StringgetSystemLookAndFeelClassName()

Page 43: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-43 JMF

L'architecture MVCSwing utilise fondamentalement une architectured’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.

double valeur = 6.89

Modèle Vue

Contrôleur

Augmenter Diminuer

Page 44: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-44 JMF

Intérêts de l’architecture MVC- meilleure modularité- possibilité d’associer plusieurs vues distinctes à un

même modèle (histogramme, courbes, camembert,valeur flottante, ...)

- possibilité de changer l’implémentation d’un modèle(optimisation, réorganisation, ...) sans rien changer auxvues et aux contrôleurs.

Page 45: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-45 JMF

Remarques sur MVCEn pratique, ce ne sont pas les vues qui sont des listenersmais des classes internes aux vues (des classesXXXDataListener ) ou parfois des classes anonymes.

Les modèles sont souvent définis à partir d’une interfaceJava puis sont implémentés à partir de cette interface. Lesvues et les contrôleurs manipulent les interfaces de cesmodèles. Ainsi les vues et les contrôleurs ne sont pas liés àun modèle particulier mais à un ensemble de modèles quiimplémentent le même interface.

Ces mécanismes étant classiques en Java (cf. JavaBeans),il existe des classes et interfaces toutes dans le paquetagejava.beans qui donnent ce genre de code :-PropertyChangeEvent (classe qui hérite de

java.util.EventObject ),-PropertyChangeListener (interface qui définit

une méthode à lancer par les listeners lors d’unchangement de « propriété »)

-PropertyChangeSupport (classe dont il faut hériterproposant les enregistrements, les retraits des listenerset le lancement de la méthode définie dansPropertyChangeListener ).

Page 46: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-46 JMF

Les composants Swing et MVCOn va étudier les composants « complexes » de Swing :JList , JTable , JTree .

Les composants List et Table utilisent unearborescence de classes et d’interfaces de la forme :-public interface XXXModel {…}-public abtract class AbstractXXXModel

implements XXXModel, Serializable-public class DefaultXXXModel extends

AbstractXXXModel { … } où XXX vaut List ou Table .

Certains de ces composants sont assez riches pour occuperà eux seuls un ou plusieurs paquetages !! C’est le cas avecles paquetages javax.swing.table etjavax.swing.tree .

Les JXXX sont des vues. Pour les construire on utilisesouvent les constructeurs JXXX(leModele) .

Page 47: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-47 JMF

CellulesLes éléments d’une JTable ainsi que les nœuds d’unJTree sont appelés des cellules (cell). Ces cellules sontsimilaires aux éléments d’un JList ou d’uneJComboBox et sont dessinées par des « renderer ». Cerenderer est une « machine » (factory) pour fabriquer desComponent (i.e. des cellules).En fait l’objet construit est un Component ou plutôt unobjet d’une sous classe, par défaut un JLabel construit àpartir de la chaîne String obtenue en ayant lancé laméthode toString() sur la cellule.Ainsi les composants JXXX affichent des Component .

Page 48: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-48 JMF

Le composant JList

Une JList modélise, comme une java.awt.List ,une liste. Contrairement à une List , une JList n’a pasde barre de défilement par défaut . Aussi on met souventune JList dans une JScrollPane :

JList maJList = … ;JScrollPane maJSP = new JScrollPane(maJlist) ;

JList utilise l’arborescence : interface ListModelimplémentée par la classe abstraiteAbstractListModel dont dérive la classe concrèteDefaultListModel .

Le code habituel qu’on écrit est :- construire une classe concrète modèle de liste à partir de

la classe DefaultListModel qui implantebeaucoup de fonctionnalités nécessaires pour les listes.

- construite une JList à l’aide de ce modèle.

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", "Zéro" }; public static void main(String args[]) { JFrame jf1 = new JFrame("Essai JList"); DefaultListModel dlm = newDefaultListModel(); // remplir le modele de donneesfor (int i = 0; i < data.length; i++)

Page 49: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-49 JMF

dlm.addElement(data[i]);JList jl1 = new JList(dlm) ;jf1.getContentPane().add(jl1,BorderLayout.CENTER);// Créer un controleur et le mettre dans l'IHMjf1.getContentPane().add(newListController(dlm), BorderLayout.SOUTH); jf1.pack(); jf1.setVisible(true); }}

Page 50: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-50 JMF

Le Contrôleurimport 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()) ; } } ); }}

Page 51: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-51 JMF

Le composant JTree

modélise une arborescence.utilise l’interface TreeModel et la classeDefaultTreeModel (il n’y a pas deAbstractTreeModel ).

Construire un arbreOn définit tout d’abord les nœuds comme instance de laclasse DefaultMutableTreeNode . En général onutilise le constructeur :public DefaultMutableTreeNode(ObjectuserObject, boolean allowsChildren) quicrée un nœud sans parent et sans enfant, initialisé avecl’objet indiqué. Si allowsChildren vaut false cenœud restera une feuille.Par la suite, lorsque tous les nœuds ont été créés commeobjet DefaultMutableTreeNode , ils sont assembléspour construire un arbre à l’aide de la méthode add() deDefaultMutableTreeNode et l’arbre final estconstruit à l’aide de JTree(TreeNode root) .

Page 52: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-52 JMF

Exemple de JTreePour 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 = newDefaultMutableTreeNode[10]; for (int i = 0; i < nodes.length; i++) { nodes[i] = newDefaultMutableTreeNode(nodeNames[i], !leaf[i]); }

Page 53: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-53 JMF

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); }}

Page 54: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-54 JMF

Les composants Swing pour letexte

Swing propose 5 classes pour traiter le texte. Ces classesdérivent de la classe JTextComponent (qui dérive deJComponent ).

Deux de ces classes remplacent les équivalents AWT :JTextField et JTextArea . Swing propose une classepour des entrées « masquées » : JPasswordField .Dans ces 3 classes, l’affichage du texte est constitué d’uneseule police et d’une seule couleur.

Page 55: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-55 JMF

Les composants Swing pour letexte

Il existe deux autres classes pour le traitement avancé de« texte ».JEditorPane est un traitement de texte pouvantafficher du texte formaté avec de nombreux attributs(différentes couleurs, polices, souligné, gras, ...).JTextPane permet de définir sa propre grammaire dedocuments et ses styles associés alors queJTextEditor est spécialisé pour les textes de typesMIME text/plain, text/html, text/rtf.Dans ces deux classes, les données peuvent être desComponent Swing ou des images.

Page 56: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-56 JMF

Le composant JTextPaneCe composant permet d’éditer du texte formaté :différentes polices, styles, couleurs, .... Un tel texte estappelé un document.Plus précisément un JTextPane peut contenir desimages (Icon ) ou des Component Swing.La plupart des classes et interfaces utilisées se trouve dansle paquetage javax.swing.text .

Cette classe dérive de JEditorPane qui contient desfonctionnalités avancées : affichage de texte HTML ou rtf.

Le modèle associé à un JTextPane est l’interfaceStyledDocument (i.e. document contenant des styles)implanté par la classe concrèteDefaultStyledDocument .

Un JTextPane peut contenir des Component .

Page 57: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-57 JMF

Éditeur Swing qui affiche del’HTML

import javax.swing.*;import java.awt.*;import java.io.*;

public class EditorPaneSample { public static void main(String args[]) throwsIOException { JFrame frame = new JFrame("EditorPaneHTML"); Container content = frame.getContentPane();

JEditorPane editor = newJEditorPane("file:///JeanMarc/Java/index.html"); editor.setEditable(false);

JScrollPane scrollPane = newJScrollPane(editor); content.add(scrollPane);

frame.setSize(640, 480); frame.setVisible(true); }}

Page 58: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-58 JMF

Le Copier/Couper/CollerEn fait cela ne fait pas parti de Swing mais des JFC.

Java permet de manipuler le presse papier (ClipBoard) dela machine et de faire ainsi des "Copier/Couper/Coller"entre une application quelconque et un programme Java àcondition que la donnée transférée "convienne" pour les 2programmes.Le "type" de cette donnée à transférer est un ensemble detype MIME et est représenté par des objets de la classejava.awt.datatransfer.DataFlavor .

Page 59: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-59 JMF

Déposer dans le presse papierIl suffit :- de récupérer le presse papier par :Clipboard c =getToolkit().getSystemClipboard();lancer sur un Component .- créer un objet obj d'une classe implémentant l'interfaceTransferable : ce sera la donnée à déposer dans lepresse-papier.- déposer la donnée dans le presse papier par :c.setContents(obj, proprietairePP) .proprietairePP est désormais le propriétaire dupresse papier. C'est un objet d'une classe qui implémentel'interface ClipboardOwner . Cet objet sera informéque le presse papier a changé de propriétaire (i.e. une autreapplication a déposé une donnée dans le presse-papier) parle lancement de la méthodepublic void lostOwnership(Clipboard c,Transferable t) qui est déclarée dans l'interfaceClipboardOwner .

Page 60: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-60 JMF

Récupérer du presse papierIl suffit :- de récupérer le presse papier par :Clipboard c =getToolkit().getSystemClipboard();lancer sur un Component .- de récupérer la donnée du presse papier par:Transferable t = c.getContents(this);(le paramêtre de cette méthode n'est pas utilisé pourl'instant).- récupérer les différents types possibles (DataFlavor )pour la donnée du presse papier part.getTransferDataFlavors() .On obtient un tableau et de ce tableau, on peut avoir ladonnée pour chaque DataFlavor par :Object o =t.getTransferData(flavors[i]) .

Page 61: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-61 JMF

ProgrammeCopier/Couper/Coller

import java.awt.*;import java.awt.event.*;import java.awt.datatransfer.*;import java.io.*;import javax.swing.*;

public class Clip extends JPanel implementsClipboardOwner { 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);

pasteButton.addActionListener(newActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("Paste!"); Clipboard c =getToolkit().getSystemClipboard(); Transferable t = c.getContents(this); DataFlavor [] flavors =t.getTransferDataFlavors();

Page 62: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-62 JMF

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(newActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("Cut!"); Clipboard c =getToolkit().getSystemClipboard(); StringSelection ss = newStringSelection(text.getSelectedText()); text.replaceRange("", text.getSelectionStart(),text.getSelectionEnd()); c.setContents(ss, Clip.this); } });

Page 63: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-63 JMF

copyButton.addActionListener(newActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("Copy!"); Clipboard c =getToolkit().getSystemClipboard(); StringSelection ss = newStringSelection(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); }}

Page 64: Les applets et Swingdeptinfo.cnam.fr/Enseignement/CycleSpecialisation/IHM/...les applets et bibliothèque Swing le langage Java VI-4 JMF Signification des champs (suite) 'ALIGN' '=

les applets et bibliothèque Swing le langage Java

VI-64 JMF

BibliographieJohn Zukowski’s 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/uiswing/index.html