Inserire il floppy personale per salvare le esercitazioni nel dirive A:
Aprire il file fond1eo\Es8.htm per leggere e seguire l'esercitazione
Ridurre le dimensioni della finestra che deve restare visibile ma consentire
la visibilità di un'altra nuova finestra
Interfaccia grafica
La GUI (Graphical User Interface) di un programma è normalmente basata su
Componenti come:
Label: area di testo, non editabile dall’utente, dove vengono visualizzate le 'etichette'
Button: area che aziona un evento quando viene cliccata
TextField: riga di testo in cui l’utente fa input dalla tastiera e/o che
può anche essere utilizzata per visualizzare dati.
TextArea: area di testo in cui l’utente fa input dalla tastiera e/o che
può anche essere utilizzata per visualizzare dati.
Choice: lista a tendina (drop-down) di elementi tra cui l’utente può
sceglire facendo click sull’elemento voluto
Checkbox: una componente boolena che può essere selezionata oppure no
List: area dove una lista di elementi viene visualizzata e tra cui l’utente può sceglere con un
click singolo. Doppio click genera un evento
Contenitori
intermedi, invisibili:
Panel: in cui disporre i componenti la GUI
principali, come:
Applet
Frame: finestra dotata di una cornice, che
comprende, tra l’altro, la barra del titolo della finestra
Dialog: finestra di dialogo
Gestori
di layout: per favorire l'inserimento dei componenti nei contenitori
degli eventi: per consentire l'interazioni tra l’utente e i vari elementi dell’interfaccia
grafica
Le API di Java forniscono classi AWT (Abstract Windowing Toolkit)
e Swing (nuova tecnologia di JAVA2) per realizzare interfacce grafiche
Gli oggetti grafici Swing derivano tutti dall'oggetto AWT Container, si
dispongono in un JPanel secondo uno schema eventualmente definito da un
LayoutManager. Tutti i JPanel relaizzati vegono infine inseriti nel JFrame.
Classi JFrame e JPanel
Come struttura generale è consigliabile
import javax. swing.*;
public class < nome dell'applicazione > extends JFrame {
< costruttore con richiamo al metodo d'inizializzazione >
< definizione del metodo per l'inizializzazione dell'interfaccia >
< di altri metodi >
< definizioni dei componenti dell'interfaccia >
< di altri attributi >
public static void main( String[] args) {
/* crea ed avvia una nuova applicazione della classe definita */
new < nome dell'applicazione >();
}
}
Realizzare e lanciare un'applicazione come la seguente per realizzare un primo semplice
esempio di interfaccia grafica
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Color;
//Applicazione che visualizza una frame sullo schermo
public class ProvaJFrame extends JFrame {
//Costruttore che inizializza
public ProvaJFrame() {
//stabilisce le dimensioni della frame
setSize( 300, 200);
//assegna un titolo alla frame
setTitle(" Una semplice interfaccia grafica");
//imposta colore al pannello
getContentPane().setBackground(Color.red);
//crea un componente etichetta
JLabel testo=new JLabel("questo testo");
//imposta il colore del componente
testo.setForeground(Color.white);
//aggiunge il componente sul pannello
getContentPane().add(testo);
// visualizza la frame
show();
// per terminare con la chiusura della frame
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main( String[] args) {
// crea una nuova Frame del tipo ProvaFrame
new ProvaJFrame();
}
}
Modificare la precedente applicazione in modo da visualizzare la
somma dei primi 1000 numeri naturali
Di norma, i componenti non vanno inseriti direttamente nel
contenitore principale per l’interfaccia grafica, ma vanno
piuttosto inseriti in un pannello, usato come contenitore
intermedio; dopo aver inserito tutti i componenti nel contenitore
intermedio, il contenitore intermedio va inserito nel
contenitore principale.
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax. swing.JLabel;
import javax. swing.JTextField;
// Applicazione che visualizza una frame sullo schermo.
public class ProvaJFramePanel extends JFrame{
// Costruttore che lancia l'inizializzazione.
public ProvaJFramePanel() {
//assegna un titolo alla frame
setTitle(" Una semplice interfaccia grafica");
// inizializza l'interfaccia dell'applicazione
inizializzaGUI();
// dimensiona e visualizza la frame
pack();
show();
// per terminare con la chiusura della frame
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
}
// Inizializza l'interfaccia dell'applicazione.
private void inizializzaGUI() {
// crea pannello, usato come contenitore intermedio
JPanel mioPannello= new JPanel();
// crea i componenti dell'interfaccia
etichetta = new JLabel(" Scrivi il tuo nome");
// crea una riga di testo lunga 30 caratteri
rigaTesto = new JTextField( 30);
// aggiunge i componenti al pannello
mioPannello.add(etichetta);
mioPannello.add(rigaTesto);
// aggiunge il pannello alla frame
this.getContentPane().add(mioPannello);
}
//gli attributi:
private JLabel etichetta; // un oggetto etichetta
private JTextField rigaTesto; // un oggetto riga di testo
public static void main( String[] args) {
// crea una nuova Frame del tipo descritto
new ProvaJFramePanel();
}
}
Modificare la precedente applicazione in modo da visualizzare
nella riga di testo, preceduta da un'etichetta opportuna, una sequenza
di cinque numeri a caso tra 1 e 90
Gestione di eventi
L'interazione tra l'utente e un'interfaccia grafica costituisce
un 'evento' che deve essere previsto e gestito dall'applicazione.
Componenti sui quali avviene l'azione, eventi e gestori sono tutti oggetti:
gli eventi sono oggetti della classe EventObject
i gestori sono oggetti di classi che estendono l'interfaccia EventListener
(un modulo 'Interfaccia' ha la stessa struttura di un modulo classe ma dichiara solo
dei metodi pubblici, senza definirli, e delle costanti; tali metodi dovranno poi essere definiti dalle classi che
implementano l'interfaccia, in modo tale da rendere possibile il "polimorfismo": la possibilità
che uno stesso metodo agisca su oggetti di natura diversa)
le sorgenti entro cui avviene l'evento sono componenti che debbono
essere registrate presso opportuni gestori
Ad esempio l'evento potrebbe essere premere [invio] al termine dell'inserimento di una riga di testo
in un JTextField. L'interfaccia ActionListener viene implementata nella classe che gestisce l'evento
e un oggetto di questa classe viene associato al componente mediante il metodo addActionListener.
Quando accade l'evento, viene invocato il metodo actionPerformed dichiarato nell'interfaccia e definito
per quella classe;
ad esempio può leggere il contenuto di un JTextField con il metodo getText() o scrivervi con il metodo
setText(<stringa>).
La precedente applicazione viene arricchita
aggiungendo una semplice possibilità d'interazione: un input
da tastiera.
import javax. swing.JFrame;
import javax. swing.JPanel;
import javax. swing.JLabel;
import javax. swing.JTextField;
import java.awt.event.*;
// Applicazione che visualizza una frame sullo schermo.
public class ProvaJFrameIO extends JFrame{
// Costruttore
public ProvaJFrameIO() {
setTitle(" Una frame semplice");
setSize( 300, 200);
inizializzaGUI();
pack();
show();
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
}
// Inizializza l'interfaccia dell'applicazione.
private void inizializzaGUI() {
// crea pannello, usato come contenitore intermedio
JPanel mioPannello= new JPanel();
// crea i componenti dell'interfaccia
etichetta = new JLabel(" Scrivi il tuo nome :");
rigaInput = new JTextField(30);
// aggiunge al componente 'rigaInput' il gestore
// dell'evento 'pressione del tasto return'
GestEvento mio= new GestEvento();
rigaInput.addActionListener(mio);
// aggiunge i componenti al pannello
mioPannello.add(etichetta);
mioPannello.add(rigaInput);
// aggiunge il pannello alla frame
getContentPane().add(mioPannello);
}
// definisce la modalità di gestione dell'evento
class GestEvento implements ActionListener{
public void actionPerformed(ActionEvent e){
rigaInput.setText(rigaInput.getText()+"...che bel nome! \n");
}
}
private JLabel etichetta; // una etichetta
private JTextField rigaInput; // una riga di testo
public static void main( String[] args) {
// crea una nuova Frame
new ProvaJFrameIO();
}
}
Modificare l'applicazione in modo che inverta il nome digitato
Modificare l'applicazione inserendo una JTextArea come area di output
distinta dalla riga di input
La realizzazione di una interfaccia grafica richiede normalmente la
creazione e il posizionamento di numerosi componenti, cosa non molto
agevole.
Vengono usati allora degli strumenti 'Visual' di programmazione (GUI editor)
dedicati alla realizzazione di interfacce grafiche, disponibili in numerosi IDE.
il programmatore può selezionare componenti dalla barra
degli strumenti del GUI editor, esaminare e modificare le proprietà
dei componenti, scrivere le porzioni di codice
relative alla logica applicativa dell’applicazione,
mentre il GUI editor genera automaticamente la
parte standard del codice dell’interfaccia grafica
Trasformare una JFrame in una JApplet
Avendo seguito lo stile suggerito precedentemente si può facilmente
trasformare un'applicazione con interfaccia grafica in un'applet
import javax. swing.JApplet;
import javax. swing.JPanel;
import javax. swing.JLabel;
import javax. swing.JTextField;
import java.awt.event.*;
// Applicazione che visualizza una frame sullo schermo.
public class ProvaJApplet extends JApplet{
// Costruttore
public ProvaJApplet() {
// inizializza l'interfaccia dell'applet
inizializzaGUI();
}
// Inizializza l'interfaccia dell'applet.
private void inizializzaGUI() {
// crea pannello, usato come contenitore intermedio
JPanel mioPannello= new JPanel();
// crea i componenti dell'interfaccia
etichetta = new JLabel(" Scrivi il tuo nome :");
rigaInput = new JTextField(30);
// aggiunge al componente 'rigaInput' il gestore
// dell'evento 'pressione del tasto return'
GestEvento mio= new GestEvento();
rigaInput.addActionListener(mio);
// aggiunge i componenti al pannello
mioPannello.add(etichetta);
mioPannello.add(rigaInput);
// aggiunge il pannello alla frame
getContentPane().add(mioPannello);
}
// definisce la modalità di gestione dell'evento
class GestEvento implements ActionListener{
public void actionPerformed(ActionEvent e){
rigaInput.setText(rigaInput.getText()+"...che bel nome! \n");
}
}
private JLabel etichetta; // una etichetta
private JTextField rigaInput; // una riga di testo
public static void main( String[] args) {
// crea una nuova Frame
new ProvaJApplet();
}
}
realizzare un'applet che letti una serie di numeri in una riga di input
calcoli media e scarto quadratico medio e lo visualizzi in un'altra riga di testo.
NOTA: Al termine di ogni sessione di lavoro fare una copia del floppy e poi
spegnere il computer con Start/Chiudi sessione/Arresta il sistema.
pagine di Roberto Ricci
L.S. "A. Righi", Bologna.
Ultima revisione