Corso di programmazione Java (C) by Fabio Ciucci
PARTE 2: LA CLASSE GRAPHICS, LE APPLET E L'AWT
Fino ad ora abbiamo visto la logica di funzionamento e la sintassi del
linguaggio Java, in altre parole si e' imparato a parlare questo linguaggio
come lo parla un bambino: correttamente, ma senza conoscere le parole
piu' raffinate e ricercate. Un bambino non conosce il significato di parole
come dermatologia, perpendicolare, sinergico; d'altronde e' in grado di
intendere tutte le frasi contenenti le poche parole che conosce.
In java con le conoscenze della scorsa lezione si riesce a fare una qualsiasi
applicazione in modo testo che legga dati, li elabori e dia un output.
Pero' se si volesse disegnare un rettangolo rosso, o una interfaccia utente
con dei bottoni, magari utilizzabile anche in una pagina web, incontreremmo
le sconosciute parole "dermatologia, perpendicolare, sinergico".
Ebbene, la cosa piu' importante e' quella di aver compreso la logica di
base del Java, il resto e' solo un progressivo imparare nuovi metodi per
fare le cose piu' disparate
In questa lezione vedremo i concetti basilari di Applet, Graphics e AWT,
ma non sara' una trattazione approfondita. L'importante per ora e' avere
una visione chiara e globale del sistema grafico e interattivo di java.
In lezioni future ogni singolo aspetto sara' approfondito, ma e' inutile
approfondire qualcosa prima di conoscere a grandi linee awt, graphics e
applet.
--------------------------------------------------------------------------
APPLET
--------------------------------------------------------------------------
Come gia' detto in precedenza, le applicazioni sono programmi autonomi
eseguibili con "java.exe" o comunque con l'interprete java disponibile
sul proprio sistema, mentre le Applet sono programmi che devono essere
eseguiti in una pagina html da un browser web Java enabled.
Per ora abbiamo visto solo applicazioni, distinguibili per la presenza
del metodo main(), (o meglio per l'assenza di "extends Applet"), che
NON possono essere attaccate ad una pagina web.
Allo stesso modo, una Applet (distinguibile per il fatto che la classe
principale estende la classe Applet, ovvero e' una sua figlia-derivata),
non puo' essere eseguita fuori dal web browser.
E' possibile pero' fare un'applet che sia anche una applicazione, basta
che sia presente il main() e che contemporaneamente la classe sia derivata
da Applet: in tal caso avremo una classe "attaccabile" ad una pagina web
html ed eseguibile eventualmente anche come applicazione autonoma.
Per scopi didattici, e per una mia preferenza, faremo quest'ultimo tipo
di programmi java, "omnieseguibili".
Ma allora, direte voi, il comportamento dei programmi e' sempre uguale,
sia che siano eseguiti come applet che come applicazioni?
Naturalmente no, altrimenti non sarebbe stata necessaria questa separazione.
Le applet, essendo distribuite sulle pagine web di internet, sono molto
pericolose, perche' scaricate ed eseguite su milioni di computer senza
poterle controllare. Di conseguenza la Sun ha cercato di disabilitare
tutte quelle funzionalita' adatte alla creazione di virus o "trojan", ossia
applicazioni che "sembra" facciano una cosa, ma invece quando eseguite nel
nostro computer fanno danni (da qui l'attinenza con il cavallo di troia).
Le cose piu' importanti che le applet NON possono fare sono:
1) Leggere e soprattutto SCRIVERE nel computer dell'utente, a meno che
quest'ultimo non specifichi (poco prudentemente) delle directory in
cui le applet possono accedere. Comunque i browser normalmente non
concedono l'accesso a nessuna directory e non si puo' sperare che
gli utenti l'abbiamo abilitato. Tra le altre cose NON puo' eseguire
programmi sul computer degli utenti (ad esempio far partire il comando
"format C:" o "delete *.*", cosa poco educata).
2) Comunicare con server diversi da quello in cui e' stata scaricata
l'applet stessa: con le funzioni di rete e' possibile stabilire
un contatto tra un'applet ed il server su cui e' stata scaricata,
per scambiare dati, ma non con altri server nella rete.
Se l'applet e' in una pagina di www.baubau.com, essa non potra'
comunicare con altri server.
Quindi un virus come Applet non potrebbe fare danni, mentre come applicazione
avrebbe possibilita' di rovinarci l'esistenza.
In questa lezione opereremo soltanto nel campo delle interfacce grafiche,
quindi non ci saranno differenze tra esecuzione come applet o appliczioni.
Vediamo quindi come "applettizzare" una applicazione.
Innanzitutto occorre fare in modo che la classe principale sia una figlia
derivata da Applet:
import java.applet.Applet // Importo Applet
public class miaClasse extends Applet { // Questa e' un'applet
...
}
A questo punto si possono definire dei metodi fondamentali dell'applet:
public void init() { ... } // Metodo in cui si definiscono le operazioni
// da eseguire come inizializzazione quando
// un applet viene caricato.
public void start() { ... } // Avvio (o riavvio) dell'applet
public void stop() { ... } // Arresto dell'applet
Quando un'applet viene attivata viene eseguito init(), poi start(), che
pero' puo' essere richiamato ogni volta che l'applet "riparte" dopo una
qualche pausa (se per esempio si era chiamato stop o si era visualizzata
un'altra pagina, poi si torna indietro).
Le istruzioni presenti in start() e stop() dunque sono eseguite quando la
pagina html contenente l'applet e' attivata o disattivata. Vedremo che sono
metodi molto usati per la gestione dei thread, infatti quando un'applet
che esegue continuamente istruzioni (come un'animazione) non e' piu'
visibile, perche' l'utente e' passato ad un'altra pagina, occorre fermare
le operazioni, divenute inutili: cio' si fa scrivendo le routine di
"ferma tutto" nel metodo stop(). Naturalmente se l'utente torna indietro col
browser e l'applet torna visibile, viene rieseguito start(), in cui
risiederanno le routine di riabilitazione complementari a stop().
Se non si devono eseguire particolari istruzioni all'inizializzazione
e all'avvio(start)/disattivazione(stop), questi metodi si possono omettere.
Un altro metodo "particolare" e' il paint(), che fa parte della classe
Graphics, la quale si occupa di cio' che viene disegnato nell'Applet:
import java.awt.Graphics; // Occorre importare la classe Graphics
public void paint(Graphics g) { ... }
Come si vede al paint() viene passato un parametro "g" di tipo Graphics,
che non e' altro che l'area dell'applet su cui disegneremo tramite
i metodi della classe Graphics (che trattiamo piu' avanti in questa lezione).
Il paint() viene eseguito all'inizio, ma anche tutte le volte che l'area
dell'applet viene spostata, coperta con un'altra finestra e poi riscoperta,
eccetera, ossia quando occorre ridisegnarla, tutta o in parte.
Giusto per testare la nostra applet, introduciamo il metodo drawString()
della classe Graphics, che serve a stampare stringhe di testo (tipo il
println, ma per aree grafiche). L'applet e' questa:
import java.applet.*;
import java.awt.*;
public class MiaApplet1 extends Applet {
public void paint(Graphics g) { // l'oggetto g e' l'area dell'applet
// Ora abbiamo l'oggetto g di tipo Graphics che e' l'area dell'applet, su
// cui possiamo scrivere, tramite il metodo drawString(), ad esempio:
g.drawString("Salute a tutti.", 50, 50); // Stampa in x=50, y=50
}
} // Fine classe MiaApplet1
Una volta compilato questo sorgente abbiamo la classe, che pero' dovra'
essere attaccata ad una pagina html, mettendo un riferimento all'applet.
Da notare la mancanza del metodo main(), per cui non si puo' eseguire come
applicazione, otterremmo solo un messaggio di errore.
Qua si suppone che si conosca almeno la struttura minima di una pagina html.
In una pagina html per far riferimento ad un'applet esiste un tag apposito,
che funziona analogamente agli altri tag per caricare immagini:
Come si vede, dentro