Home   |   Archivio   |   Chi siamo   |   Contatti
Daniela Micucci
Le Swing in pratica
III parte: i Layout manager
di
Daniela Micucci
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
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
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
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
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:

getContentPane().setLayout(new FlowLayout());
getContentPane().add(new JButton("1"));
getContentPane().add(new JButton("due"));
getContentPane().add(new JLabel("Label"));
getContentPane().add(new JTextField("TextField"));
getContentPane().add(new JButton("Premi per uscire"));
getContentPane().add(new JComboBox());

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)

Gli allineamenti possibili sono:

FlowLayout.CENTER
FlowLayout.LEFT
FlowLayout.RIGHT

BorderLayout

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:

add(Component componente, Object zona)

in cui la zona può essere identificata con:

BorderLayout.NORTH
BorderLayout.SOUTH
BorderLayout.EAST
BorderLayout.WEST
BorderLayout.CENTER

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
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
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