You are on page 1of 10

Gestori di layout

Un gestore di layout è una classe che stabilisce in quale modo i componenti devono essere disposti, quando vengono aggiunti ad un contenitore. Le istanze delle classi JFrame e JPanel sono create rispettivamente con i seguenti gestori di layout predefiniti: • BorderLayout; • FlowLayout. BorderLayout e FlowLayout sono sottoclassi dirette della superclasse cosmica Object e appartengono al package java.awt.

Object

BorderLayout

Flow out Lay

Layout delle finestre: BorderLayout
Ogni istanza della classe JFrame è suddivisa in cinque aree, denominate NORTH, SOUTH, EAST, WEST, CENTER.

Barra del titolo
NORTH

WEST

CENTER

EAST

SOUTH

Quando si aggiunge un componente (tipicamente un pannello) alla finestra, è possibile indicare in quale delle cinque aree caricarlo. A tal scopo si usa il seguente metodo della classe Container:

public Component add(Component comp, Object vincoli)

Bocchi Cinzia Ultimo aggiornamento: 21/10/2011

1

//crea il frame JFrame aframe = new JFrame(TITOLO).JFrame. • Nota: Quando si crea una istanza della classe JFrame. final int ASCISSA = 100. non è necessario creare esplicitamente un'istanza di BorderLayout poichè ciò avviene automaticamente.add(panel. javax. • public BorderLayout(int hgap.setSize(LARGHEZZA. Esempio L'istruzione contentPane. L'oggetto passato come parametro (vincoli) al metodo add può coincidere con una delle seguenti costanti simboliche della classe BorderLayout: • • • • • public public public public public static static static static static final final final final final String String String String String NORTH SOUTH EAST WEST CENTER All'interno di ogni area è possible aggiungere un solo componente. final int ALTEZZA = 150.NORTH).Container.int vgap) Crea un gestore di layout con gli spazi specificati tra i componenti.awt. Lo spazio orizzontale è denotato da hgap. Bocchi Cinzia Ultimo aggiornamento: 21/10/2011 2 .JPanel. aframe. ALTEZZA). Costruttori della classe BorderLayout public BorderLayout() Crea un gestore di layout senza spazi tra i componenti. final int ORDINATA = 100. final String TITOLO = "Frame con 5 pannelli colorati". aggiunge il pannello panel nell'area NORTH del contenitore contentPane.BorderLayout. java. java.awt.Color. l'area predefinita è CENTER.BorderLayout.swing.swing. public class CreaFrame { public static void main(String[] args) { final int LARGHEZZA= 300.Aggiunge il componente comp alla fine del contenitore secondo i vincoli rappresentati dal parametro vincoli. quello verticale da vgap. Esempio: frame con cinque pannelli colorati import import import import import java.awt. javax. Se non si specifica dove caricare il componente.

contentPane.NORTH). cPanel. JPanel().add(cPanel. BorderLayout. wPanel. //visualizza il frame aframe.setBackground(Color. //aggiunge i pannelli al contentPane Container contentPane = aframe. contentPane. //colora i pannelli nPanel.add(sPanel. contentPane.aframe. JPanel(). aframe. BorderLayout.setBackground(Color.setDefaultCloseOperation(JFrame.CENTER). contentPane.getContentPane().YELLOW). ORDINATA). sPanel.RED). //crea JPanel JPanel JPanel JPanel JPanel i pannelli nPanel = new wPanel = new ePanel = new sPanel = new cPanel = new JPanel().SOUTH).setVisible(true). contentPane. BorderLayout. BorderLayout.setBackground(Color. BorderLayout.setBackground(Color. } } Il frame visualizzato Bocchi Cinzia Ultimo aggiornamento: 21/10/2011 3 .WEST).setLocation(ASCISSA. ePanel.BLUE).setBackground(Color.GREEN).EXIT_ON_CLOSE). JPanel().EAST).add(ePanel. JPanel().add(nPanel.WHITE).add(wPanel.

aframe.JButton. javax.setDefaultCloseOperation(JFrame. − RIGHT (allineamento a destra). I componenti che si trovano su una linea vengono centrati.Container. per default.swing. final int ORDINATA = 100. sono così definite: − − − public static final int LEFT public static final int CENTER public static final int RIGHT Esempio: pannello con 2 pulsanti import import import import java. Costruttori della classe FlowLayout public FlowLayout() Crea un'istanza di FlowLayout con un allineamento centrale per i componenti e uno spazio orizzontale/verticale tra i componenti di 5 unità.swing.Layout dei pannelli: FlowLayout Il gestore di layout FlowLayout consente di inserire i componenti in un contenitore da sinistra verso destra. javax. − CENTER (allineamento centrato . come avviene per le linee di un testo. ORDINATA). • public FlowLayout(int align) Crea un'istanza di FlowLayout con l'allineamento specificato da align per i componenti e uno spazio orizzontale/verticale tra i componenti di 5 unità.awt.setLocation(ASCISSA.EXIT_ON_CLOSE). va a capo. //crea il frame JFrame aframe = new JFrame(TITOLO). ALTEZZA). public class CreaFrame { public static void main(String[] args) { final int LARGHEZZA= 300.JFrame. Il valore di align può essere una delle seguenti costanti di FlowLayout: − LEFT (allineamento a sinistra). aframe. • Le costanti utilizzate per indicare l'allineamento. final int ALTEZZA = 150.JPanel. Bocchi Cinzia Ultimo aggiornamento: 21/10/2011 4 . Quando una linea è piena.il default). • public FlowLayout(int align.setSize(LARGHEZZA.swing.int vgap) Crea un'istanza di FlowLayout con l'allineamento specificato da align per i componenti e uno spazio orizzontale/verticale indicato rispettivamente da hgap e vgap. final String TITOLO = "Frame con pannello e 2 pulsanti". javax.int hgap. aframe. final int ASCISSA = 100.

Viceversa.add(panel). contentPane.//crea il pannello JPanel panel = new JPanel(). Bocchi Cinzia Ultimo aggiornamento: 21/10/2011 5 .add(button2). //aggiunge i pulsanti al pannello panel. • Esempio Per cambiare il gestore di layout di una finestra frame da BorderLayout a FlowLayout.add(button1). è sufficiente scrivere: frame.setLayout(new BorderLayout()). } } Il frame visualizzato Cambiare il gestore di layout predefinito E' possibile modificare il gestore di layout predefinito mediante il metodo setLayout della classe Container: public void setLayout(LayoutManager mgr) Imposta il gestore di layout a mgr. //crea i due pulsanti JButton button1 = new JButton("button1").getContentPane(). //aggiunge il pan nello al contentPane Container contentPane = aframe.setLayout(new FlowLayout()). si scriverà: panel.setVisible(true). panel. //visualizza il frame aframe. JButton button2 = new JButton("button2"). per cambiare il gestore di layout di un pannello panel da FlowLayout a BorderLayout.

button1.getContentPane(). In tal caso occorre: 1. final int ORDINATA = 100.50).swing. javax.setDefaultCloseOperation(JFrame. aframe.setSize(LARGHEZZA.add(button1). utilizzando il metodo setBounds. annullare ogni gestore di layout.50). contentPane. //crea il pannello JPanel panel = new JPanel(). final int ASCISSA = 100. //crea i due pulsanti JButton button1 = new JButton("button1"). ALTEZZA). aframe.setBounds(0.swing. public class CreaFrame { public static void main(String[] args) { final int LARGHEZZA= 300.setVisible(true). javax. final String TITOLO = "Frame con posizionamento assoluto".add(panel). button2. final int ALTEZZA = 150.awt. javax.Container. 2.setLocation(ASCISSA.JPanel. panel.setBounds(100. passando come parametro al metodo setLayout il valore null. //crea il frame JFrame aframe = new JFrame(TITOLO).EXIT_ON_CLOSE). //aggiunge i pulsanti al pannello in posizione assoluta panel.100. Esempio Consideriamo il precedente frame e posizioniamo i pulsanti in modo assoluto. panel. specificare la posizione e la dimensione del componente.Non utilizzare un gestore di layout Talvolta può essere utile o necessario non servirsi di un gestore di layout.add(button2). } } Bocchi Cinzia Ultimo aggiornamento: 21/10/2011 6 . per poter collocare un componente in una posizione "assoluta". ORDINATA). //aggiunge il pan nello al contentPane Container contentPane = aframe. import import import import java.50. aframe. //visualizza il frame aframe.swing.0.100.JButton.JFrame.setLayout(null). JButton button2 = new JButton("button2").

swing. − PAGE_AXIS. − Y_AXIS. La classe è dotata di un unico costruttore: • public BoxLayout(Container target.swing. dispone i componenti nella direzione del flusso delle linee di una pagina. il cui layout manager è BoxLayout e un pannello a sud. − axis è l’asse lungo il quale organizzare i componenti e può assumere come valore una delle seguenti costanti intere: − X_AXIS. java.Il frame visualizzato BoxLayout Il BoxLayout inserisce i componenti in un’unica riga o colonna. int axis) − target è il contenitore a cui si vuole applicare il layout. public class CreaFrame { public static void main(String[] args) { final String TITOLO = "Esempio di BoxLayout".JFrame. dispone i componenti lungo l’asse X da sinistra a destra.Container.swing.BoxLayout. Bocchi Cinzia Ultimo aggiornamento: 21/10/2011 7 . javax. con layout manager di default FlowLayout.awt. dispone i componenti lungo l’asse Y dall’alto verso il basso.awt.swing.JPanel.Component.awt.BorderLayout.JButton. − LINE_AXIS. import import import import import import import java. javax. dispone i componenti nella direzione di una riga di testo. Esempio di BoxLayout Il frame dell’esempio contiene un pannello centrale. javax. javax. java.

long button").CENTER_ALIGNMENT). //crea e aggiunge tre pulsanti al pannello centrale con allineamento centrato JButton button = new JButton("button"). southPanel.add(button). longButton.//crea il frame JFrame aframe = new JFrame(TITOLO).add(okButton).setAlignmentX(Component.CENTER). contentPane. shortButton.add(centerPanel. JButton shortButton = new JButton("short").setDefaultCloseOperation(JFrame.setAlignmentX(Component. BorderLayout. BoxLayout centerPanelLayout = new BoxLayout(centerPanel. BoxLayout. //aggiunge i pannelli al contentPane Container contentPane = aframe.getContentPane().setVisible(true). button. //crea e aggiunge due pulsanti al pannello sud JButton okButton = new JButton("OK").setAlignmentX(Component.setLayout(centerPanelLayout).CENTER_ALIGNMENT). centerPanel. southPanel.add(southPanel.EXIT_ON_CLOSE). aframe.pack().SOUTH). centerPanel. //crea un pannello centrale con gestore di layout predefinito FlowLayout JPanel southPanel = new JPanel().CENTER_ALIGNMENT). JButton longButton = new JButton("long-long . //crea un pannello centrale con gestore di layout BoxLayout JPanel centerPanel = new JPanel(). contentPane.add(longButton). JButton cancelButton = new JButton("Cancel"). BorderLayout.add(shortButton).Y_AXIS). centerPanel. //visualizza il frame aframe.add(cancelButton). } } Il frame visualizzato Bocchi Cinzia Ultimo aggiornamento: 21/10/2011 8 . aframe. centerPanel.

swing. int vgap) Crea una griglia con il numero di righe e colonne specificato e definisce lo spazio orizzontale (hgap) e verticale (vgap) tra le celle. • public GridLayout(int rows. Ogni componente occupa tutto il contenuto della cella in cui si trova. Bocchi Cinzia Ultimo aggiornamento: 21/10/2011 9 .Container. import javax. • public GridLayout(int rows. int hgap.JButton.GridLayout Il GridLayout inserisce i componenti in una griglia le cui celle hanno tutte la stessa dimensione. public class CreaFrame { public static void main(String[] args) { final String TITOLO = "Esempio di GridLayout".awt.awt. import javax.GridLayout. int cols. Le celle della griglia sono indicizzate con una numerazione progressiva che parte da 1 e prosegue da sinistra a destra a partire dall’alto. I costruttori sono tre: • public GridLayout() Crea una griglia con una sola colonna e una sola riga. una griglia di 3 righe e 2 colonne avrà le celle così indicizzate: 1 3 5 2 4 6 I componenti vengono inseriti seguendo l’ordinamento degli indici delle celle.swing. int cols) Crea una griglia con il numero di righe (rows) e colonne (cols) specificato. Esempio di GridLayout import java. Per esempio. import java.JFrame.

scribd.getContentPane(). • SpringLayout.0/ o spedisci una lettera a Creative Commons. 94105. • GroupLayout. //imposta il layout del contentPane a GridLayout Container contentPane = aframe.add(new JButton("2")).setVisible(true).//crea il frame JFrame aframe = new JFrame(TITOLO).setDefaultCloseOperation(JFrame.org/licenses/by-sa/3. aframe.EXIT_ON_CLOSE). } } Il frame visualizzato Altri layout manager Altri gestori di layout più complessi sono: • GridBagLayout.com/javase/tutorial/uiswing/layout/visual. Inoltre. San Francisco. aframe.add(new JButton("3")). anche se il compito non è banale. Maggiori dettagli si possono trovare all’url http://download.com/doc/29332215/Esercizio7-GuiPrenotazioni-Soluzione _______________________________________________________________ Quest'opera è stata rilasciata con licenza Creative Commons Attribution-ShareAlike 3. • CardLayout.2)). Un esempio di layout personalizzato dal nome FormLayout è visibile all’url http://www. //crea i pulsanti e li inserisce nella griglia 2x2 contentPane. contentPane. California. è sempre possibile creare un layout personalizzato. Per leggere una copia della licenza visita il sito web http://creativecommons. contentPane.0 Unported.add(new JButton("1")). 171 Second Street.setLayout(new GridLayout(2.oracle.add(new JButton("4")). Suite 300. contentPane.pack(). //visualizza il frame aframe. contentPane. Bocchi Cinzia Ultimo aggiornamento: 21/10/2011 10 . USA.html#card.