Travaux pratiques en langage JAVA TP n°5 : Communication entre applets ____________________________ Vous lancerez les applets à partir d’un fichier HTML. Vous devrez passer un certain nombre de paramètres aux applets, pour cela vous pourrez vous renseigner sur les paramètres suivants : param name, value, name, code, width, height,… Dans le code d’une applet : <APPLET … ……………. </APPLET> On peut insérer les paramètres suivants : <PARAM NAME = "monparametre" VALUE= valeur> définit un paramètre monparametre auquel sera associé la valeur valeur. NAME="nom applet" définit le nom de l’applet. CODE="fichier.class" désigne le fichier qui contient le code de l’applet. CODEBASE="chemin" indique le chemin pour trouver le fichier contenant le code de l’applet. WIDTH=1000 donne la largeur de la fenêtre contenant l’applet. HEIGHT=500 donne la hauteur de la fenêtre contenant l’applet. I ) Voici les sources des applets que vous devez saisir Classe émet : Appelle la méthode « recoit_message » d’une autre applet dont le nom est fourni par l’utilisateur import java.applet.*; import java.awt.*; import java.awt.event.*; import java.util.Enumeration; public class emet extends Applet implements ActionListener { String MonNom; TextField ChampNom; TextArea statut; public void init() { Label NomRecepteur = new Label("Nom du recepteur:", Label.RIGHT); add(NomRecepteur); //Etiquette "Nom du recepteur" placée //dans la fenetre de l'aplet ChampNom = new TextField(getParameter("NOMRECEPTEUR"), 10); add(ChampNom); // Ajouter une zone de saisie avec le paramètre // NOMRECEPTEUR initialement ChampNom.addActionListener (this); Button bouton = new Button("Envoyer message"); add(bouton); // Ajout d'un bouton "Envoyer message" bouton.addActionListener(this); statut = new TextArea(5, 60); statut.setEditable(false); add(statut); // ajout d'une zone d'information non éditable MonNom = getParameter("NOM"); Label NomEmetteur = new Label("Mon nom est : " + MonNom + ".", Label.CENTER); add(NomEmetteur); // Etiquette pour le nom de l'applet setBounds (100,100,400,350); validate(); //validation des ajouts de composants } public void actionPerformed (ActionEvent event) { Applet recepteur = null; String NomRecepteur = ChampNom.getText(); //on prend le nom de l'applet "Recepteur" dans la zone de saisie recepteur = getAppletContext().getApplet(NomRecepteur); // on recherche l'applet dans la meme page... if (recepteur != null) { //on a trouvé une applet de ce nom if (!(recepteur instanceof recoit )) { statut.append("L'applet " + NomRecepteur + ", " + "existe mais n'est pas de la classe recoit.\n"); } else { statut.append("Envoi du message à l'applet " + NomRecepteur + ".\n"); //Conversion de l'applet trouvé en classe "recoit" //puis appel de sa méthode recoit_message ((recoit)recepteur).recoit_message(MonNom); } } else { statut.append("Impossible de trouver une applet de nom " + NomRecepteur + ".\n"); } } public void paint(Graphics g) { g.drawRect(0, 0, getSize().width - 1, getSize().height - 1); } public String getAppletInfo() { return "Emetteur de message"; } } Qu’ y a t il de neuf , que vous découvrez pour la première fois ? TextField est une zone de saisie de texte, c’est une classe java. On peut lui associer la prise en compte d’actions (ActionListener ). TextArea est une zone de texte avec ascenseurs. Ici, on l’utilise pour l’affichage uniquement (editable=false) Label et Button, vous connaissez ... add permet d’ajouter un nouveau composant (bouton, zone de texte, étiquette,etc. ). Vous connaissez déjà pour l’avoir utilisé avec contrainte de position (North,South,West,East ou Center) La méthode getParameter ( ...) permet de récupérer dans le fichier HTML dont est issue l’applet le paramètre de nom indiqué. Une fois tous les éléments graphiques installés par init ( ), on réagit à une action (bouton ou validation de la zone de saisie) en réalisant ActionPerformed : - Récupération du nom d’applet dans la zone de saisie avec getText( ) - tentative de recherche de l’applet correspondante avec getAppletContext().getApplet (...) - si l’applet est trouvée et est bien de classe « recoit » on peut appeler la méthode statut.append (...) ajoute le texte spécifié dans la zone d’affichage non éditable. paint, vous connaissez. getAppletInfo permet de fournir une information sur une applet, elle est utilisée par la classe qui liste les applets présentes, ci-dessous.Classe reçoit : Affiche l’applet qui a utilisé sa méthode « recoit_message »import java.applet.*; import java.awt.*; import java.awt.event.*; public class recoit extends Applet implements ActionListener { String Attente = "Attente d'un message... "; Label Message = new Label(Attente, Label.RIGHT); public void init() { add(Message); Button bouton = new Button("Effacer"); add(bouton); bouton.addActionListener (this); add(new Label("Mon nom est " + getParameter("NOM") + ".",Label.LEFT)); validate(); } public void actionPerformed (ActionEvent event) { Message.setText(Attente); repaint(); } public void recoit_message(String emetteur) { Message.setText("Message reçu de " + emetteur + "!"); repaint(); } public void paint(Graphics g) { g.drawRect(0, 0, getSize().width - 1, getSize().height - 1); } public String getAppletInfo() { return "Nom récepteur " + getParameter("NOM") + "."; } } Pas grand chose de nouveau... setText permet de modifier la chaîne de caractères attachée à un « label ». Classe listeapplets : Affiche la liste de toutes les applets présentent dans le fichier HTML import java.applet.*; import java.awt.*; import java.awt.event.*; import java.util.Enumeration; public class listeapplets extends Applet implements ActionListener { TextArea infos; public void init() { Button bouton = new Button("Appuyez ici pour la liste des applets"); add(bouton); bouton.addActionListener(this); infos = new TextArea(5, 40); infos.setEditable(false); add(infos); } public void actionPerformed (ActionEvent event) { afficheApplets(); repaint(); } public String getAppletInfo() { return "MOI, la liste des applets"; } public void afficheApplets() { //la variable mesApplets va contenir toutes les applets en cours Enumeration mesApplets = getAppletContext().getApplets(); infos.append("Liste des applets trouvées :\n"); while (mesApplets.hasMoreElements()) { Applet applet = (Applet)mesApplets.nextElement(); String info = ((Applet)applet).getAppletInfo(); if (info != null) { infos.append("=> " + info + "\n"); } else { infos.append("=> ??? " + applet.getClass().getName() + "\n"); } } infos.append("________________________\n"); } public void paint(Graphics g) { g.drawRect(0, 0, getSize().width - 1, getSize().height - 1); } } Ici, la nouveauté réside dans la récupération de toutes les applets présentes sous forme d’une énumération : Enumeration mesApplets = getAppletContext().getApplets(); Il suffit de passer en revue cette liste obtenue avec : while (mesApplets.hasMoreElements()) { et (Applet)mesApplets.nextElement(); pour récupérer chaque Applet Simple ,non ? La méthode getAppletInfo a été écrite pour chaque applet précédemment, et fournit des informations sur l’applet : une chaîne de caractères. Au cas où cette méthode ne renvoie rien (par défaut pour une applet, si on ne redéfinit pas la méthode getAppletInfo) on récupère au moins le nom de l’applet avec getName( ) ! Faites tourner l’ensemble, comprenez bien chaque élément, posez des questions... II ) A vous de jouer Définir une applet avec deux boutons, l’un intitulé RECTANGLE, l’autre CERCLE. Cette applet contient également trois TextField pour rentrer les valeurs de couleurs Rouge,Vert ou Bleu. (initialisée toutes à 0 au départ ). Nous avons deux autres types d’applets : RECTANGLE, celles qui présentent un rectangle coloré; et CERCLE, celles qui présentent un cercle coloré. 1 ) Avec un fichier HTML pour ces trois applets, commandez la couleur de chacune des deux applets RECTANGLE et CERCLE en fixant les valeurs des zones de saisie, et en cliquant soit sur RECTANGLE, soit sur CERCLE. NB : la conversion des zones de saisie en entiers se fait avec java.lang.Integer.parseInt (...) 2 ) Le nombre d’applets RECTANGLE ou CERCLE est variable. Il est déterminé par le nombre d’applets lancées dans le fichier HTML. Une zone de saisie pour le nom de l’applet destinataire est ajoutée, ainsi qu’une zone présentant les applets présentes dans le fichier HTML. Un seul bouton VALIDER remplace les deux boutons précédents. On choisit désormais les trois composantes de couleur, l’applet destinataire, et on VALIDE. En principe, le destinataire doit changer de couleur...