pip9.gif (3024 bytes)

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.

avanti02.gif (9574 bytes)fleche_retour.gif (1377 bytes)