MokaByte Numero 30  -  Maggio 1999
 
Comunicazione
fra Applet
di 
Daniela Micucci 
Dopo il caso del mese scorso vediamo come permettere la comunicazione e lo scambio di dati fra due applet residenti nella stessa pagina HTML


L'esempio proposto mostra come la comunicazione fra Applet residenti sulla stessa pagina sia un meccanismo possibile e soprattutto semplice da realizzare

A cosa serve 

Lo scopo è quello di costruire due Applet, inserirli nella stessa pagina html e fare in modo che il primo (ImmissioneTesto) comunichi con il secondo (VisualizzazioneTesto) inviandogli un messaggio. Più precisamente: nel primo Applet risiede un TextField su cui inserire testo, il secondo deve visualizzare su una TextArea i caratteri che man mano vengono inseriti nel TextField del primo Applet.) 
 
 
 

Come funziona

In Java è possibile far comunicare due o più Applet tra loro in maniera molto semplice. 
L'interfaccia AppletContext del package java.applet contiene infatti due utili metodi che permettono di ottenere  e istanze degli Applet che stanno girando sulla stessa pagina html. 
Gli Applet possono essere recuperati" singolarmente tramite il nome con cui si registrano e l'utilizzo del metodo getApplet(String) (dove String deve coincidere con il nome con cui si sono registrati), oppure tutti insieme tramite la chiamata del metodo getAplets() che restituisce una Enumeration che contiene tutti gli Applet.
Se si desidera che un 'Applet ottenga tutte le istanze degli Applet che stanno girando sulla sua stessa pagina, occorre effettuare unicamente la chiamata al metodo getAplets() meglio se all'interno del suo metodo init():
 
Enumeration e = getAppletContext().getApplets();


Il metodo getAppletContext della classe Applet restituisce un'istanza di tipo AppletContext, tramite questa è possibile quindi usare il metodo getApplets(). Non è necessario che gli Applet con cui deve interagire si registrino tramite un attributo del tag dell'Applet. 
Un discorso diverso va fatto se si vuole che l'Applet ottenga le istanze degli altri Applet tramite il nome con cui si registrano. L'esempio riportato propone proprio questo caso: l'Applet ImmissioneTesto contiene un TextField su cui digitare singoli caratteri. Un ascolattore di tipo KeyListener (classe AscoltaTextField) associato a quel TextField, deve recuperare il carattere digitato ed inviarlo all'Applet VisualizzazioneTesto (tramite la chiamata al suo metodo setTesto(String)) che provvede ad appenderlo alla sua TextArea. Analizziamo in dettaglio la procedura che è stata seguita per fare in modo che l'Aplet ImmissioneTesto possa inviare messaggi all'Applet VisualizzazioneTesto:

    Scrittura del tag dell'Applet a cui l'altro Applet deve inviare messaggi:
    occorre scrivere il tag dell'APPLET in maniera da usare l'attributo NAME per specificare il nome con cui si registra l'applet a cui devono essere inviati i messaggi 
    <APPLET code ="VisualizzazioneTesto.class" Width=300 Height=100 
    NAME = "Visualizza"> </APPLET>
    In questo modo l'applet VisualizzazioneTesto si rende disponibile verso gli altri Applet residenti sulla stessa pagina tramite il nome Visualizza.
    Reperimento dell'Applet con cui interagire per l'invio dei messaggi:
    Nell'Applet che deve inviare i messaggi (ImmissioneTesto), occorre usare il metodo getApplet(String) passandogli il nome specificato in NAME per ottenere l'istanza dell'Applet con cui interagire (VisualizzazioneTesto). Il metodo restituisce un oggetto di tipo Applet, occorre a questo punto eseguire un'operazione di cast per poter chiamare i metodi che pubblica in più rispetto alla classe Applet. Come per il caso della chiamata del metodo getApplets(), anche qui occorre ottenere un'istanza dell'interfaccia AppletContext, tramite la chiamata del metodo getAppletContext() della classe Applet, in modo da poter usare il metodo getApplet(String) che essa pubblica:
    AppletContext ac = getAppletContext();
    appletVisualizza = (VisualizzazioneTesto)ac.getApplet("Visualizza");
Grazie a queste due semplici operazioni l'Applet ImmissioneTesto può interagire ora con l'Applet VisualizzazioneTesto. Nella figura sottostante si possono vedere i due Applet all'opera usando come browser Netscape 4.5.


 
 

Il codice

La classe VisualizzazioneTesto
import java.applet.*;
import java.awt.*;

/**
   Un'applet che visualizza sulla propria TexArea del testo
*/
public class VisualizzazioneTesto extends Applet
{
   /** La TextArea su cui viene visualizzato il testo */
   private TextArea textArea;

   /**
      Inizializza l'applet aggiungendo una TextArea
   */
   public void init()
   {
      setBackground(Color.lightGray);
      setLayout(new BorderLayout());
      textArea = new TextArea();
      textArea.setEditable(false);
      add("Center", textArea);
   }

   /**
      Il metodo che aggiorna il carattere sulla TextArea
      @param testo La nuova stringa da appendere alla TextArea
   */
   public void setTesto(String testo)
   {
      textArea.append(testo);
   }
}

La classe ImmissioneTesto
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

/**
   Un'applet che dispone di un textfield in cui immettere del testo.
*/
public class ImmissioneTesto extends Applet
{
   /** Il TextField in cui immettere il testo */
   private TextField textField;
   /** L'Applet con cui comunica */
   private VisualizzazioneTesto appletVisualizza;

   /**
      Inizializza l'applet ottenendo un'istanza dell'applet con cui 
      deve comunicare.
      Inoltre provvede alla visulizazione del TextField
   */
   public void init()
   {
      //Ottengo l'applet tramite la chiamata al metodo getApplet che vuole in
      //ingresso il NAME con cui si è registrata l'applet che deve essere
      //contattata
      AppletContext ac = getAppletContext();
      appletVisualizza = (VisualizzazioneTesto)ac.getApplet("Visualizza");

      setBackground(Color.lightGray);
      setFont(new Font("TimesRoman", Font.BOLD, 12));

      setLayout(new BorderLayout());
      add("Center", costruisciTextField());
   }
 

   /**
      Costruisce un pannello in cui vengono inseriti una label e il
      TextField in cui immettere il testo.
      @return Il pannello costruito.
   */
   private Panel costruisciTextField()
   {
      Panel p = new Panel();

      p.add(new Label("Inserire il testo: "));
      textField = new TextField(20);
      textField.setBackground(Color.lightGray);
      //Registra il TextField in modo che sia ascoltato 
      //da una istanza della classe
      //AscoltaTextField
      textField.addKeyListener(new AscoltaTextField(appletVisualizza));
      p.add(textField);

      return p;
   }
}

La classe AscoltaTextField

La classe AscoltaTextField

import java.awt.event.*;

/**
   La classe che ascolta gli eventi del textfield. E' un adapter
   dell'interfaccia KeyListener. E' stato overridato solo il
   metodo che intercetta l'evento del tasto premuto. 
*/
class AscoltaTextField extends KeyAdapter
{
   /** L'applet che contiene la TextArea da aggiornare */
   private VisualizzazioneTesto appletVisualizza;

   /**
      Inizializza l'ascoltatore con l'applet che contine la TextArea
      da aggiornare
      @param secondaApplet L'applet che contiene la TextArea
   */
   public AscoltaTextField(VisualizzazioneTesto secondaApplet)
   {
      appletVisualizza = secondaApplet;
   }

   /**
      Eseguo l'override del metodo che viene chiamato quando
      viene gigitato un carattere. Il metodo richiama 
      l'opportuno del secondo applet per far visualizzare sulla 
      TextArea il nuovo carattere digitato.
   */
   public void keyTyped(KeyEvent e) 
   { 
      //Il carattere immesso
      char c = e.getKeyChar();
      if(appletVisualizza != null)
         appletVisualizza.setTesto(""+c);
   }
}
 

Codice html
<HTML>
<HEAD>
<Title>
Comunicazione fra Applet sulla stessa Pagina
</Title>
</HEAD>

<BODY BGCOLOR="#6699CC">
<H4> 

Applet che aggiorna la propria TextArea sulla base del testo inserito
nel TextField del secondo Applet 
</H4>
<CENTER>
<APPLET code = "VisualizzazioneTesto.class" Width = 300 Height = 100 
NAME = "Visualizza">
</APPLET>
</CENTER>
<H4>
Applet che permette di immettere il testo da inserire nella TextArea del 
primo Applet 
</H4>
<CENTER>
<APPLET code = "ImmissioneTesto.class" Width = 300 Height = 100>
</APPLET>
</CENTER>
</BODY>
</HTML>

 
 

Commenti finali

Come si è potuto constatare, fare comunicare più Applet residenti sulla stessa pagina è un meccanismo molto semplice da realizzare ed è supportato da tutti i Browser. E' importante comunque adottare un piccolo accorgimento sull'ordine in cui si inseriscono gli Applet all'interno del file HTML se la ricerca degli Applet viene effettuata nel metodo init(): vanno sempre inseriti prima gli Applet che devono registrarsi tramite NAME e quindi le Applet che voglio poter interagire con questi. La procedura per far comunicare gli Applet fra loro si complica se gli Applet sono residenti su pagine diverse ed è quello che viene affrontato nell'articolo "Comunicazione tra Applet residenti su Frame diversi" sempre sulla rubrica MokaCode.
 
 

Modalità di esecuzione

  1. Salvare i tre sorgenti dando loro il nome che è stato dato alle rispettive classi e salvare il file in formato html per eseguire l'applet
  2. Compilare i 3 file sorgente (javac *.java)
  3. Eseguire l'applet tramite un qualsiasi browser eseguendo un doppio click sul file che è stato salvato in formato html.

 
 

MokaByte rivista web su Java

MokaByte ricerca nuovi collaboratori
Chi volesse mettersi in contatto con noi può farlo scrivendo a mokainfo@mokabyte.it