Java Beans http://java.sun.com/docs/books/tutorial/javabeans/index.ht ml Les Java Beans… composants logiciels (généralement graphique) pouvant être composés dynamiquement Michel RIVEILL [email protected] - http://rangiroa.essi.fr/riveill Laboratoire I3S 2 Programmation par composants Java Beans JavaBeans Objectif : permettre la programmation par composition Bean : objet Java présentant certaines caractéristiques dynamique syntaxiques (pattern) Beans = composants réutilisables (visuel ou non) pour les plates-formes Java Composition dynamique Définition des attributs Communication de type événement/réaction Assemblage dynamique de composants Visualisation en ligne de l’application réalisée intéressant pour la construction d’une interface Bean Caractéristiques Bean Un bean exporte différentes propriétés (attributs publics) Communication par événement Chaque bean est persistant Introspection : permet de découvrir dynamiquement les propriétés de chaque bean abonné_1 Source event event Bean event event 3 abonné_2 4 Exposé court (suite page 31) Java Beans - propriétés Java Beans - propriétés Attributs publics pouvant être positionnés de l'extérieur modes : read/write, read only ou write only par d'autres beans ou par des outils (PropertyEditor) portent par exemple sur : Différents types de propriétés simples indexées : ensemble de valeur liées - bound : un événement est notifié à chaque modification de l’attribut contraintes - constrained : notification du changement avec vérification de la modification la présentation (taille, couleur, position, …) le comportement Identification d'une propriété par des règles syntaxiques setX(int i) et int getX() identifie la propriété X de type entier mécanisme générique utilisé par les outils d’introspection un autre Bean peut interdire la modification de la valeur utilisation non transparente 5 6 Java Beans Java Beans Evénements objets java héritant de java.lang.EventObject envoyés vers des beans abonnés à cet événement Evénements objets java héritant de java.lang.EventObject envoyés vers des beans abonnés à cet événement Utilisation des Listener Public Publicinterface interfaceEventListener EventListener{{ void handleEvent(Event (Event e); handleEvent void handleEvent(Event e); }} Source Source Abonné é Abonn Abonné Un bean souhaitant réagir à un événement, s’enregistre auprès d ’un beans capable de générer cet événement Utilisation des Listener Source Source Public Publicsynchronized synchronized addListener( (Listener l)l) addListener addListener(Listener implement s Abonné é Abonn Abonné Source.addListener( (this); Source.addListener this); Source.addListener(this); Abonné é Abonn Abonné Abonné é Abonn Abonné 7 8 Java Beans Java Beans : introspection Public Publicinterface interfaceEventListener EventListener{{ void (Event e); handleEvent voidhandleEvent(Event handleEvent(Event e); }} Source Source mécanisme d’introspection convention de nommage Public Publicsynchronized synchronized addListener( (Listener l)l) addListener addListener(Listener utilisation de méthodes pour rechercher les attributs, les événements, les méthodes description explicites des méthodes, propriétés, événements associés aux composants Abonné é Abonn Abonné Source.addListener( (this); Source.addListener this); Source.addListener(this); implements handleEvent(e) (e) handleEvent handleEvent(e) Vector VectorListeners Listeners Event Event Object Object Abonné é Abonn Abonné Event Event Object Object 9 Java Beans : persistance 10 Java Bean : la BeanBox Mise en œuvre sauvegarde / restauration de l ’état à l ’aide de la sérialisation Java sauvegarde de l ’état après chaque modification d ’une propriété on peut choisir les propriétés qui seront sauvegardées 11 12 Exemple : construire un bean jauge Ecriture d ’un bean (suite) A chaque appel de la méthode progress (), la jauge Ecriture de la méthode publique progress() qui incrémente évolue : le pointeur public void progress(){ if(steps!=0){ theta = theta + (360/steps); repaint(); } } Choix de l ’objet graphique a étendre : « component » permet de créer des composants graphiques « légers » (i.e. qui n ’ont pas de fenêtre opaque associé - voir doc awt) public class Gauge extends Component { Un bean a un constructeur sans paramètre : public Gauge() { super(); } 13 14 Ecriture d ’un bean Ecriture d ’un bean Déclaration des méthodes permettant l ’accès aux Ecriture de la méthode paint () permettant de visualiser la attributs : progression du pointeur Steps : nombre de pas pour faire le tour du cercle MaximumSize lecture et écriture lecture seulement public void setSteps (int steps){ this.steps=steps; progress(); } public int getSteps(){ return steps; } public Dimension getMaximumSize(){ return new Dimension (100, 100); } 15 public void paint(Graphics g){ g.drawOval(0, 0, 100, 100); g.drawLine(50, 50, (int) (50+50*Math.cos(theta*Math.PI/180)), (int) (50+50*Math.sin(theta* Math.PI/180)) ); } C ’est fini… il faut compiler le bean jauge (voir manuel du B.D.K) 16 Construire une petite application avec 3 beans Tester le bean jauge Charge le bean Timer Placer les bean « Gauge », « OurButton » et « Timer » dans la Charger le bean jauge (« Gauge ») dans la ToolBox Placer le bean jauge (« Gauge ») dans la BeanBox, and positionnner le nombre de pas à 10 Placer un bean « OurButton » dans la BeanBox Avec le bean « OurButton » sélectionner, choisir dans le menu Edit -> Events|mouseClick|buttonClicked, et tirer un trait vers le bean jauge (« Gaude ») Dans la boite de dialogue, sélectionner la méthode progress() Maintenant en cliquant sur le bouton, le pointeur avance pour les 9 prochains clics. Vous pouvez modifier le nombre de pas… et recommencer 17 Java Beans : évaluation Intégration au niveau source (Java...) Visualisation de l’application mais pas de son architecture intéressant pour des composants graphiques Environnement ‘BeanBox’ outils d’aide à la construction (vision exécution) possibilité d’éditer les propriétés, les méthodes, mais plus difficilement les liens entre les Beans n’est pas orienté vers les applications réparties Environnement ‘professionnel’ Intègrent tous aujourd’hui la notion de Beans Permettent presque tous la visualisation de l’architecture 19 BeanBox Modifier le label du bean « OurButton » pour avoir « Start Timer » Lier l ’événement Events|mouseClick|buttonClicked associé au bean « OurButton » à la méthode startTimer() du bean « Timer » Lier l ’événement Events|timer|timedOut du bean « Timer » à la méthode progress() du bean « Gauge » Selectionner le bean « Timer ». Positionner l ’attribut « noOfTimeouts » à 10 Selectionner le bean « Gauge ». Positionner l ’attribut « steps » à 10 Cliquer sur le bouton « Start Timer » et vous devez voir progresser la jauge pendant les 10 prochaines secondes ! 18