La genesi di una applet Java

Eccoci al secondo appuntamento con la programmazione Java.
La volta scorsa abbiamo compilato le nostre prime applicazioni in modo testo: questa volta creeremo una applet "attaccata" ad una pagina HTML, sfruttando le caratteristiche più peculiari del Java e delle sue classi standard.
Ma prima dobbiamo vedere un'ultima applicazione che gestisce i files, dato che con le applet non potremo più gestirli, almeno sul nostro Hard Disk, per le restrizioni di sicurezza.


Una scorsa alla gestione dei files.

Nel precedente articolo abbiamo visto come incanalare il flusso di dati immessi da tastiera in un DataInputStream. Questa volta dovremo incanalare un flusso di dati provenienti da un file, e per questo esistono le classi FileInputStream e FileOutputStream, che richiedono semplicemente il nome del file tra virgolette come parametro. Supponiamo di voler creare una copia di backup di un file, in modo da vedere sia la lettura che la scrittura. Per semplicità creeremo una copia del listato, il cui suffisso sia .bak anzichè .java.
Ci basta sapere che col metodo available() otteniamo la lunghezza del file in bytes, mentre con read() e write() leggiamo e scriviamo rispettivamente un byte. A questo punto basterà un loop for() che copi tutto il file, byte per byte:

for(int i=0; i < lunghezza; i++) {
fileoutput.write(fileinput.read()); // copio un byte.
}

Non dobbiamo dimenticarci infine che quando si usano metodi che generano Input e Output bisogna salvaguardarsi da eventuali eccezioni I/O, tramite il try {} catch {}, visto la volta scorsa.
Vi rimando ai commenti del listato 1 per maggiori informazioni, e vi consiglio di modificalo rendendolo un programma di copia generica, dove si possa mettere il nome dei file sorgente e destinazione nella linea comandi, tramite args[], come spiegato nell'articolo precedente.


Differenza tra applet e applicazioni.

Abbiamo già detto (e verificato) che le applicazioni sono programmi eseguibili solo da shell DOS, e hanno la caratteristica di contenere il metodo main():

public static void main(String args[]) { ... }

Le applet, invece, possono essere eseguite solo dai browser, caricando un HTML in cui siano presenti dei tag < APPLET >.
Le applet hanno la caratteristica di "estendere" la classe Applet, ossia di esserne "figlie" derivate per ereditarietà, ad esempio:

import java.applet.*; // Include le classi per le applet.

public class PrimaApplet extends Applet { ... }

Da notare che la classe deve essere dichiarata public.
Il metodo main() non serve, a meno che non si voglia fare qualcosa che sia eseguibile sia come applet che come applicazione, ma ciò richiederebbe anche altre considerazioni.
Vediamo ora i metodi standard delle applet. Il primo ad essere eseguito è init(), che (come si deduce dal nome) contiene il codice di inizializzazione, eseguito una sola volta subito dopo il caricamento.
Un altro metodo "particolare" e' il paint(), che si occupa di cio' che viene disegnato nell'Applet:

public void paint(Graphics g) { ... }

Al paint() viene passato automaticamente un parametro "g" di tipo Graphics, che e' l'area dell'applet su cui disegneremo con i metodi della classe Graphics, ad esempio drawString(), che e' simile a println(), ma per contesti grafici. Il paint() viene eseguito dopo l'init(), ma anche tutte le volte che l'area dell'applet viene spostata, coperta con un'altra finestra e poi riscoperta, ossia quando occorre ridisegnarla. Nel caso in cui si voglia animare qualcosa, si deve chiamare il metodo repaint() ogni volta che si deve ridisegnare il nuovo fotogramma: ciò causerà una chiamata del paint().


Creazione del file .class dell'applet.

A questo punto abbiamo gli strumenti necessari per fare una semplice applet che scriva qualcosa col metodo drawString().
I parametri da passare a questo metodo sono il testo, racchiuso tra virgolette, e le coordinate x,y dove disegnare, che si riferiscono alla posizione dell'angolo in basso a sinistra del testo.
Potete vedere nel listato 2 un esempio. Per compilarlo usate il javac come abbiamo visto la volta scorsa:

javac PrimaApplet.java

E otterrete il flamigerato PrimaApplet.class.


Creazione dell'HTML per l'applet.

La classe dovra' essere "attaccata" ad una pagina html, nella quale inseriremo il tag < APPLET > opportunamente riferito al nostro .class:

< APPLET CODE ="PrimaApplet.class" WIDTH=200 HEIGHT=200>
Purtroppo il tuo browser non può eseguire applet Java...
< / APPLET >

Gli attributi che ci interessano sono CODE, dove si specifica il nome del file .class, e i parametri WIDTH e HEIGHT, che funzionano analogamente ai tag per le immagini.
Se il .class non e' nella stessa directory dell'html, occorre specificare il path usando il tag CODEBASE.
Il testo tra < APPLET > e < / APPLET > viene visualizzato solo dai browser che non supportano il Java.
A questo punto, avendo un html come il listato 3, possiamo provare l'applet caricando l'html con appletviewer o con un browser (soluzione migliore, dato che l'appletviewer visualizza solo l'applet, trascurando il resto della pagina).


Rendiamo l'applet parametrica.

L'applet precedente non è configurabile, per cui se si vuole che scriva altre cose occorre cambiare il listato e ricompilare.
Una applet che si rispetti deve accettare dei parametri dall'HTML, e questo è molto facile da implementare: dal lato HTML, inventiamoci un parametro "qualetesto" in cui specificare il testo da stampare:

< APPLET CODE ="PrimaApplet.class" WIDTH=200 HEIGHT=200>
< PARAM NAME=qualetesto VALUE="Salve, sono parametrica!">
Purtroppo il tuo browser non può eseguire applet Java...
< / APPLET>

Possiamo inventarci un numero qualsiasi di parametri, basta seguire la sintassi del tag < PARAM > con gli attributi NAME e VALUE, e naturalmente leggerli dall'init() dell'applet con il metodo getParameter():

testo1 = getParameter("qualetesto");

Come si vede occorre passare al metodo il nome del parametro, e come risposta ci da il suo VALUE, in questo caso salvato nella stringa testo1, che supponiamo di aver dichiarato precedentemente.


Rendiamo l'applet interattiva.

Se l'applet non intrattiene con effetti speciali o con la stampa di dati interessanti, deve perlomeno essere interattiva, per avere una qualche rilevanza nella pagina. Il rapporto con l'esterno si può tenere grazie agli "eventi", che possono essere la pressione di un tasto, il movimento del mouse, o altro.
Vediamone tre riguardanti il mouse: quando un tasto e' premuto viene attivato mouseDown(), quando è rilasciato è il turno di mouseUp(). Infine, ogni volta che il roditore sintetico è spostato sul tappetino, si ha o una chiamata a mouseDrag(), nel caso il bottone sia premuto, altrimenti a mouseMove(). A questi metodi sono passate automaticamente le nuove cooordinate:

public boolean mouseDrag(Event e, int x, int y) { ... }

In questi metodi, e in quelli di Graphics, le variabili x ed y si riferiscono alla posizione del mouse nel momento della chiamata (oppure dell'oggetto da disegnare) rispetto all'angolo in alto a sinistra dell'applet (che e' il punto 0,0). Fate attenzione ad un paio di cose: la prima è che l'angolo 0,0 è quello dell'applet, e non dello schermo, la seconda è che la X aumenta andando verso destra, mentre la Y andando verso il basso.
Proponiamoci di fare una applet in cui il mouse sia "seguito" da alcune linee, e nel caso sia premuto anche il bottone, allora sia stampato pure il testo letto dal parametro nell'HTML.
Ci manca solo di sapere come disegnare le linee. Il metodo da usare e' drawLine(x1,y1, x2,y2), che disegna una linea dal punto x1,y1 al punto x2,y2. Per finire, possiamo dare un tocco di colore al tutto, utilizzando il metodo setColor(), a cui dobbiamo passare il colore con cui scrivere. Sono disponibili alcuni colori predefiniti, come il nero, il bianco, il rosso, il verde e così via, e si indicano con Color.white, Color.black, Color.red eccetera.

Potete vedere l'applet finale nel Listato 4 e il relativo HTML nel Listato 5, basta compilare il .java e leggere l'HTML da Netscape, Explorer o appletviewer.

Fabio Ciucci
fabioc@anfiteatro.it


Scarica il listato 1: backup.java

Scarica il listato 2: PrimaApplet.java

Scarica il listato 3: salve.html che esegue PrimaApplet.class

Scarica il listato 4: Interazione.java

Scarica il listato 5: interazione.html che esegue Interazione.class


Torna all' indice degli articoli