Elementi dell'interfaccia utente SWING: Contenitori

14

Click here to load reader

description

Elementi dell'interfaccia utente SWING - Contenitori e Componenti Le classi esaminate: Component, Container, Window, JFrame, Frame, JComponent, JPanel, Toolkit. Gli esempi: creare un frame, creare un frame con un pannello colorato, centrare un frame nello schermo, associare al frame un'icona personalizzata.

Transcript of Elementi dell'interfaccia utente SWING: Contenitori

Page 1: Elementi dell'interfaccia utente SWING: Contenitori

Elementi dell’interfaccia utente: contenitori

La classe Component

In Java l’interfaccia 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 un’unica 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 l’altezza 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 CinziaUltimo aggiornamento: 01/02/2013

1

Page 2: Elementi dell'interfaccia utente SWING: Contenitori

• 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 all’input dell’utente 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 CinziaUltimo aggiornamento: 01/02/2013

2

Page 3: Elementi dell'interfaccia utente SWING: Contenitori

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 CinziaUltimo aggiornamento: 01/02/2013

3

Page 4: Elementi dell'interfaccia utente SWING: Contenitori

Altri contenitori: le sottoclassi di Container

Quando si costruisce un contenitore per un’interfaccia utente, solitamente non si crea un’istanza 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 un’istanza di Panel con un’istanza di JFrame).

La libreria javax.swing nasce con l’intento di rendere gli elementi grafici dell’interfaccia 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".

Object

Component

Container

JComponent

JPanel

Window

Frame

JFrame

Seguiamo inizialmente la gerarchia che conduce a JFrame.

Bocchi CinziaUltimo aggiornamento: 01/02/2013

4

Page 5: Elementi dell'interfaccia utente SWING: Contenitori

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 l’immagine 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

Un’istanza 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 CinziaUltimo aggiornamento: 01/02/2013

5

Page 6: Elementi dell'interfaccia utente SWING: Contenitori

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 l’azione associata al pulsante di chiusura.

Come esempio, vediamo il codice che crea il frame rappresentato in figura 1.

Bocchi CinziaUltimo aggiornamento: 01/02/2013

6

Page 7: Elementi dell'interfaccia utente SWING: Contenitori

Figura 1 - Esempio di frame

package cinziabb.frameproj0;import javax.swing.JFrame;@SuppressWarnings("serial")public class MyFrame extends JFrame {

(1)

//Costanti di classepublic static final int WIDTH = 450;public static final int HEIGHT = 300;public static final int X = 100;public static final int Y = 100;

(2)public MyFrame() {

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

(3)//Imposta le dimensionisetSize(WIDTH,HEIGHT);

(4)//Imposta la posizione inizialesetLocation(X,Y);

(5)/*In alternativa a setSize e setLocation:setBounds(X,Y,WIDTH,HEIGHT);*/

(6)//Imposta l'azione corrispondente alla chiusurasetDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

(7)public static void main(String args[]) {

MyFrame frame= new MyFrame();frame.setVisible(true);

}}

Bocchi CinziaUltimo aggiornamento: 01/02/2013

7

Page 8: Elementi dell'interfaccia utente SWING: Contenitori

(1) - Le costanti di classe WIDTH, HEIGHT, X e Y rappresentano rispettivamente la larghezza e l’altezza 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 l’operazione 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 CinziaUltimo aggiornamento: 01/02/2013

8

Page 9: Elementi dell'interfaccia utente SWING: Contenitori

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 java.awt.Color;import java.awt.Container;import javax.swing.JFrame;import javax.swing.JPanel;@SuppressWarnings("serial")public class MyFrame extends JFrame {

Bocchi CinziaUltimo aggiornamento: 01/02/2013

9

Page 10: Elementi dell'interfaccia utente SWING: Contenitori

//Costanti di classepublic static final int WIDTH = 450;public static final int HEIGHT = 300;public static final int X = 100;public static final int Y = 100;

(1)//Variabili di istanzaprivate JPanel panel;private Container contentPane;public MyFrame() {

super("MyFrame");//Imposta le dimensionisetSize(WIDTH,HEIGHT);//Imposta la posizione inizialesetLocation(X,Y);//Imposta l'azione corrispondente alla chiusurasetDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

(2)//Creazione del pannello coloratopanel = new JPanel();panel.setBackground(Color.LIGHT_GRAY);

(3)//Inserimento del pannello colorato nel framecontentPane = getContentPane();contentPane.add(panel);

}

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

}}

(1) - Definiamo due variabili di istanza: panel, di tipo JPanel e contentPane, di tipo Container.

(2) - Creiamo l’istanza 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:

(2)//Creazione del pannello coloratoJPanel panel = new JPanel();panel.setBackground(Color.LIGHT_GRAY);

Bocchi CinziaUltimo aggiornamento: 01/02/2013

10

Page 11: Elementi dell'interfaccia utente SWING: Contenitori

(3)//Inserimento del pannello colorato nel frameContainer 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, l’interfaccia 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 dell’utente. 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 dall’url specificato. I formati immagine consentiti sono GIF, JPG e PNG.

• public abstract Dimension getScreenSize()Restituisce le dimensioni dello schermo dell’utente.

Bocchi CinziaUltimo aggiornamento: 01/02/2013

11

Page 12: Elementi dell'interfaccia utente SWING: Contenitori

Esempio: Creare un frame centrato nello schermo e con un’icona personalizzata

In questo esempio aggiungeremo al frame precedente un’icona 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 java.awt.Color;import java.awt.Container;import java.awt.Dimension;import java.awt.Image;import java.awt.Toolkit;import javax.swing.JFrame;import javax.swing.JPanel;

Bocchi CinziaUltimo aggiornamento: 01/02/2013

12

Page 13: Elementi dell'interfaccia utente SWING: Contenitori

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

//Costanti di classepublic static final int WIDTH = 450;public static final int HEIGHT = 300;//Variabili di istanzaprivate JPanel panel;private Container contentPane;public MyFrame() {

super("MyFrame");//Imposta le dimensionisetSize(WIDTH,HEIGHT);

(1)

//Ottiene le dimensioni dello schermoToolkit kit = Toolkit.getDefaultToolkit();Dimension screenSize = kit.getScreenSize();int screenWidth = screenSize.width;int screenHeight = screenSize.height;

(2)//Centra il frame nello schermoint x = (screenWidth - WIDTH) / 2;int y = (screenHeight - HEIGHT) / 2;setLocation(x, y);

//Imposta l'azione corrispondente alla chiusurasetDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

(3)//Aggiunge un'icona al frameImage img =

kit.getImage(getClass().getResource("icon.gif"));setIconImage(img);

//Creazione del pannello coloratopanel = new JPanel();panel.setBackground(Color.LIGHT_GRAY);

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

}

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

(4)//Stampa una stringa con informazioni sul frameSystem.out.println(frame.paramString());

frame.setVisible(true);}

}

Bocchi CinziaUltimo aggiornamento: 01/02/2013

13

Page 14: Elementi dell'interfaccia utente SWING: Contenitori

(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 l’altezza dell’elemento considerato. Di conseguenza, basta accedere ad esse in lettura per ottenere la larghezza e l’altezza 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 all’interno dello stesso package di MyFrame. Nel dettaglio: getClass restituisce il tipo runtime dell’oggettoclass cinziabb.frameproj2.MyFrame getResource restituisce l’url della risorsa che ha il nome specificato.La combinazione dei due metodi consente di ottenere: file:/C:/workspaceJunoJEE/FrameProject/bin/cinziabb/frameproj2/icon.gifche corrisponde alla effettiva collocazione della risorsa.Il metodo getImage crea l’oggetto Image a partire dal file immagine. Infine, il metodo setIconImage, imposta l’immagine 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_CLOSE,rootPane=javax.swing.JRootPane[,0,0,0x0,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=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 CinziaUltimo aggiornamento: 01/02/2013

14