Gestire lo schermo.
Nelle applets precedenti non ci siamo mai preoccupati della posizione dei vari componenti sullo schermo. I Layout manager forniscono i servizi necessari per organizzare e collocare gli oggetti sullo schermo. I layout più comuni sono FlowLayout, BorderLayout, GridLayout (poi abbiamo anche CardLayout e GridBagLayout, il più flessibile, ma anche il più complesso, consultare la Javadoc).
Il Layout di default è FlowLayout: ogni applet arriva con questo Layout impostato.
Per illustrare questi vari Layout facciamo un applet che inserisce sullo schermo dei pulsanti.
FlowLayout
Il seguente codice
import java.applet.*;
import java.awt.*;
public class FLout extends Applet {
public void init() {
add(new Button("Pulsante1"));
add(new Button("2"));
add(new Button("Puls.3"));
add(new Button("Pulsante 4"));
add(new Button("Pulsante cinque"));
}
}
fornisce questo outpout
SE abbiamo il seguente codice HTML:
<APPLET CODE="FLout.class" width=300 height=100>
</APPLET>
Provate adesso a cambiare le dimensioni dell'applet, per esempio con width=100 height=150, il risultato è:
Se poi mettete height=100, il pulsante cinque non è completamente visibile.
Osservare che, nel codice, non abbiamo definito il Layout come FlowLayout perchè FlowLayout è di default.
In sostanza FlowLayout funziona così: mette i componenti in una riga (partendo dalla sinistra), con la loro dimensione preferita. Se lo spazio orizzontale è troppo piccolo, FlowLayout crea delle altre righe.
La classe FlowLayout ha tre costruttori:
new FlowLayout() crea un FlowLayout "standard" (l'allineamento è CENTER)
new FlowLayout(FlowLayout.LEFT) crea un FlowLayout che fa partire ogni riga dalla sinistra (ovviamente si ha anche FlowLayout.RIGHT e FlowLayout.CENTER)
new FlowLayout(FlowLayout.RIGHT, 5, 10) questo fa partire le righe dalla destra con una spaziatura di 5 pixels in orizzontale e 10 pixels in verticale.
BorderLayout
BorderLayout divide lo schermo in cinque regioni: North, West, East, South, Center
import java.applet.*;
import java.awt.*;
public class BLout extends Applet {
public void init() {
setLayout(new BorderLayout());
add("North", new
Button("north"));
add("South", new
Button("south"));
add("East", new
Button("east"));
add("West", new
Button("west"));
add("Center", new
Button("center"));
}
}
BorderLayout ha quindi 5 pannelli (North, East, West, South, Center), per inserire un oggetto bisogna specificare il pannello scelto. BorderLayout assicura a North, South, East e West tanto spazio quanto richiedono, lo spazio rimanente viene assegnato a Center.
BorderLayout può essere costruito con BorderLayout(a, b) dove a e b specificano lo spazio orizzontale (a) e verticale (b) tra due componenti.
GridLayout
GridLayout divide lo schermo in una tabella con x righe e y colonne, tutte le caselle hanno la stessa grandezza.
import java.applet.*;
import java.awt.*;
public class GLout extends Applet {
public void init() {
setLayout(new GridLayout(3,2));
add(new Button("Pulsante1"));
add(new Button("2"));
add(new Button("Pulsante3"));
add(new Button("P4"));
add(new Button("Pulsante lungo
cinque"));
}
}
Però se cambiamo le dimensioni dell'applet (da width=300 a width=200):
la scritta del quinto pulsante non è più visibile!
GridLayout si costruisce anche come GridLayout(r, c, a, b) dove r è il numero di righe, c quello delle colonne, x e y specificano lo spazio orizzontale e verticale.
I pannelli.
In alcune situazioni nessuna delle soluzioni viste qui sopra potrebbe essere conveniente. Si può cercare di rimediare usando dei pannelli. Un pannello è un contenitore che può contenere altri componenti (per esempio altri pannelli) e che ha il suo proprio layout; possiamo quindi dividere lo schermo in vari pannelli ognuno dei quali avrà il suo proprio layout.
Un esempio:
import java.awt.*;
import java.applet.*;
public class Pannelli extends Applet {
public void init() {
setBackground(Color.white);
setLayout(new GridLayout(2,1 , 6, 6));
TextField tx = new TextField("terzo pannello (tx)");
Panel top = new Panel();
top.setLayout(new GridLayout(2,1));
top.setBackground(Color.cyan);
add(top);
add(tx);
Panel riga1 = new Panel();
riga1.add(new Label("Primo pannello (riga1)"));
Button pul = new Button("1o Pan");
pul.setBackground(Color.red);
riga1.add(pul);
top.add(riga1);
Panel riga2 = new Panel();
riga2.setBackground(Color.magenta);
Label l = new Label("secondo pannello (riga2)");
l.setBackground(Color.green);
riga2.add(l);
top.add(riga2);
}
public Insets getInsets() {
return new Insets(6,6,6,6);
}
}
con il seguente risultato:
Si osserverà che abbiamo iniziato dividendo lo schermo in due aggiungendo top e tx, e poi abbiamo diviso top in due con riga1 e riga2.
L'istruzione:
public Insets getInsets() {
return new Insets(6,6,6,6);
}
serve ad avere uno spazio di 6 intorno ai vertici dell'applet.
In realtà anche questa soluzione potrebbe essere insufficiente in quanto i pannelli potrebbero avere dimensioni troppo piccole se non essere addirittura invisibili. La soluzione consiste nell'estendere la classe Panel con il metodo getPreferredSize()
class mPanel extends Panel{
Dimension mieDim = new Dimension(20,20);
// costruttore
mPanel(int h, int w){
mieDim.height = h;
mieDim.width = w;
}
//getPreferredSize
public Dimension getPreferredSize(){
return mieDim;
}
//getMinimumSize
public Dimension getMinimumSize(){
return mieDim;
}
}//fine della classe
Per usare questo nuovo panel lo si deve dichiarare, per esempio: mPanel top = new mPanel(30,30);
e poi si usa come un pannello qualsiasi.