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