Introduzione

In questo terzo appuntamento vedremo come costruire le finestre e aggiungerne dei controlli. Introdurremo inoltre la gestione degli eventi da parte delle IFC. Prima di farlo pero' introdurremo i concetti di "gerarchia delle viste",di "vista radice" e descriveremo le relazioni tra i componenti, perche' ci serviranno per capire alcuni aspetti della gestione delle finestre.

La gerarchia delle viste

In generale una applicazione IFC ha una gerarchia delle viste che specifica le relazioni tra i vari componenti dell'interfaccia utente e visto che tutti i componenti sono discendenti da view ogni componente ha una sua posizione all'interno di questa gerarchia. La gerarchia delle viste e' posseduta da un view quindi significa che ogni componente derivato da esso ha la capacita' di "possedere" altri oggetti. La posizione di un'oggetto nella gerarchia delle viste dipende dalla sua superview cioe' dalla vista che lo possiede che prende il nome di antenato (ancestor), l'antenato principale, cioe' quello che possiede tutta la gerarchia delle viste dell'applicazione, e' chiamato vista radice (rootview). Per aggiungere un oggetto alla gerarchia delle viste di una generica view si deve utilizzare il metodo addSubview, questo vale per tutti i componenti ad eccezione delle InternalWindow (vedremo piu' avanti come ci si comporta in questo caso).

La vista radice

Ogni applicazione IFC si appoggia sempre su una vista che e' la progenitrice di tutte quelle create successivamente, questa vista, come abbiamo detto prima, e' chiamata vista radice ed e' identificata dalla classe RootView. Per accedere alla vista radice bisogna utilizzare il metodo mainRootView()dell'oggetto Application, che restituisce un instanza della RootView. Alla vista radice e' possibile cambiare il colore con il metodo setColor() oppure e' possibile utilizzare un'immagine GIF come sfondo potendo decidere anche come "distribuirla" su tutta la superfice, rispettivamente attraverso i metodi setImage() e setImageDisplayStyle().

I diversi tipi di finestre

Nelle IFC abbiamo a che fare con due tipi differenti di finestre, chiamate rispettivamente ExternalWindow e InternalWindow. Le ExternalWindow sono quelle finestre che mantengono l'aspetto del S.O. su cui sta girando l'applicazione, mentre le InternalWindow possono esistere solo all'interno di una ExternalWindow o di un'applet ed hanno lo stesso aspetto su tutte le piattaforme. Attraverso l'uso delle ExternalWindow e delle InternalWindow si posso realizzare applicazioni del tipo MDI (familiari agli viluppatori Windows).

Le Internal Window

Le InternalWindow sono sottoclassi di View, questo perche' sono costruite completamente da zero senza fare affidamento al S.O. sottostante, pero' a differenza dei componenti non vengono aggiunte chiamando il metodo addSubView della vista radice ma chiamando il metodo show della finestra stessa. Le InternalWindow sono sempre sottoviste della vista principale (sia che essa appartenga ad un Applet o ad una ExternalWindow), per creare, e visualizzare, una InternalWindow basta utilizzare le seguenti righe di codice (in questo caso nel costruttore si deve specificare dove posizionare la finestra, rispetto alla vista radice, e la dimensione x e y):

//

Crea la finestra e la visualizza

InternalWindow

finestraInterna = new

InternalWindow(0,0,80,80);

finestraInterna.show();

Tutte le InternalWindow possono essere posizionate su differenti piani, in modo che sia possibile, ad esempio, creare barre fluttuanti che non possano essere "nascoste" da altre finestre. Per questo sono disponibili quattro differenti piani, i valori di queste costanti non sono consecutivi, in questo modo e' possibile, ad esempio, posizionare una finestra sul layer DEFAULTLAYER+1 in modo che non possa essere oscurata da nessuna finestra messa sul piano DEFAULTLAYER ma senza utilizzare il PALETTE_LAYER. I quattro tipi di piani sono:

  • DEFAULT_LAYER
  • PALETTE_LAYER
  • POPUP_LAYER
  • DRAG_LAYER

per cambiare il piano dove viene posizionata una InternalWindow basta indicarlo col metodo setLayer:

finestraInterna.setLayer(InternalWindow.PALETTE_LAYER);

Le External Window

Le ExternalWindow sono anche chiamate "finestre native", perche', benche' siano generate attraverso chiamate alle IFC, e' in realta' il sistema a finestre delle piattaforma su cui gira l'applicazione a crearle e controllarle, questo significa che se l'applicazione gira su Windows 95, verra' creata una finestra standard Windows, se gira su Macintosh verra' creata una finestra standard Mac e cosi' via per tutte le altre piattaforme. Per creare e visualizzare una ExternalWindow basta usare le seguenti righe:

// Crea la finestra e la visualizza

ExternalWindow finestra = new ExternalWindow();

finestra.show();

A differenza delle InternalWindow, le ExternalWindow hanno una propria vista radice e una propria gerarchia delle viste possedute. Questo significa che se l'ExternalWindow e' creata da una applicazione Java ci sara' una sola vista radice mentre se e' creata da un'applet ci saranno due viste radici (perche' nell' applet viene creata di default una vista radice).

Aggiungiamo dei componenti

Abbiamo detto che per aggiungere dei componenti basta utilizzare il metodo addSubview(), la procedura consigliata per operare e' quella di creare il componente, impostarne tutte le proprieta' e alla fine aggiungerlo alla vista voluta, per esempio per aggiungere un pulsante ad una generica vista basta utilizzare il codice:

pulsante

= new Button(10,10,40,20);

pulsante.setTitle("Ok");

addSubview(pulsante);

Conclusione

Siamo giunti alla fine di questo articolo, la prossima volta vedremo come interagire con i componenti spiegando la gestione degli eventi da parte delle IFC.