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
-
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
-
Compilare i 3 file
sorgente (javac *.java)
-
Eseguire l'applet
tramite un qualsiasi browser eseguendo un doppio click sul file che è
stato salvato in formato html.
|