Come realizzare interfacce grafiche belle ed accattivanti? La risposta è: avere un po' di gusto e conoscere la modalità con cui le classi Java gestiscono le componenti all'interno dei container. In questo articolo si cominciano ad analizzare i cosiddetti layout manager.
Introduzione
Qualsiasi componente grafico si voglia visualizzare, da un bottone fino ad una label con immagine, deve essere inserito all'interno di un contenitore. Non può esistere un componente isolato.
Una volta inseriti i componenti all'interno di un contenitore, il layout manager associato al contenitore provvede a determinare dimensione e posizione dei componenti secondo le proprie regole. Il contenitore delega quindi al proprio layout manager il compito di posizionare e dimensionare i componenti. Se ci si limita a creare una finestra e ad aggiungervi un'area di testo, accontentandosi del risultato mostrato nella figura 1, non occorre nemmeno preoccuparsi dell'esistenza dei layout manager.
Figura 1 - JFrame con LayoutManager di default
Se però si devono costruire interfacce un po' più complesse come quella mostrata in figura 2, allora bisogna familiarizzare con i layout manager messi a disposizione da Java.
Figura 2 - Un'interfaccia grafica un po' più complessa
Prima di analizzare i vari layout manager, occorre soffermarsi sulla modalità di inserimento di un componente all'interno del proprio contenitore. La classe Container, superclasse di tutti i contenitori, pubblica un metodo chiamato add per adempiere a questo compito. La sintassi completa è add(Component).
Per esempio, l'aggiunta di un bottone ad un pannello si ottiene scrivendo:
panel.add(button)
Il metodo add è overloaded, tanto che nella versione 1.2.2 ne esistono ben cinque varianti. È il layout manager associato al container che obbliga ad usare una versione piuttosto che un'altra. Infine, se il layout manager di un Container non soddisfa le esigenze, è sempre possibile cambiarlo grazie al metodo setLayout(LayoutManager), anch'esso appartenente alla classe Container.
I LayoutManager in Java
Esistono sei layout manager: FlowLayout, BorderLayout, GridLayout, BoxLayout dalla versione 1.2, CardLayout e GridBagLayout. In questo articolo vengono analizzati i primi due.
FlowLayout
È il layout manager più semplice: si limita a posizionare le componenti su di una riga, una di seguito all'altra, nell'ordine in cui sono aggiunte al contenitore e dimensionate alla loro preferred size.
Figura 3 - JFrame con FlowLayout: le componenti sono posizionate su di un'unica riga
Se lo spazio orizzontale non è sufficiente a contenere tutte le componenti in un'unica riga, quelle residue vengono posizionate nella riga successiva.
Figura 4 - JFrame con FlowLayout: le componenti sono posizionate su più righe
Il sorgente che realizza parte dell'interfaccia grafica mostrata nelle figure è il seguente, tenuto conto che la classe contenente le istruzioni è una specializzazione di JFrame:
Con l'istruzione setLayout(new FlowLayout()) viene modificato il layout manager del JFrame e l'aggiunta delle componenti alla finestra è realizzata mediante add. Entrambe le istruzioni vengono eseguite sul ContentPane del JFrame e non direttamente sul JFrame, come accadeva con le AWT.
Nelle figure si nota che le componenti sono allineate a partire dal centro delle righe e che lo spazio tra i componenti è contenuto. È però possibile modificare queste impostazioni utilizzando altri costruttori della classe FlowLayout:
public FlowLayout()
public FlowLayout(int allineamento)
public FlowLayout(int allineamento, int gapOrizzontale, int gapVerticale)
Se un Container ha associato un BorderLayout, è possibile inserire solo fino a cinque componenti. Ciò è dovuto al fatto che BorderLayout divide l'area del container in cinque zone ben distinte: North, South, East, West e Center.
Per poter inserire una componente è necessario specificare in quale area posizionarla. Il metodo add che accetta in ingresso solo il componente non basta più; occorre usare quello che specifica anche la posizione:
add(String zona, Component componente)
I valori possibili per zona sono North, South, East, West e Center. Dalla versione 1.2 di Java è stato introdotto anche:
Occorre ricordare che l'aggiunta di due o più componenti nella stessa zona fa sì che venga visualizzata solo l'ultima aggiunta, mentre le altre restano nascoste.
Se si utilizza il metodo add standard che accetta in ingresso solo la componente in un container a cui è associato un BorderLayout, tale componente viene posizionata al centro:
add(new Button("ok"))
è equivalente sia a:
add("Center", new Button("ok"))
sia a:
add(new Button("ok"), BorderLayout.CENTER)
Un'altra forte differenza con il FlowLayout è che BorderLayout ignora la preferred size delle componenti, assegnando loro una dimensione determinata dallo spazio disponibile nella zona in cui sono localizzate.
Figura 5 - JFrame con BorderLayout e componenti in ogni zona
Se la finestra viene ridimensionata, anche le componenti vengono ridimensionate in modo da adattarsi al nuovo spazio disponibile. La zona centrale è quella privilegiata: se alcune zone non contengono componenti, quella centrale le occupa con la propria componente.
Figura 6 - JFrame con BorderLayout e componenti solo a nord e al centro
Come per FlowLayout, anche per BorderLayout è possibile specificare lo spazio in pixel da lasciare tra una componente e quella adiacente scegliendo fra:
public BorderLayout()
public BorderLayout(int gapOrizzontale, int gapVerticale)
Nel primo caso il gap è quello di default, nel secondo è specificato esplicitamente dai valori passati come argomento.
Conclusione
Per questo articolo l'autrice si ferma qui. Nel successivo verranno proposti altri layout manager, mentre la realizzazione completa dell'interfaccia mostrata nella figura iniziale sarà oggetto di un'ulteriore puntata.
MokaByte®
è un marchio registrato da MokaByte s.r.l.
Java®, Jini® e tutti i nomi derivati sono marchi
registrati da Sun Microsystems.
Tutti i diritti riservati. E' vietata la riproduzione
anche parziale.
Per comunicazioni inviare una mail a info@mokabyte.it