cours3 - site perso de création de sites web.

Download Report

Transcript cours3 - site perso de création de sites web.

Java : Aspects Avancés
• La programmation Réseau
Communication par sockets
 Les classes de java.net.* permettent très
facilement de se connecter à une machine
afin d’y établir des flux d’entrées/sorties.
 En java, la socket est équivalente à un
gestionnaire d’entrée/sortie entre deux
machines.
Protocoles de communication
 Il existe deux protocoles utilisant les
sockets en Java :
 TCP : Stream Socket
 Communication en mode connectéS
 Les applications sont averties lors de la
déconnexion
 UDP : Datagram Socket
 Communication en mode non connectéS
 Plus rapide mais moins fiable que TCP
Protocole TCP
 Le serveur :
 Le client :
 Crée une socket
 Attend une
connection
 demande une
connection
 accepte la demande
 création de socket
 échange de données
 échange de données
ServerSocket
 Définit une socket sur le serveur.
 Pour créer une ServerSocket, il faut lui
donner un numéro de port.
 Une fois crée, la socket Serveur attend
une connection par la méthode accept().
Ex :
ServerSocket s = new ServerSocket (8888)
Socket socket = s.accept();
// attente d ’une connection
La Socket du client
 Se connecter sur une socket d ’un serveur,
implique de connaître son adresse.
 InetAddress permet de récupérer une
adresse à partir d ’un nom.
 La liaison d ’une socket à la socket serveur
peut alors être demandée
Ex :
InetAddress addr = InetAddress.getByName("crabe");
Socket socket = new Socket(addr, Serveur_1.PORT);
Communication inter-socket
 Les communication entre socket
s ’effectue ‘ classiquement ’,
 par les flux d ’entrées, issus de la
méthode getInputStream
 par les flux de sorties, issus de la
méthode getOutputStream.
Communication inter-socket
Exemple
ServerSocket s = new ServerSocket(8888);
System.out.println("Socket lancee : " + s);
try
{
Socket socket = s.accept(); // Attendre une connection
try
{
System.out.println( "Connection acceptee: "+ socket);
InputStream socket_in = new InputStream(
socket.getInputStream());
DataInputStreaam in = new DataInputStreaam(socket_in);
String str = in.readLine();
}
}
Protocole UDP
 Emission de paquets de données, rapide mais peu
fiable
 Définir un paquet à envoyer ou à recevoir par la
classe DatagramPacket
 Définir une socket par la classe DatagramSocket
Emission de paquets
import java.net.*;
public class UDPClient
{
public static void main(String arg[])
{
try
{
String chaine = "un message";
byte[] data = chaine.getBytes();
InetAddress addr = InetAddress.getByName(null);
DatagramPacket packet = new DatagramPacket(data, data.length, addr, 1234);
DatagramSocket ds = new DatagramSocket();
ds.send(packet);
ds.close();
}
catch(Exception e){}
}
}
Reception de paquets
import java.net.*;
public class UDPServeur
{
public static void main(String arg[])
{
try
{
// Serveur
DatagramSocket ds = new DatagramSocket(1234);
while(true)
{
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
ds.receive(packet);
System.out.println("Message: " + packet.getData());
}
}
}
}
catch(Exception e){}
Une classe réseau : URL
 URL permet de créer des liens vers des
pages internets :
Exemple :
URL url = new URL("http://www.univ-valenciennes.fr/index.html");
DataInputStream dis = new DataInputStream(url.openStream());
String line;
while ((line = dis.readLine()) != null)
System.out.println(line);
Exercice
 Un exemple classique de programmation
réseau : le client-serveur.
 Un serveur est lancé sur une machine et
attend la connexion d’un client. Puis, il
récupère les lignes envoyées par le client,
les affiche et les lui renvoie.
Java : Aspects Avancés
• Les Threads
Qu’est-ce qu’un thread?
 Un thread est un processus qui hérite de son
processus père.
 Java permet la mise ne commun de code, de
données (« light weight process » ou « processus
léger »)
 Le processus partage ses ressources système
(entrées/sorties, ...).
 La programmation est enfin sans contrainte !
Utilité des processus
 Afin de « rendre la main » au programme
principal.
 Afin d ’interagir efficacement.
 Pour la gestion des graphiques, des
applets.
Définition d’un Thread
 Pour créer une tâche, il suffit de faire hériter sa
classe de la classe Thread.
 La principale méthode de Thread est run() qui doit
être surchargée. C’est la méthode qui sera
exécutée simultanément par les autres tâches du
programme.
 La méthode yield() oblige la tâche à se reposer,
pour laisser aux tâches la possibilité de s’exécuter
 La classe Thread implémente l’interface Runnable.
Implémenter Runnable oblige à définir la méthode
run().
Exemple de thread (1/2)
class une_tache extends Thread
{
une_tache(String nom)
{ super(nom); } // appel au constructeur de Thread
public void run()
{
while (true)
{
System.out.println("Mon nom est : " + getName());
Thread.yield(); // petite pause
}
}
}
Exemple de thread (2/2)
class Exemple_tache_1
{
public static void main(String args[])
{
une_tache tache1 = new une_tache("tache 1");
une_tache tache2 = new une_tache("tache 2");
tache1.start();
tache2.start();
while (true)
{
System.out.println("Je suis la tâche principale");
Thread.yield();
}
}
}
Run et Start
 La méthode run() est généralement
placée dans une boucle infinie
 La méthode start(),
 est utilisée pour lancer le Thread
 et appelle la méthode run()
Accès simultanés à une ressource
 La programmation multitâche implique le partage de
ressources (mémoire, objets). Dans certains cas, ceci peut
être problématique.
 Pour cela, Java dispose du mot clé synchronized qui
assure l’exclusion mutuelle d’une section critique en
informant le moniteur (gestionnaire de mémoire).
 exemple: public synchronised void compte() {…}
empèche toute instance de la classe de lancer compte tant
qu’elle ne s’est pas terminée.
 Lorsqu'un thread t1 exécute cette méthode à partir d ’un
objet, un autre thread t2 ne peut pas l'exécuter à partir
du même objet. Mais t2 peut l ’exécuter pour une autre
instance de la même classe.
Synchronisation et efficacité
 Chaque objet possède un verrou lock ou moniteur.
(Cela fait partie de la classe Object).
 Exemple de verrou :
...
synchronized (compteur) {compteur.add() ; compteur.mult() ; ...}
...
 Lorsqu'une méthode synchronisée d'un objet est
appelée, le verrou est mis, aucune autre méthode
synchronisée de cet objet peut être exécutée.
 Acquérir le verrou d'un objet est forcément
coûteux. Il faut donc savoir gérer et diminuer au
maximum les sections critiques.
Le processus dans tous ses états
 Nouveau : il est créé mais start() n ’est pas
encore appelé
 Exécutable : il a été initialisé (il est exécuté si
l ’ordonnanceur le décide)
 Mort : fin normale d ’un Thead (sortie de la
méthode run()
 Bloqué : l ’ordonnanceur ignore le Tread
Raison d ’un blocage
 Le thread peut être :
 endormi : sleep(milliseconds)
 suspendu : par suspend(). Il sera alors
relancé par resume()
 en attente : par wait(). Il pourra alors être
réactivé par notify() ou notifyAll()
 IO : en attente d ’une Entrée/Sortie
 synch : en attente de la libération d ’une
ressource synchronisée
Différence Wait/Suspend
 Suspend :
 Tient le verrou de l ’objet,
 donc bloque dons les méthode synchronisées
 et peut être source de DeadLock
 Wait
 ne tient pas les verrous
 et donc ne doit pas être appelé d ’un bloc
synchronisé, sous risque d ’accès concurrent
Maintien en cohérence...
 Il faut éviter l ’utilisation de :
 stop : cette méthode libère les verrous même
si l ’objet est dans un état instable
 Il faut le remplacer par un test dans la boucle du
run()
 lever l ’exception InterrupedException en utilisant
la méthode interrupt()
 suspend (et donc resume), car ils sont
sources de nombreux deadlock
Exercice
 Un exemple classique de programmation de
processus : le producteur-consommateur.
 Un producteur produit des objets dans
une pile, 2 consommateurs en consomment.
 Ecrire les classes Tab_objets,
Producteur et Consommateur, ainsi que la
classe principale.
Java : Aspects Avancés
• Les applets
Une Applet...
 Second type de programmation Java, le plus
connu car le plus visible
 Ne peut être exécutée que depuis un
Navigateur
 Le Navigateur doit contenir en interne
 une machine virtuelle
 sa propre méthode main
Les méthodes d ’une applet
 Une applet est un objet graphique (descendant de panel),
aussi contient elle des méthodes graphiques.
 Les principales méthodes d ’une applet sont :
 init(), que le navigateur appelle après chaque chargement de
l’applet.,
 start(), lancée après l’initialisation,
 stop(), arrête l’applet lorsqu’elle n’est plus visible,
 destroy(), appelé à l’arrêt du navigateur, ou au rechargement de
l’applet,
 paint(Graphics g) est appelé chaque fois que l’applet est
réaffichée.
Exemple d ’applet
import java.awt.*;
import java.applet.*;
public class Applet1 extends Applet
{
Font font;
public void init()
{
font = new Font("TimesRoman", Font.PLAIN,20);
}
public void paint(Graphics g)
{
g.setFont(font);
g.setColor(Color.red);
g.drawString("Salut tout le monde!", 0, font.getSize());
g.draw3DRect(0, 0, 180, 30, true);
}
}
Insertion dans une page Web
 L ’insertion est possible par le tag
APPLET
:
<HTML>
<HEAD>
<TITLE>Exemple d'applet</TITLE>
<BODY>
<H1>Un exemple dapplet</H1>
<applet code="Applet1.class" width=200 height=50>
desole ... ce navigateur ne supporte pas les applets
</applet>
</BODY>
</HEAD>
</HTML>
Passage de paramètres
dans une page Web
 La méthode getParameter("msg") retourne
la valeur du paramètre indiqué dans la page web.
 Pour passer les paramètres, il faut appeler
l’applet dans la page web comme ceci :
<Applet code="Applet1.class" width=300 height=200>
<param name=msg value="voici le message">
</Applet>
Archiver les classes
 Lorsqu ’une applet utilise une autre classe située
dans le même répertoire, elle charge cette
classe, ce qui cause un ralentissement.
 Pour éviter les multiples chargement il faut
compresser les classes avec jar
 L’appel à partir d’une page web se fera sous la
forme :
<Applet code="Applet1.class" archive= "nom_archive.jar"
width=300 height=200>
<param name=msg value="voici le message">
</Applet>
Applet permanente
 Toutes les applets utilisent la même machine
virtuelle. Si l’on souhaite créer une applet à
activité permanente (défilement de texte,
d’images, ...), il faut la créer en tant que
processus afin de ne pas bloquer les autres
applets.
 Pour cela, il faut que l’applet implémente
l’interface Runnable (similaire à Thread, mais qui
permet de réécrire la fonction stop())
Exercice
 Ecrire une applet qui affiche un texte
déroulant dans la barre d ’état du
navigateur.
 On utilisera la fonction showStatus de
l ’applet.
 La fréquence de défilement est passée en
paramètre
Java : Aspects Avancés
• AWT : Abstract Window Toolkit
Sylvain LECOMTE & Vincent POIRRIEZ
Généralités sur AWT
 AWT comporte :
 des éléments graphiques
 des conteneurs
 Un mécanisme de gestion d'événements, ...
 AWT a beaucoup évolué entre 1.0.2 et 1.1.1 :
 nouveau modèle événementiel
 gestion de l'impression
 gestion de l'échange de données
 AWT a encore évolué avec Java Foundation Class
et java.2D
Sylvain LECOMTE & Vincent POIRRIEZ
Les objets graphiques de AWT
Les éléments graphiques
 Button
 Canvas (zone de dessin)
 Checkbox
 Choice
 Label
 List
 MenuBar
 MenuItem
 TextArea
 TextField
Sylvain LECOMTE & Vincent POIRRIEZ
Les conteneurs de AWT
 Les conteneurs sont les couches sur
lesquels seront dessinés les objets :
 Frame
 Dialog
 Window
 Panel (conteneur de base)
 Les Gestionnaires de mise en page
permettent de placer automatiquement
les objets.
Sylvain LECOMTE & Vincent POIRRIEZ
FlowLayout
java.awt.FlowLayout : de gauche à droite,
de haut en bas
one
two
three
Sylvain LECOMTE & Vincent POIRRIEZ
BorderLayout
java.awt.BorderLayout découpe la zone en
Nord, Sud, Est, Ouest et Centre
North
West
Center
South
East
Sylvain LECOMTE & Vincent POIRRIEZ
GridLayout
java.awt.GridLayout découpe la zone en
une grille dont on peut choisir les
dimensions
one
two
three
four
five
six
Sylvain LECOMTE & Vincent POIRRIEZ
Avantage de AWT
 Il permet de créer une interface
graphique d ’exécutant sous toutes les
interfaces (Windows, Xwindows, …)
 il simplifie la tâche du concepteur de
l ’IHM (presque tous les objets sont
présents)...
Sylvain LECOMTE & Vincent POIRRIEZ
Evenements
 Chaque objet graphique (ou presque) possède sa
propre gestion dévénements,
 Java propose des interfaces d ’écoute (Window,
Mouse, ...)Listener
 Pour les plux complexes, il existe des classes
dont les méthodes ne font rien !
(Window, Mouse, ...)Adapter
 Avantage, si une classe hérite d ’une de ces classes,
elle n ’a qu ’à surcharger la méthode désirée
Sylvain LECOMTE & Vincent POIRRIEZ
Exemple d ’interface AWT
Sylvain LECOMTE & Vincent POIRRIEZ
Exemple d ’interface AWT (2)
MenuBar
Label
TextField
Choice
List
tfPanel
chPanel
lstPanel
cbPanel
Checkbox
rbPanel
btPanel
Button
Sylvain LECOMTE & Vincent POIRRIEZ
Exemple de label
// Text Field Panel
Panel tfPanel = new Panel(new FlowLayout(FlowLayout.LEFT));
label = new Label("TextField");
tfdPanel.add(label);
textField = new TextField(15);
tfPanel.add(textField);
Sylvain LECOMTE & Vincent POIRRIEZ
Exemple de choix
// Choice Panel
Panel chPanel = new Panel(new FlowLayout(FlowLayout.LEFT));
label = new Label("Choice");
chPanel.add(label);
choice = new Choice();
choice.addItem("Solaris");
choice.addItem("Linux");
choice.addItem("Aix");
chPanel.add(choice);
Sylvain LECOMTE & Vincent POIRRIEZ
Exemple de liste
// List Panel
Panel listPanel = new Panel(new FlowLayout(FlowLayout.LEFT));
label = new Label("List");
listPanel.add(label);
list = new List();
list.addItem("Solaris");
list.addItem("Linux");
list.addItem("Aix");
listPanel.add(list);
Sylvain LECOMTE & Vincent POIRRIEZ
Exemple de cases
// Checkbox Panel
Panel cbPanel = new Panel(new FlowLayout(FlowLayout.LEFT));
cbSolaris = new Checkbox("Solaris");
cbPanel.add(cbSolaris);
cbLinux = new Checkbox("Linux");
cbPanel.add(cbLinux);
cbAix = new Checkbox("Aix");
cbPanel.add(cbAix);
Sylvain LECOMTE & Vincent POIRRIEZ
Exemple de bouton radio
// RadioButton Panel
Panel rbPanel = new Panel(new FlowLayout(FlowLayout.LEFT));
rbGroup = new CheckboxGroup();
rbSolaris = new Checkbox("Solaris");
rbSolaris.setCheckboxGroup(rbGroup);
rbPanel.add(rbSolaris);
rbLinux = new Checkbox("Linux");
rbLinux.setCheckboxGroup(rbGroup);
rbPanel.add(rbLinux);
rbAix = new Checkbox("Aix");
rbAix.setCheckboxGroup(rbGroup);
rbPanel.add(rbAix);
rbGroup.setSelectedCheckbox(rbSolaris);
Evenement sur choix, boutons
radios, cases et listes
Sylvain LECOMTE & Vincent POIRRIEZ
 ItemListener est l’interface permettant
de gérer les événements sur les objets de
type Choice, List et CheckBox
 Elle contient la méthode
itemStateChanged(ItemEvent e)
déclenchée lors de sélection/déselection d’un
item.
Sylvain LECOMTE & Vincent POIRRIEZ
Exemple de bouton
// Button Panel
Panel btPanel = new Panel(new FlowLayout(FlowLayout.LEFT));
okButton = new Button("Ok");
okButton.addActionListener(new OkButtonListener());
btPanel.add(okButton);
cancelButton = new Button("Cancel");
cancelButton.addActionListener(new CancelButtonListener());
btPanel.add(cancelButton);
Sylvain LECOMTE & Vincent POIRRIEZ
Exemple de menu
// Menu Bar
Menu procMenu = new Menu("Procedural");
procMenu.add(new MenuItem("Pascal"));
...
Menu ooMenu = new Menu("Object Oriented");
ooMenu.add(new MenuItem("SmallTalk"));
...
Menu funcMenu = new Menu("Functional");
funcMenu.add(new MenuItem("Lisp"));
...
Menu languageMenu = new Menu("Languages");
languageMenu.add(procMenu);
...
MenuBar mb = new MenuBar();
mb.add(languageMenu);
Sylvain LECOMTE & Vincent POIRRIEZ
Exemple de construction
public class FrameExample extends Frame {
public FrameExample(String title) {
super(title);
...
setMenuBar(mb);
setLayout(new GridLayout(0, 1, 2, 2));
add(textFieldPanel);
add(choicePanel);
add(listPanel);
add(checkboxPanel);
add(radioButtonPanel);
add(buttonPanel);
pack();
show();}
Exemple de gestion d’événement sur
bouton
Sylvain LECOMTE & Vincent POIRRIEZ
Gestion des événements : clic sur le bouton Ok
okButton.addActionListener(new OkButtonListener());
public class OkButtonListener implements ActionListener {
public void actionPerformed(ActionEvent evt) {
System.out.println("textField = " + textField.getText());
System.out.println("choice = "
+ choice.getSelectedItem());
System.out.println("list = "
+ list.getSelectedItem());
System.out.println("cbSolaris="
+ (cbSolaris.getState() ?"Yes"
System.out.println("cbLinux="
+ (cbLinux.getState()
?"Yes"
System.out.println("cbWindow="
+ (cbAix.getState()
?"Yes"
System.out.println("rbSolaris="
+ (rbSolaris.getState() ?"Yes"
System.out.println("rbLinux="
+ (rbLinux.getState()
?"Yes"
System.out.println("rbWindow="
+ (rbAix.getState()
?"Yes"
}
}
:
:
:
:
:
:
"No"));
"No"));
"No"));
"No"));
"No"));
"No"));
Exemple de gestion d’événement sur
menu
Sylvain LECOMTE & Vincent POIRRIEZ
Gestion des événements : sélection d'items du
menu
MenuItem mi = new MenuItem("Pascal");
mi.addActionListener(new LanguageMenuListener());
public class LanguageMenuListener implements ActionListener
{
public void actionPerformed(ActionEvent evt)
{ System.out.println("Menu: " + evt.getActionCommand()};
}
}
Exemple de gestion d’événement sur
fenêtre
Sylvain LECOMTE & Vincent POIRRIEZ
Gestion des événements : fermeture de la fenêtre
addWindowListener(new MyWindowListener());
public class MyWindowListener extends WindowAdapter
{
public void windowClosing(WindowEvent evt)
{
System.out.println("Window closing");
System.exit(0);
}
}
Evenement sur champs de texte et
zone de texte
Sylvain LECOMTE & Vincent POIRRIEZ
L’interface TextListener permet de gérer
les événements sur les objets de type
TextField et TextAera,
Elle contient la méthode
textValueChanged(TextEvent e)
déclenchée lors de modification du texte
Sylvain LECOMTE & Vincent POIRRIEZ
Autres gestions d ’événements (souris)
 On trouve aussi l’interface MouseListener qui définit les
méthodes
 void mouseClicked(MouseEvent e)  clic sur l’objet
 void mouseEntered(MouseEvent e)  passage sur l’objet
 void mouseExited(MouseEvent e)  sortie de l’objet
 void mousePressed(MouseEvent e)  pression sur l’objet
 void mouseReleased(MouseEvent e)  relâche de l’objet
 Cette interface est implémentée par la classe
MouseAdapter qu ’il faudra étendre pour gérer les
événements souris
Autres gestions d ’événements
(fenêtre)
Sylvain LECOMTE & Vincent POIRRIEZ
 Ainsi que l’interface WindowListener qui définit les
méthodes suivantes :
 void windowActivated(WindowEvent e)  la fenêtre devient active
 void windowClosed(WindowEvent e)  fermeture par un bouton ou
autre
 void windowClosing(WindowEvent e)  fermeture par menu système
 void windowDeactivated(WindowEvent e)  la fenêtre n’est plus active
 void windowDeiconified(WindowEvent e)  de minimisée à un autre
état
 void windowIconified(WindowEvent e)  minimisation
 void windowOpened(WindowEvent e)  première ouverture
 Cette interface est implémentée par la classe
WindowAdapter qu ’il faudra étendre pour gérer les
événements sur la fenêtre.
Sylvain LECOMTE & Vincent POIRRIEZ
L ’objet graphics
 Les fonctions de la classe Graphics permettent
de dessiner simplement différentes figures sur
un support :
 clearRect, draw3Drect, drawArc, drawImage,
drawLine, drawOval, drawPolygon, drawPolyline,
drawRect, drawString, fill3Drect, fillArc, fillOval,
fillPolygon, fillRect, getColor, getFont, setColor,
setFont.
 Le support peut être tout objet descendant de
Composant
Exercice
 Créer une Frame permettant de dessiner
des lignes à l ’aide de la souris
 Utiliser un tableau de 10 Points pour
tracer des lignes entre chaque Point.
Sylvain LECOMTE & Vincent POIRRIEZ
Java : Aspects Avancés
• Le Swing
Swing :
Qu ’est ce que c ’est ?
Sylvain LECOMTE & Vincent POIRRIEZ
 Swing est un ensemble de librairies graphiques
plus évoluées et plus complètes que les
librairies AWT.
 Swing est livrée avec le JDK 1.2,
 pour JDK 1.1, il est possible de télécharger les
classes swing.
Sylvain LECOMTE & Vincent POIRRIEZ
Nouvelles Fonctionnalités
 Swing propose de nouveaux composants tels que
 Les Tables, les Arbres, la Barre de progression…
 Les objets graphiques AWT ont été surchargés (on
trouve maintenant les types JButton, Jpanel, ...)
 Avec Swing, il est possible de masquer certains
événements
 Il est possible de "zaper" entre les différentes
interfaces :
 l ’interface Windows
 l ’interface Motif
 une interface 3D « métale »
Sylvain LECOMTE & Vincent POIRRIEZ
Un exemple de swing...
import javax.swing.*; import java.awt.*;import java.awt.event.*;
public class SwingApplication
{
private static String labelPrefix = "Number of button clicks: ";
private int numClicks = 0;
public Component createComponents()
{
final JLabel label = new JLabel(labelPrefix + "0 ");
JButton button = new JButton("I'm a Swing button!");
button.setMnemonic(KeyEvent.VK_I);
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
numClicks++;
label.setText(labelPrefix + numClicks);
}
}
);
label.setLabelFor(button);
}
Sylvain LECOMTE & Vincent POIRRIEZ
Un exemple de swing Suite...
public static void main(String[] args)
{
try {
UIManager.setLookAndFeel(
UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception e) { }
//Create the top-level container and add contents to it.
JFrame frame = new JFrame("SwingApplication");
SwingApplication app = new SwingApplication();
Component contents = app.createComponents();
frame.getContentPane().add(contents, BorderLayout.CENTER);
//Finish setting up the frame, and show it.
frame.addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0); } });
frame.pack(); frame.setVisible(true);
}
Sylvain LECOMTE & Vincent POIRRIEZ
Swing dans une applet
Il est tout à fait possible de créer des applets utilisant des
composants swing.
Il faut alors être sûr que les navigateurs des utilisateurs
pourront interpréter le swing.
import javax.swing.*; import java.awt.*;
public class HelloSwingApplet extends JApplet
{
public void init()
{
JLabel label = new JLabel("You are successfully running a Swing applet!");
label.setHorizontalAlignment(JLabel.CENTER);
//Add border.
label.setBorder(BorderFactory.createMatteBorder(1,1,2,2,Color.black));
getContentPane().add(label, BorderLayout.CENTER);
}
}
Sylvain LECOMTE & Vincent POIRRIEZ
Un autre exemple :
un menu
Sylvain LECOMTE & Vincent POIRRIEZ
Conclusion sur Swing
 Swing offre surtout beaucoup plus de composants
que AWT (trop ?) :
 Le rendu est meilleur
 Les options nombreuses
 Mais l ’API est encore difficile à connaître
 ne pas hésiter à utiliser le Tutorial...
Sylvain LECOMTE & Vincent POIRRIEZ
Java : Aspects Avancés
• Les JavaBean
Sylvain LECOMTE & Vincent POIRRIEZ
La notion de composant
 Un bean Java est un composant réutilisable (sorte
d ’active X)
 Il facilite donc la création de programmes par
connexion de composants
 Java propose déjà un ensemble de composants
très utiles (le bean hotjava par exemple pour
afficher une page web, ...)
 Pour développer, utiliser des beans, il existe le
bdk, le kit de développement de beans ...
Sylvain LECOMTE & Vincent POIRRIEZ
Outil de développement
Réserve de
composants
Application
Propriété du
composant
sélectionné
Sylvain LECOMTE & Vincent POIRRIEZ
L ’introspection
 Permet à un système de se regarder lui même
 Exemple :
 Les objets de la classe Class représente des classes du système
 Les objets de la classe Method représente des méthodes
 On peut alors rechercher une classe par son nom
 Class classButton = Class.forName("Button");
 et créer une nouvelle instance de cette classe
 Objetc myButton = classButton.newInstance();
 et récupérer toutes les méthodes de cette classe :
 Method [] bmethods = classButton.getDeclaredMethods();
Sylvain LECOMTE & Vincent POIRRIEZ
Qu ’est ce qu ’un Beans ?
 Un composant qui possède :
 des propriétés
 des événements reconnus
 des méthodes de traitement des événements
 Importance de l ’introspection :
 possibilité d ’interroger le composant
 Quelles sont tes méthodes, les variables, les événements traités
Sylvain LECOMTE & Vincent POIRRIEZ
Types de Beans
 Component (montre, barre, synoptique, ...)
 Container (panneau, ...)
 Invisible (ne possède pas d ’interface graphique )
 joue le rôle d ’interface
 Applet
Sylvain LECOMTE & Vincent POIRRIEZ
La double vie des Beans
 Pendant la configuration dans le BDK le Bean
peut posséder sa propre interface graphique
de configuration
 Le bean est sérializé à la fermeture du bdk, il
est désérialisé (rechargé) à l exécution.
 Les méthodes du bean sont activés par des
événements.
Sylvain LECOMTE & Vincent POIRRIEZ
Classes d’évènements prédéfinies
 Evénements de bas niveau
 java.util.EventObject
 java.awt.AWTEvent




java.awt.event.ComponentEvent
java.awt.event.FocusEvent
java.awt.event.WindowEvent
java.awt.event.InputEvent

java.awt.event.KeyEvent

java.awt.event.MouseEvent
Sylvain LECOMTE & Vincent POIRRIEZ
Créer un Bean...
 1. Ecrire le source : C ’est un rectangle rouge
import java.awt.*;
import java.io.Serializable;
public class SimpleBean extends Canvas implements Serializable
{
public SimpleBean()
{ setSize(60,40); setBackground(Color.red); }}
 2. Créer un fichier jar contenant la classe SimpleBean
Sylvain LECOMTE & Vincent POIRRIEZ
Créer un Bean (suite)
 3. Charger le .jar dans la ToolBox
 4. Créer une instance de la classe dans la BeanBox
 On peut se rendre compte que le Bean dispose d ’un
certain nombre de propriétés (qui sont en fait héritées
de Canvas) :
 Foreground
 Background
 font
 name
Sylvain LECOMTE & Vincent POIRRIEZ
Ajouter une propriété
 Exemple : la propriété de « couleur »
 1. Créer et initialiser l ’atribut : private Color color = Color.green;
 2. Ecrire une méthode pour obtenir la couleur :

public Color getColor() {return color;}
 3. Ecrire une méthode pour changer la couleur

public void setColor(Color newColor){ color = newColor; repaint();}
 4.Réécrire la méthode paint() héritée de Canvas :

public void paint(Graphics g) { g.setColor(color); g.fillRect(20, 5, 20, 30);}
 5.Compiler le Bean, le charger dans la Toolbox et créer une instance
dans la BeanBox.
Sylvain LECOMTE & Vincent POIRRIEZ
Résultat
Sylvain LECOMTE & Vincent POIRRIEZ
Enterprise Java Beans
 Ce sont les Beans contenant une couche
client serveur,
 très à la mode en ce moment (commerce
électroniques, accès à ds bases de
données distantes, communication aux
travers de site web,...)
Sylvain LECOMTE & Vincent POIRRIEZ
Java , suite
Et non fin,
 cf. Internet, de nombreuses applications
de Java à tous niveaux,
 possibilité d ’inclure des librairies C,
 notions de servlet pour communication de
données d ’un client vers un fournisseur
par html,
 accès sécurisé, xml, ...........