Sei sulla pagina 1di 14

Elementi dellinterfaccia utente: contenitori

La classe Component
In Java linterfaccia utente formata da due elementi principali: i contenitori; i componenti. Un contenitore pu contenere pi componenti. Un contenitore, insieme ai suoi componenti, pu essere visto come ununica entit e considerato come un componente speciale, cos da essere inserito in altri contenitori. Le classi per creare interfacce utente sono contenute nei package java.awt e javax.swing. Le classi Java che realizzano componenti e contenitori sono organizzate in una gerarchia che ha come padre la classe Component (classe astratta) del package java.awt.

Object

Component

Metodi utili della classe Component


public void setVisible(boolean b) Se b=true, visualizza il componente, altrimenti lo nasconde. public boolean isVisible() Restituisce true se il componente visibile quando lo il componente padre; false altrimenti.

public void setSize(int larghezza, int altezza) Imposta la larghezza e laltezza del componente; larghezza e altezza sono espressi in pixel.

public void setLocation(int ascissa, int ordinata) Posiziona il componente a partire dal punto di coordinate (ascissa, ordinata). Il vertice in alto a sinistra del componente coincide con il punto di coordinate specificate.

Bocchi Cinzia Ultimo aggiornamento: 01/02/2013

public void setBounds(int ascissa, int ordinata, int larghezza, int altezza) Combina i metodi setLocation e setSize, consentendo di impostare la posizione iniziale e la dimensione del componente con un'unica operazione.

public int getX() Restituisce l'ascissa della posizione iniziale del componente. public int getY() Restituisce l'ordinata della posizione iniziale del componente. public int getWidth() Restituisce la larghezza del componente. public int getHeight() Restituisce l'altezza del componente. public void setBackground(Color colore) Imposta il colore di sfondo del componente a quello specificato. Se il parametro null, il componente eredita il colore di sfondo del componente padre.

public Color getBackground() Restituisce il colore di sfondo del componente o del componente padre, nel caso non sia stato impostato in precedenza.

public void setForeground(Color colore) Imposta il colore in primo piano del componente a quello specificato. Se il parametro null, il componente eredita il colore in primo piano del componente padre.

public Color getForeground() Restituisce il colore in primo piano del componente o del componente padre, nel caso non sia stato impostato in precedenza.

public void setEnabled(boolean b) Se b=true, abilita il componente, altrimenti lo disabilita. Un componente abilitato pu rispondere allinput dellutente e genera eventi. I componenti vengono creati abilitati, per default.

public boolean isEnabled() Restituisce true se il componente abilitato; false altrimenti. public String toString() Restituisce una rappresentazione del componente sotto forma di stringa. Ridefinisce (overrides) il metodo toString della classe Object.

public void setFont(Font f) Imposta il font per il componente. protected String paramString() Restituisce una stringa che rappresenta il componente.

Bocchi Cinzia Ultimo aggiornamento: 01/02/2013

Contenitori: la classe Container


Un contenitore un componente che pu contenere altri componenti.

Component

Container

Costruttore della classe Container


public Container() Crea un contenitore trasparente.

Metodi utili della classe Container


public Component add(Component comp) Inserisce nel contenitore il componente specificato (comp). public void remove(Component comp) Rimuove dal contenitore il componente specificato. public void removeAll() Rimuove dal contenitore tutti i componenti. public void setLayout(LayoutManager mgr) Imposta il gestore di layout per il contenitore. La classe Container ridefinisce alcuni metodi della classe Component, come: setFont e paramString.

Bocchi Cinzia Ultimo aggiornamento: 01/02/2013

Altri contenitori: le sottoclassi di Container


Quando si costruisce un contenitore per uninterfaccia utente, solitamente non si crea unistanza della classe Container ma si utilizzano altre classi da essa derivate: Frame e Panel con awt, JFrame e JPanel con swing. Si raccomanda comunque di non combinare elementi provenienti dai due diversi package (ad esempio unistanza di Panel con unistanza di JFrame). La libreria javax.swing nasce con lintento di rendere gli elementi grafici dellinterfaccia utente, indipendenti dalla piattaforma, diversamente da quanto accade utilizzando le classi del package java.awt. Swing non un sostituto completo di awt, ma fornisce semplicemente componenti di interfaccia utente pi capaci. In particolare, il modello di gestione degli eventi rimane lo stesso. Nella nostra analisi delle classi utili per la gestione delle interfacce utente, non prenderemo in considerazione le classi di awt per le quali esiste una classe corrispondente in swing. Nel caso dei contenitori, per esempio, non tratteremo le classi Frame e Panel. Nota: facile distinguere le classi swing dalle classi awt poich le prime, generalmente, hanno nomi che iniziano con la lettera "J".

Obj ect

Component

Container

JComponent

Window

JPanel

Frame

JFrame

Seguiamo inizialmente la gerarchia che conduce a JFrame.

Bocchi Cinzia Ultimo aggiornamento: 01/02/2013

Finestre: la classe Window


La classe Window consente di generare una finestra senza bordi e senza barra di menu.

Metodi utili della classe Window


public void dispose() Chiude la finestra e libera tutte le risorse di sistema da essa occupate. public void pack() Determina automaticamente la dimensione della finestra sulla base dei suoi componenti.

public void toBack() Se la finestra visibile la sposta in fondo allo stack delle finestre sul desktop e ridispone tutte le altre finestre.

public void toFront() Mostra la finestra in primo piano. public void setIconImage(Image img) Imposta limmagine specificata come icona per la finestra. La classe Window ridefinisce alcuni metodi della classe Component, come ad esempio: getBackground, setBackground, setBounds, setSize, setVisible.

Finestre: la classe JFrame


Unistanza della classe JFrame una finestra top-level (di massimo livello), cio non contenuta in altre finestre, dotata di titolo e bordi. Ogni applicazione ha bisogno di almeno una finestra che funga da contenitore.

Costruttori della classe JFrame


public JFrame() Crea una finestra senza titolo e non visibile. public JFrame(String titolo) Crea una finestra non visibile, con il titolo specificato. La finestra creata ha le seguenti caratteristiche: ridimensionabile mediante il pulsante presente sulla barra del titolo; riducibile a icona mediante il pulsante presente sulla barra del titolo; dimensionabile con il mouse, agendo sul contorno.

Bocchi Cinzia Ultimo aggiornamento: 01/02/2013

Metodi utili della classe JFrame


public void setDefaultCloseOperation(int azione) Specifica l'azione da eseguire quando si fa clic sul pulsante di chiusura della finestra. Il parametro azione pu assumere uno dei seguenti valori: EXIT_ON_CLOSE - costante di JFrame; chiude la finestra e termina l'esecuzione dell'applicazione. DISPOSE_ON_CLOSE - costante dell'interfaccia WindowsConstants; chiude la finestra, liberando le risorse di sistema, ma senza interrompere l'esecuzione. DO_NOTHING_ON_CLOSE - costante di WindowsConstants; non esegue alcuna azione. HIDE_ON_CLOSE - costante di WindowsConstants; nasconde la finestra ( il valore di default).

public int getDefaultCloseOperation() Restituisce l'azione impostata come operazione di chiusura predefinita. public Container getContentPane() A differenza di quanto accade con la classe Frame, non possibile aggiungere direttamente un componente ad un'istanza di JFrame. Infatti, le finestre create con JFrame contengono al loro interno un certo numero di pannelli predefiniti, uno dei quali il pannello del contenuto (contentPane). Qualsiasi componente pu essere aggiunto direttamente solo a questo pannello predefinito. Il metodo getContentPane restituisce il riferimento (indirizzo) a tale pannello. La classe JFrame ridefinisce alcuni metodi della classe Window, come: paramString, remove, setIconImage.

Metodi utili ereditati della classe Frame


public void setResizable(boolean b) Se b=false, rende la finestra non ridimensionabile. public void setTitle(String titolo) Imposta il titolo del frame specificato con la stringa passata come parametro. public String getTitle() Restituisce il titolo della finestra.

Esempio: Creare un frame


La creazione di un frame avviene estendendo la classe JFrame ed eseguendo alcune semplici operazioni basilari. In particolare occorre: - stabilire la dimensione del frame; - stabilire la sua posizione iniziale; - indicare lazione associata al pulsante di chiusura. Come esempio, vediamo il codice che crea il frame rappresentato in figura 1.
Bocchi Cinzia Ultimo aggiornamento: 01/02/2013

Figura 1 - Esempio di frame

package cinziabb.frameproj0; import javax.swing.JFrame; @SuppressWarnings("serial") public class MyFrame extends JFrame { //Costanti di public static public static public static public static classe final int final int final int final int WIDTH = 450; HEIGHT = 300; X = 100; Y = 100;

(1)

(2)

public MyFrame() { super("MyFrame"); /*In alternativa: setTitle("MyFrame");*/

(3) (4) (5)

//Imposta le dimensioni setSize(WIDTH,HEIGHT); //Imposta la posizione iniziale setLocation(X,Y); /*In alternativa a setSize e setLocation: setBounds(X,Y,WIDTH,HEIGHT);*/ //Imposta l'azione corrispondente alla chiusura setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

(6)

(7) }

public static void main(String args[]) { MyFrame frame= new MyFrame(); frame.setVisible(true); }

Bocchi Cinzia Ultimo aggiornamento: 01/02/2013

(1) - Le costanti di classe WIDTH, HEIGHT, X e Y rappresentano rispettivamente la larghezza e laltezza del frame e le coordinate del suo vertice superiore sinistro. (2) - Il costruttore della classe MyFrame esegue una chiamata al costruttore della superclasse JFrame, specificando come parametro il titolo del frame: super("MyFrame"). In alternativa, possibile specificare il titolo con il metodo setTitle: setTitle("MyFrame"). Come vedremo, tutti i metodi che impostano la finestra devono essere chiamati all'interno del costruttore. (3) - Il metodo setSize imposta la dimensione del frame. (4) - Il metodo setLocation imposta la posizione iniziale del frame; la posizione, se non specificata, coincide con il punto origine degli assi. (5) - Al posto dei metodi setSize e setLocation si pu usare il metodo setBounds. (6) - La chiamata al metodo setDefaultCloseOperation imposta loperazione associata al pulsante di chiusura del frame. (7) - Tra i metodi della classe presente il metodo main: in tal modo possibile testare il funzionamento della classe, senza dover scrivere una specifica applicazione. Qualora si scriva invece, un'applicazione che utilizza la classe MyFrame, il metodo main presente nell'applicazione, prevarr su quello definito nella classe stessa. Una volta creata la finestra, questa non ancora visibile. Per visualizzarla occorre chiamare il metodo setVisible, passandogli come parametro true: frame.setVisible(true). La visualizzazione di una finestra deve avvenire dopo che tutte le impostazioni iniziali sono state applicate.

La classe JComponent
JComponent una classe astratta che definisce i componenti di una interfaccia utente, ad eccezione dei contenitori top-level. JComponent: ridefinisce alcuni metodi della classe Component, come: setVisible, setEnabled, setForeground, setBackground, getX, getY, getWidth, getHeight, paramString; eredita da Component (tra gli altri): getBackground, getForeground, isEnabled, isVisible, setBounds, setLocation, setSize, toString; ridefinisce alcuni metodi della classe Container, come: setFont.

Metodi utili della classe JComponent public void setToolTipText(String text) Imposta la stringa (tooltip string) che sar visualizzata quando il mouse verr posizionato sul componente. public String getToolTipText() Restituisce la tooltip string impostata per il componente.
Bocchi Cinzia Ultimo aggiornamento: 01/02/2013

Pannelli: la classe JPanel


Un pannello usato principalmente per raggruppare i componenti (incluso altri pannelli) da inserire in un altro contenitore (ad esempio un frame). Per tale motivo, un pannello al tempo stesso sia un contenitore che un componente.

Costruttori della classe JPanel


public JPanel() Crea un pannello con gestore di layout predefinito Flow Layout. public JPanel(LayoutManager layout) Crea un pannello con il gestore di layout specificato. Nota: I gestori di layout saranno trattati nella prossima dispensa.

Esempio: Creare un frame con un pannello colorato


Come esempio aggiungeremo al frame precedente un pannello colorato per ottenere il risultato mostrato in figura 2.

Figura 2 - Esempio di frame contenente un pannello colorato

package cinziabb.frameproj1; import import import import java.awt.Color; java.awt.Container; javax.swing.JFrame; javax.swing.JPanel;

@SuppressWarnings("serial") public class MyFrame extends JFrame {

Bocchi Cinzia Ultimo aggiornamento: 01/02/2013

//Costanti di public static public static public static public static

classe final int final int final int final int

WIDTH = 450; HEIGHT = 300; X = 100; Y = 100;

(1)

//Variabili di istanza private JPanel panel; private Container contentPane; public MyFrame() { super("MyFrame"); //Imposta le dimensioni setSize(WIDTH,HEIGHT); //Imposta la posizione iniziale setLocation(X,Y); //Imposta l'azione corrispondente alla chiusura setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Creazione del pannello colorato panel = new JPanel(); panel.setBackground(Color.LIGHT_GRAY); //Inserimento del pannello colorato nel frame contentPane = getContentPane(); contentPane.add(panel); } public static void main(String args[]) { MyFrame frame= new MyFrame(); frame.setVisible(true); } }

(2)

(3)

(1) - Definiamo due variabili di istanza: panel, di tipo JPanel e contentPane, di tipo Container. (2) - Creiamo listanza di JPanel e impostiamo il colore di sfondo con il metodo setBackground: panel.setBackground(Color.LIGHT_GRAY). Si osservi che il colore di sfondo espresso mediante una costante della classe Color. Analizzeremo in seguito le caratteristiche di questa classe. (3) - Infine, otteniamo il riferimento al pannello del contenuto con il metodo getContentPane: contentPane = getContentPane() e aggiungiamo ad esso il pannello colorato: contentPane.add(panel). Osservazione: Non necessario, in questo caso, definire panel e contentPane come variabili di istanza. Si potrebbe, infatti, definire le suddette variabili come locali al costruttore, in questo modo: //Creazione del pannello colorato JPanel panel = new JPanel(); panel.setBackground(Color.LIGHT_GRAY);

(2)

Bocchi Cinzia Ultimo aggiornamento: 01/02/2013

10

(3)

//Inserimento del pannello colorato nel frame Container contentPane = getContentPane(); contentPane.add(panel);

La classe Toolkit
La classe astratta Toolkit fornisce una interfaccia verso la piattaforma in uso, consentendo di ottenere informazioni su, ad esempio, la dimensione di una finestra, i font disponibili, e cos via. Ogni piattaforma che supporta Java deve fornire una classe concreta che estende la classe Toolkit. Toolkit consente di risolvere i problemi di visualizzazione dovuti alle caratteristiche specifiche della piattaforma. Nonostante Java sia indipendente dalla piattaforma, pu capitare che a parit di bytecode, di sistema operativo e di JDK, linterfaccia utente appaia diversa. Questo problema dovuto alla risoluzione dello schermo che pu variare a seconda della scheda video in uso e in base alle preferenze dellutente. Per esempio, un frame di dimensioni 800x600 potrebbe essere troppo grande per uno schermo con risoluzione 640x480 e troppo piccolo per uno schermo con risoluzione 1024x768. La maggior parte dei metodi della classe Toolkit sono chiamati dal sistema, ma esistono alcuni metodi che risultano particolarmente utili e che, pertanto, andiamo ad analizzare di seguito.

Metodi utili della classe Toolkit


public static Toolkit getDefaultToolkit() Restituisce il toolkit predefinito. public abstract Image getImage(String filename) Carica una immagine dal file specificato. I formati immagine consentiti sono GIF, JPG e PNG.

public abstract Image getImage(URL url) Carica una immagine dallurl specificato. I formati immagine consentiti sono GIF, JPG e PNG.

public abstract Dimension getScreenSize() Restituisce le dimensioni dello schermo dellutente.

Bocchi Cinzia Ultimo aggiornamento: 01/02/2013

11

Esempio: Creare un frame centrato nello schermo e con unicona personalizzata


In questo esempio aggiungeremo al frame precedente unicona e imposteremo la posizione iniziale del frame in modo tale che venga visualizzato centralmente nello schermo, come mostrato nella figura 3.

Figura 3 - Esempio di frame centrato, con icona personalizzata

Inoltre, utilizzeremo il metodo paramString per ottenere informazioni sul frame. package cinziabb.frameproj2; import import import import import import import java.awt.Color; java.awt.Container; java.awt.Dimension; java.awt.Image; java.awt.Toolkit; javax.swing.JFrame; javax.swing.JPanel;

Bocchi Cinzia Ultimo aggiornamento: 01/02/2013

12

@SuppressWarnings("serial") public class MyFrame extends JFrame { //Costanti di classe public static final int WIDTH = 450; public static final int HEIGHT = 300; //Variabili di istanza private JPanel panel; private Container contentPane; public MyFrame() { super("MyFrame"); //Imposta le dimensioni setSize(WIDTH,HEIGHT); //Ottiene le dimensioni dello schermo Toolkit kit = Toolkit.getDefaultToolkit(); Dimension screenSize = kit.getScreenSize(); int screenWidth = screenSize.width; int screenHeight = screenSize.height; //Centra il frame nello schermo int x = (screenWidth - WIDTH) / 2; int y = (screenHeight - HEIGHT) / 2; setLocation(x, y); //Imposta l'azione corrispondente alla chiusura setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Aggiunge un'icona al frame Image img = kit.getImage(getClass().getResource("icon.gif")); setIconImage(img); //Creazione del pannello colorato panel = new JPanel(); panel.setBackground(Color.LIGHT_GRAY); //Inserimento del pannello colorato nel frame contentPane = getContentPane(); contentPane.add(panel);

(1)

(2)

(3)

public static void main(String args[]) { MyFrame frame= new MyFrame(); (4) } //Stampa una stringa con informazioni sul frame System.out.println(frame.paramString()); frame.setVisible(true); }

Bocchi Cinzia Ultimo aggiornamento: 01/02/2013

13

(1) - Il metodo statico getDefaultToolkit restituisce nella variabile kit il riferimento al default toolkit: Toolkit kit = Toolkit.getDefaultToolkit(). Il metodo getScreenSize restituisce un oggetto Dimension contenente le dimensioni dello schermo: Dimension screenSize = kit.getScreenSize(). Un oggetto Dimension ha due variabili di istanza pubbliche intere width e height che contengono rispettivamente la larghezza e laltezza dellelemento considerato. Di conseguenza, basta accedere ad esse in lettura per ottenere la larghezza e laltezza dello schermo: int screenWidth = screenSize.width; int screenHeight = screenSize.height. (2) - Ora che conosciamo altezza e larghezza dello schermo, facciamo un semplice calcolo per ottenere le coordinate del vertice superiore sinistro del frame e impostare la sua posizione iniziale con setLocation. (3) - La prima riga di codice Image img = kit.getImage(getClass().getResource("icon.gif")); consente di reperire una risorsa collocata allinterno dello stesso package di MyFrame. Nel dettaglio: getClass restituisce il tipo runtime delloggetto class cinziabb.frameproj2.MyFrame getResource restituisce lurl della risorsa che ha il nome specificato. La combinazione dei due metodi consente di ottenere: file:/C:/workspaceJunoJEE/FrameProject/bin/cinziabb/frameproj2/icon.gif che corrisponde alla effettiva collocazione della risorsa. Il metodo getImage crea loggetto Image a partire dal file immagine. Infine, il metodo setIconImage, imposta limmagine come icona della finestra. (4) - Il metodo paramString restituisce la stringa:

frame0,415,362,450x300,invalid,hidden,layout=java.awt.BorderLayout ,title=MyFrame,resizable,normal,defaultCloseOperation=EXIT_ON_CLOS E,rootPane=javax.swing.JRootPane[,0,0,0x0,invalid,layout=javax.swi ng.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flag s=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheck ingEnabled=true

Quest'opera stata rilasciata con licenza Creative Commons Attribution-ShareAlike 3.0 Unported. Per leggere una copia della licenza visita il sito web http://creativecommons.org/licenses/by-sa/3.0/ o spedisci una lettera a Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.

Bocchi Cinzia Ultimo aggiornamento: 01/02/2013

14

Potrebbero piacerti anche