Layout manager in Java

In questo semplice articolo andremo alla scoperta di alcuni tra i più utilizzati gestori di layout per applicazione desktop

Un gestore di layout (layout manager) è un oggetto il cui compito è quello di posizionare dei componenti all’interno di un contenitore. Questi componenti possono essere indifferentemente bottoni, etichette, tabelle, caselle di scelta ecc. e perchè no, altri contenitori.

Esistono diversi tipi di layout manager già pronti all’uso e, volendo, è possibile crearne di nuovi. Ogni gestore posiziona i componenti in maniera diversa e, per ottenere interfacce d’impatto, sarà necessario annidare spesso i contenitori, usando magari layout manager diversi: in questo modo si possono realizzare GUI particolarmente raffinate, complesse e piacevoli da vedere.

Le classi dei layout manager si trovano principalmente nel package java.awt ma sono utilizzabili anche con Swing. Volendo, un layout manager particolarmente utile si trova anche in javax.swing. I layout manager di cui parlerò in questo articolo sono:

  1. FlowLayout
  2. BorderLayout
  3. GridLayout
  4. BoxLayout
  5. CardLayout
  6. GridBagLayout

 

Come usare un layout manager

Usare un layout manager è molto semplice: dopo averlo istanziato (con l’operatore new) basta far chiamare al contenitore il metodo setLayout, passandogli l’oggetto appena creato.

Alcuni contenitori che possiamo utilizzare sono:

  • java.awt.Panel
  • javax.swing.JPanel
  • java.awt.Frame
  • java.awt.Container (ottenibile chiamando il metodo getContentPane su un JFrame)

 

Per conoscere lo spazio occupato dai singoli componenti, i layout manager useranno le loro preferred size (attraverso getPreferredSize), impostabili col metodo setPreferredSize:

Attenzione! non tutti i layout manager rispetteranno le dimensioni che darete ai componenti!!

 

java.awt.FlowLayout

Il layout manager più semplice da utilizzare è il FlowLayout. Il funzionamento è semplice: i componenti vengono visualizzati da sinistra a destra e dall’alto al basso man mano che vengono aggiungi al contenitore (attraverso il metodo add). I nuovi componenti vengono visualizzati tutti sulla stessa riga finchè c’è posto, per poi andare a capo.

Ogni riga ha una propria altezza (data dall’altezza del componente più alto della riga) indipendente dall’altezza delle righe successive. Inoltre, cosa molto importante, vengono rispettate le preferred size dei componenti che vengono inseriti. Dispone di tre costruttori:

Il primo costruttore crea un FlowLayout di default: i componenti vengono messi al centro del contenitore e distanziati tra di loro da 5 pixel (sia orizzontalmente che verticalmente). Il secondo costruttore invece crea un FlowLayout con l’allineamento indicato. L’allineamento può essere una delle seguenti costanti:

La distanza orizzontale e verticale è sempre di 5 pixel. L’ultimo costruttore invece permette al programmatore di scegliere allineamento e spaziatura orizzontale e verticale. Ecco un semplice esempio:

FlowLayout

FlowLayout

 

java.awt.BorderLayout

Uno dei layout manager più utilizzati è il BorderLayout. E’ anche il gestore predefinito, nel caso ci dimenticassimo di impostarne uno. Questo layout manager divide il contenitore in cinque diverse aree che sono: nord, sud, est, ovest e centro. Per questo motivo, quando si va ad inserire un oggetto, occorrerà anche indicare la posizione di questo, utilizzando una versione sovraccaricata del metodo add:

N.B.: se si chiama add senza passare una posizione, il nuovo componente verrà inserito al centro.

Il difetto di questo layout manager è che possiamo inserire solo 5 componenti: tentando di inserire due oggetti nella stessa area, sarà visibile solo l’ultimo oggetto inserito. Dispone di due soli costruttori

Il primo costruttore crea un border layout senza distanziamento tra gli oggetti inseriti, mentre il secondo utilizza i due argomenti passati come distanza orizzontale e distanza verticale (in pixel) da lasciare tra gli oggetti.

Ovviamente non è obbligatorio riempire tutte e cinque le zone: si può inserire anche un unico oggetto!

In questo caso bisogna tenere a mente alcune cosette: inserendo un oggetto in uno dei quattro punti cardinali, questo occuperà solo lo spazio strettamente necessario alla propria visualizzazione. Se lo stesso componente viene inserito al centro invece, occuperà tutto lo spazio disponibile, anche oltre la propria preferred-size.

N.B.: il BorderLayout in genere non rispetta la preferred-size degli oggetti!

BorderLayout

BorderLayout

 

java.awt.GridLayout

Il GridLayout permette di posizionare i componenti in una griglia. Tutte le celle di tale griglia avranno la stessa larghezza e la stessa altezza (e sono la larghezza e l’altezza della cella con il contenuto più voluminoso). Le preferred-size dei componenti vengono ignorate. Dispone di tre costruttori:

Il primo costruttore posiziona i componenti uno sotto l’altro, in un’unica colonna. Il secondo invece crea una griglia di righe e colonne mentre il terzo permette anche di specificare la distanza orizzontale e verticale da mantenere tra i componenti inseriti.

Questo LayoutManager è utile quando si ha la necessita di mostrare all’utente una grande quantità di pulsanti (ma non solo). In questo modo il pannello contenitore avrà un aspetto più omogeneo, non dovendo occuparci del posizionamento e delle dimensioni dei singoli oggetti.

Nella mia esperienza personale questo layout manager è usato solo in situazioni particolari ma non per questo è meno utile degli altri

GridLayout

GridLayout

 

javax.swing.BoxLayout

Il BoxLayout è un gestore che allinea i componenti in un’unica riga o colonna. A differenza di tutti gli altri layout manager, nel costruttore (l’unico disponibile) ha bisogno di un riferimento al contenitore su cui deve lavorare:

Il secondo argomento del costruttore (axis) indica come posizionare gli oggetti: in riga (BoxLayout.X_AXIS), od in colonna (BoxLayout.Y_AXIS).

BoxLayout

BoxLayout

Il seguente codice ci permette di creare la figura sopra riportata. Ovviamente basta cambiare X_AXIS con Y_AXIS (e le dimensione del JFrame) per ottenere la disposizione lungo l’altro asse.

Questo layout manager è utile per esempio per creare delle toolbar o per mostrare molti oggetti di dimensioni simili. Per evitare che il pannello col BoxLayout diventi troppo grande e superi i bordi dello schermo è conveniente usare un pannello scorrevole:

 

java.awt.CardLayout

Il CardLayout, come suggerisce il nome, gestisce i componenti al suo interno come delle carte, che è possibile gestire attraverso i metodi next e last della classe java.awt.CardLayout. Qui di seguito trovate un semplice esempio

Utilizzando poi i due metodi sopracitati e possibili far “switchare” la vista tra i diversi pannelli che abbiamo inserito

 

java.awt.GridBagLayout

GridBagLayout è uno dei layout più flessibili, che permette di posizionare gli elementi grafici specificando riga e colonna, permettendo inoltre l’utilizzo di più celle ad un solo componente. Nella sua inizializzazione dobbiamo quindi specificare righe e colonne che verranno utilizzate nel layout, utilizzando la classe GridBagConstraints

Il codice che vedete riportato ci permette di definire un GridBagConstraints con due componenti in orizzontale (infatti come vedete viene incremetata la x e non la y).

 

Fare a meno dei layout manager

Se proprio volete (anche se non è l’approccio consigliato), potete fare a meno dei layout manager: basta chiamare setLayout passando come layout manager… null! D’ora in poi, per dire dove inserire un oggetto in un contenitore dovrete usare il metodo setBounds, la cui firma è la seguente:

Per esempio:

 

Link

Tutorial SUN sui layout
Tutorial SUN che mostra i vari layout
Uso efficace dei Layout Managers
Creare un Layout Manager in Java
Contenitori e Gestione dei Layout
Collezione di Layout Manager
Gestione di Spring Layout

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *