You are on page 1of 8

Il package swing

Il java package "swing" un insieme di classi per la creazione di interfacce grafiche in Java. Nelle prime versioni di Java il package usato per creare interfacce era "awt" (Abstract Window Toolkit). L'awt ormai in disuso; il package swing permette di creare interfacce molto pi funzionali e belle steticamente. Tuttavia, l'awt viene ancora tenuto per compatibilit, ed alcune funzionalit di swing si basano su classi del package awt. Le classi principali che useremo sono JFrame e JPanel.

javax.swing.JFrame
java.lang.Object java.awt.Component java.awt.Container java.awt.Window java.awt.Frame javax.swing.JFrame

La classe frame rappresenta un finestra. I metodi pi importanti sono: JFrame(String titolo). Istanzia una finestra con un titolo. void add(Component c). Permette di inserire un componente grafico nella finestra. void setSize(int larghezza, int altezza). Imposta le dimensioni della finestra. void show(). Visualizza la finestra. void pack(). Imposta le dimensioni della finestra ad un valore adatto a mostrare tutte le componenti che ci sono all'interno. Da eseguire alla fine del setup della finestra! void setDefaultCloseOperation(int mode). Indica cosa fare quando la finestr viene chiusa con il pulsante X. I possibli valori sono: JFrame.EXIT_ON_CLOSE (ferma la virtual machine), JFrame.DISPOSE_ON_CLOSE (chiude la finestra). Come si vede dalla gerarchia, questa classe ha molte super-classi. La maggior parte dei metodi utili sono definiti nelle super-classi.

javax.swing.JPanel
java.lang.Object java.awt.Component java.awt.Container javax.swing.JComponent javax.swing.JPanel

La classe JPanel rappresenta un pannello vuoto pronto per essere popolato da altre componenti o da usare come canovaccio per disegnare "a mano" con le primitive di Graphics. Fino ad ora abbiamo usato solo il secondo approccio. I metodi pi importanti sono: void paint(Graphics g). Il metodo che fino ad ora abbiamo usato noi. Viene invocato dal sistema quando c' bisogno di aggiornare le finestra. void add(Component c, int location). Aggiunge una componente al pannello nella posizione specificata dall'indice. Come le componenti vengono disposte dipende dal "Layout". void add(Component c). Aggiunge una componente al pannello nella prossima posizione disponibile. Qual' la prossima posizione e come le componenti vengono disposte dipende dal "Layout".

Il meccanismo Component/Container
Come si vede dalla gerarchia di classi sia JFrame che JPanel ereditano dalla classe Container , che a sua volta eredita dalla classe Component. Questa organizzazione permette ad ogni componente di avere un doppio ruolo di componente grafica per un'intefaccia e di contenitore per altre componenti. Ad esempio vediamo come potrebbe essere organizzata l'interfaccia di un browser
Finestra browser Pannello Menu Pannello Rendering html Frame Menu Bottone Link 1 Bottone Link 2 Frame Contenuto Campo testo 1 Immagine 2 Immagine 1

Campo testo 2

Come si vede, molte delle componenti grafiche di un'interfaccia agiscono sia da componenti grafiche che da contenitori per componenti pi elementari. Ad esempio, immagini, bottoni, e campi testuali non sono pi contentori. Pi precisamente, non sono pi contenitori di altre componenti grafiche, ma ovviamente contengono i dati che devono rappresentare. Come abbiamo gi visto, la classe JPanel il nostro contenitore. Al suo interno metteremo altri pannelli o delle componenti basilari. Le componenti grafiche che vedremo sono:

JLabel
Spazi dove inserire parole o icone. Un costruttore :
JLabel(String text)

Istanzia una label con su scritto il testo specificato. Il tsto si pu poi cambiare con il metodo:
void setText(String testo)

JButton
Bottoni premibili dall'utente:
JButton(String text)

Istanzia un bottone con su scritto il testo specificato.

JTextField
Campi dove inserire una riga di testo.
JTextField(String text, int columns)

Istanzia un campo di testo che contiene inizialmente il testo specificato ed largo quanto basta per contenere il numero di caratteri specificato in columns. Il testo inserito dall'utente si pu ottenere con il metodo:
String getText()

I Layout
Ovviamente, all'interno di un pannello (container), voglio poter inserire pi componenti. Ma come vengono disposte? La politica di disposizione delle componenti all'interno di un container gestita da un Layout. Ogni container ha un layout associato ad esso. In pratica, data una sequenza di .add(), il layout decide come posizionare le componenti aggiunte. Dunque, generalmente la sequenza di codice per la creazione di un contenitore segue lo schema:
// istanziare il contenitore JPanel p = new JPanel() ; // istanziare il layout XXXLayout l = new XXXLayout() // settare il layout p.setLayout(l) ; // aggiungere componente 1 Component c1 = new Component() ; p.add(c1 [, parametri]) ; // aggiungere componente 2 Component c2 = new Component() ; p.add(c2 [, parametri]) ; // ... // aggiungere componente n Component cN = new Component() ; p.add(cN [, parametri]) ;

Vediamo di seguito alcuni tipi di layout.

java.awt.FlowLayout
Organizza le componenti una di fianco all'altra. E' possibile specificare se le componenti vengono ammucchiate a destra, a sinistra o al centro, con i flag: LEFT, RIGHT, CENTER.

Per decidere se le nuove componenti vengono affiancate alla destra o alla sinistra di quelle gi presenti si deve settare la component orientation del contenitore ad una tra: ComponentOrientation.LEFT_TO_RIGHT ComponentOrientation.RIGHT_TO_LEFT Attenzione: quando finisce lo spazio disponibile, le nuove componenti vanno "a capo".

Esempio
JPanel p = new JPanel(); p.setLayout(new FlowLayout()); p.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT) ; JButton button1 = new Button("Ok"); JButton button2 = new Button("Open"); JButton button3 = new Button("Close"); p.add(button1); p.add(button2); p.add(button3);

Vedere layouts/PannelloFlow.java

java.awt.BorderLayout
Organizza al massimo 5 componenti. Le componenti vengono disposte in base ad un flag: CENTER, NORTH, SOUTH, WEST, EAST.

Esempio
JPanel p = new JPanel(); p.setLayout(new BorderLayout()); p.add(new Jlabel("Pronto a partire?") ; // senza parametri CENTER p.add(new Button("Okay"), BorderLayout.SOUTH);

Vedere layouts/PannelloBorder.java

javax.swing.BoxLayout e javax.swing.Box
Il BoxLayout stato introdotto con le nuove librerie swing. Il suo uso si basa sull'idea che meglio un layout seplice, usato un sacco di volte, rispetto ad uno complicato che cerca di fare tutto (e normalmente non ci riesce). Il BoxLayout alline le componenti una di fianco all'altra o una sotto l'altra. A differenza del FlowLayout, le componenti non vanno a capo, ma sono sempre e comunque su una stessa liena o colonna. Combinando pi pannelli, ognuno con il suo BoxLayout, si possono ottenere le configurazioni volute. Il Box, un particolare pannello che di default possiede il BoxLayout invece del FlowLayout. Le componenti vengono disposte in orizzontale o in verticale secondo un flag passato al costruttore: X_AXIS, Y_AXIS. Esempio Il pannello del disegno che segue ha un BoxLayout orizzontale che contiene P1 e P2; ognuno dei quali ha un BoxLayout verticale che contiene altre tre componenti Cx.

Allineamento
Per rifinire l'allineamwento delle componenti, il BoxLayout permette di specificare delle componenti invisibili che fanno da "riempitivo" per le zone che vogliamo tenere vuote per forza. Questi riempitivi possono essere di due tipi: RigidArea e Glue. I disegni sono autoesplicativi.

- Rigid Area

- Glue Le glue e le rigid areas si istanziano con un metodi static di Box. Inoltre le glues si dividono in horizontal e vertical:
static Component createRigidArea(Dimension d) ; static Component createHorizontalGlue() ; static Component createVerticalGlue() ;

Vedere layouts/PannelloBox.java

Gestire gli eventi


Glieventi associati alle componenti grafiche (bottoni premuti, testo alterato) vengono gesiti con il meccanismo dei listeners. Un listener un oggetto che resta in ascolto di eventi scatenati da una componente grafica. Ad esempio, un bottone pu essere premuto. A questo tipo di azione associato un ActionListener. Se essere informato quando un bottone viene premuto devo aggiungergli un listener con il metodo . addListener(ActionListener l). Ma cos' un listener? In pratica un'interface. Sono io che devo creare un oggetto che implementi l'interface AcionListener e mettere nei suoi metodi il codice che deve essere eseguito. Insomma, come inserisco nel metodo paint il codice che deve essere eseguito quando il sistema operativo vuole aggiornare la finestra, allo stesso modo metto nel listener il codice che deve essere eseguito quando il bottone viene premuto. Esistono molti tipi di listener. Come convenzione sui nomi, il nome di un'interfaccia che rappresenta un listener ha come suffisso Listener. Il metodo per registrare un listener ad una componente ha il nome add<nome_listener>Listener().

Esempio
Prima definisco una classe che rappresenta un listener:
class MioListener implements QualcheListener { // .... implmento i metodi }

Poi aggiungo il listener a, per esempio, un bottone con:


JButton b = new JButton() ; MioListener l = new MioListener() ; b.addMioListener(l) ;

Alcuni Listeners
Vediamo alcuni listeners utili

ActionListener
L'interfaccia ActionListener appartiene al package java.awt.event. Contiene solo un metodo:
public void actionPerformed(ActionEvent e)

Questo il metodo che viene invocato quando un pulsante (JButton) stato premuto o quando viene premuto il tasto "enter" all'interno di un campo di testo (JTextField). Vedere listeners/EsempioActionListener.java

MouseListener
Il mouse listener utile per prendere ascoltare il comportamento dei tasti del mouse. Viene agganciato alle componenti con il metodo: .addMouseListener(MouseListener l) Normalmente viene agganciato a pannelli per creare applicazioni che usano il mouse in maniera personalizzata. I metodi del MouseListener sono:

void mouseClicked(MouseEvent e) Invoked when the mouse button has been clicked (pressed and released) on a component. void mouseEntered(MouseEvent e) Invoked when the mouse enters a component. void mouseExited(MouseEvent e) Invoked when the mouse exits a component. void mousePressed(MouseEvent e) Invoked when a mouse button has been pressed on a component. void mouseReleased(MouseEvent e) Invoked when a mouse button has been released on a component.

MouseMotionListener
Fratello del MouseListener, si occupa di ascoltare eventi sullo spostamento del mouse. Viene agganciato con il metodo: .addMouseMotionListener(MouseMotionListener l) I suoi metodi sono:

void mouseDragged(MouseEvent e) Invoked when a mouse button is pressed on a component and then dragged. void mouseMoved(MouseEvent e) Invoked when the mouse cursor has been moved onto a component but no buttons have been pushed.

Il MouseEvent
Questa classe, che viene automaticamente istanziata dal sistema ogni volta che arriva un evento, contiene informazioni utili sullo stato del mouse e dettagli dell'evento. Prima di tutto, possibile conoscere le coordinate del mouse nell'istante in cui sono stati scatenati gli eventi. Questo si fa con i metodi:
public int getX() ; public int getY() ;

Inoltre, in caso di eventi legati alla pressione dei tasti del mouse, si puo' sapere quale dei tre tasti del mouse stato premuto. Il metodo:
public int getButton() ;

restituisce un identificatore che pu essere: MouseEvent.BUTTON_1 (tasto sinistro), MouseEvent.BUTTON_2 (tasto centrale), MouseEvent.BUTTON_3 (tasto destro).

You might also like