Professional Documents
Culture Documents
Premessa
Supponiamo di voler creare la seguente interfaccia utente.
pulsante (button)
Bocchi Cinzia
15/01/2015
Osservando la figura 2 si pu notare che i componenti sono disposti in modo diverso dalla
UI di figura 1: il pulsante occupa tutta larea inferiore del frame e i pulsanti radio si trovano
alle estremit della finestra. La causa della diversa disposizione da attribuire al layout
predefinito del pannello del contenuto. E evidente, allora, che non sufficiente aggiungere
componenti alla finestra ma occorre, prima, scegliere il layout pi adatto.
Indice
Layout del pannello del contenuto: layout di bordo
La classe BorderLayout
Modificare il layout predefinito di un contenitore
Pannelli generici e classe JPanel: layout di flusso
La classe FlowLayout
Creare un pannello come istanza della classe JPanel
Creare un pannello come istanza di una classe derivata da JPanel
Pannelli con Window Builder
Videolezioni (link esterni)
Java Swing Creare pannelli personalizzati Parte 1
Java Swing Creare pannelli personalizzati Parte 2
Java Swing Creare pannelli personalizzati Parte 3
Bocchi Cinzia
15/01/2015
NORTH
WEST
CENTER
EAST
SOUTH
15/01/2015
La classe BorderLayout
La classe BorderLayout definisce 5 stringhe costanti per individuare le aree ove collocare i
componenti:
- public static final String CENTER;
- public static final String EAST;
- public static final String NORTH;
- public static final String SOUTH;
- public static final String WEST;
e fornisce i seguenti due costruttori
public BorderLayout()
Crea un gestore di layout di bordo senza spazio tra i componenti.
Bocchi Cinzia
15/01/2015
Il metodo add della classe Container definito in varie forme; nella tabella seguente ne
sono indicate due:
public Component add(Component comp)
Aggiunge il componente specificato alla fine del contenitore.
Dalle considerazioni fatte, risulta evidente che il layout predefinito del pannello del
contenuto non adatto a realizzare la UI di figura 1. Le strade che possiamo perseguire,
per risolvere il problema, sono 3:
1. cambiare il layout del pannello del contenuto;
2. annullare qualsiasi layout e disporre i componenti specificando, per ciascuno di essi, la
posizione e la dimensione assolute;
3. utilizzare contenitori con un diverso layout, i pannelli generici, che sono istanze della
classe JPanel.
I gestori di layout di Swing sono numerosi e lelenco seguente ne riporta solo alcuni tra i
pi noti1:
BorderLayout
FlowLayout
BoxLayout
GridLayout
GridBagLayout
CardLayout
GroupLayout
SpringLayout
I gestori di layout disponibili dovrebbero essere sufficienti a creare la maggior parte delle
UI, tuttavia sempre possibile creare un layout personalizzato, anche se il compito non
banale2.
1
Bocchi Cinzia
15/01/2015
Per cambiare il gestore di layout del pannello del contenuto da BorderLayout a, per
esempio, FlowLayout, sufficiente scrivere:
getContentPane().setLayout(new FlowLayout());
Posizionamento assoluto dei componenti
Talvolta pu essere utile o necessario non servirsi di un gestore di layout, per poter
collocare un componente in una posizione "assoluta". In casi come questo occorre:
1. annullare ogni gestore di layout, passando come parametro al metodo setLayout il
valore null;
2. specificare la posizione e la dimensione del componente, utilizzando il metodo
setBounds.
Il posizionamento assoluto non rappresenta, comunque, la scelta migliore poich i
componenti, in tal caso, rimangono in posizione fissa anche quando il frame viene
ridimensionato dallutente.
Bocchi Cinzia
15/01/2015
Bocchi Cinzia
15/01/2015
La classe FlowLayout
Bocchi Cinzia
15/01/2015
Allineamento LEFT
Allineamento RIGHT
15/01/2015
import
import
import
import
import
java.awt.BorderLayout;
java.awt.Color;
java.awt.EventQueue;
javax.swing.JFrame;
javax.swing.JPanel;
@SuppressWarnings("serial")
public class MyFrameAndPanel extends JFrame {
Bocchi Cinzia
public
public
public
public
static
static
static
static
final
final
final
final
int
int
int
int
WIDTH = 450;
HEIGHT = 300;
X = 100;
Y = 100;
public MyFrameAndPanel() {
initialize();
}
15/01/2015
10
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
righi 27-29
Viene creato il pannello centerPane come istanza di JPanel e viene impostato il colore di
sfondo a Color.GRAY.
righi 30-32
Viene creato il pannello southPane come istanza di JPanel e viene impostato il colore di
sfondo a Color.BLACK.
righi 34-36
I due pannelli vengono aggiunti al pannello del contenuto del frame nelle aree desiderate.
Il frame generato ha laspetto mostrato in figura 8.
Bocchi Cinzia
15/01/2015
11
Metodo
public Color getBackground()
Restituisce il colore di sfondo del componente.
java.awt.Component
Bocchi Cinzia
15/01/2015
12
java.awt.Component
java.awt.Component
java.awt.Container
java.awt.Component
import
import
import
import
import
java.awt.Color;
java.awt.Cursor;
java.awt.FlowLayout;
java.awt.Font;
javax.swing.JPanel;
@SuppressWarnings("serial")
public class MyPanel extends JPanel {
public MyPanel() {
//Crea il pannello con layout di flusso e allineamento a
sinistra
super(new FlowLayout(FlowLayout.LEFT));
//Imposta il colore di sfondo a grigio chiaro
setBackground(Color.LIGHT_GRAY);
Bocchi Cinzia
15/01/2015
13
16
17
18
19
20
21
22
23
24
Una versione leggermente diversa del codice prevede lutilizzo di un metodo privato
initialize per inizializzare il pannello. In tale caso non sar pi possibile utilizzare la
chiamata esplicita al costruttore di JPanel, effettuata con super, e si dovr ottenere il
riferimento al gestore di layout per modificare lallineamento. Vediamo le modifiche
apportate al codice.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import
import
import
import
java.awt.Color;
java.awt.Cursor;
java.awt.FlowLayout;
java.awt.Font;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class MyPanel extends JPanel {
public MyPanel() {
initialize();
}
private void initialize() {
//Imposta l'allineamento a sinistra
((FlowLayout) getLayout()).setAlignment(FlowLayout.LEFT);
//Imposta il colore di sfondo a grigio chiaro
setBackground(Color.LIGHT_GRAY);
//Imposta il colore del testo a grigio scuro
setForeground(Color.DARK_GRAY);
//Imposta il cursore a forma di mano
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
//Imposta il font a Verdana 12 punti
setFont(new Font("Verdana", Font.PLAIN, 12));
}
}
MyPanel versione 2
Bocchi Cinzia
15/01/2015
14
rigo 19
Il metodo getLayout restituisce il riferimento al gestore di layout del pannello. Il
riferimento, per, di tipo LayoutManager e, di conseguenza, occorre convertirlo nel tipo
FlowLayout effettuando lopportuno cast. Sul riferimento cos ottenuto viene poi invocato il
metodo setAlignment per impostare lallineamento a sinistra.
Consideriamo ora il codice della classe MyFrame versione 53.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.awt.EventQueue;
import javax.swing.JFrame;
@SuppressWarnings("serial")
public class MyFrame extends JFrame {
public
public
public
public
static
static
static
static
final
final
final
final
int
int
int
int
WIDTH = 450;
HEIGHT = 300;
X = 100;
Y = 100;
public MyFrame() {
initialize();
}
private void initialize() {
setTitle("MyFrame");
setSize(WIDTH, HEIGHT);
setLocation(X, Y);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
MyFrame frame = new MyFrame();
frame.setVisible(true);
}
});
}
}
MyFrame versione 5
Bocchi Cinzia
15/01/2015
15
import
import
import
import
java.awt.BorderLayout;
java.awt.EventQueue;
javax.swing.JFrame;
panel2.MyPanel;
@SuppressWarnings("serial")
public class MyFrame extends JFrame {
public
public
public
public
static
static
static
static
final
final
final
final
int
int
int
int
WIDTH = 450;
HEIGHT = 300;
X = 100;
Y = 100;
15/01/2015
16
Bocchi Cinzia
15/01/2015
17
LEFT
LIGHT_GRAY
DARK_GRAY
Bocchi Cinzia
15/01/2015
18
Verdana, PLAIN, 12
import
import
import
import
import
import
import
import
java.awt.EventQueue;
javax.swing.JFrame;
javax.swing.JPanel;
java.awt.BorderLayout;
java.awt.FlowLayout;
java.awt.Color;
java.awt.Cursor;
java.awt.Font;
Bocchi Cinzia
19
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/**
* Create the application.
*/
public MyFrame() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setFont(new Font("Verdana", Font.PLAIN, 12));
panel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CUR
SOR));
panel.setForeground(Color.DARK_GRAY);
panel.setBackground(Color.LIGHT_GRAY);
FlowLayout flowLayout = (FlowLayout) panel.getLayout();
flowLayout.setAlignment(FlowLayout.LEFT);
frame.getContentPane().add(panel, BorderLayout.CENTER);
}
}
MyFrame con pannello centrale versione Window Builder
Quest'opera distribuita con Licenza Creative Commons Attribuzione - Condividi allo stesso modo 4.0
Internazionale
Bocchi Cinzia
15/01/2015
20