L interfaccia grafica con Java 1/24 L interfaccia utente serve per la comunicazione tra utente e programma Distinguiamo le interfacce tra quelle a caratteri e quelle grafiche Le GUI (Graphical user interface) sono quelle composte da finestre bottoni icone immagini In Java AWT (Abstract Window Toolkit) è la parte che si occupa di gestire l interfaccia utente. E contenenuta nel package java.awt Il package SWING rappresenta l evoluzione di AWT nella costruzione delle interfacce porta grafiche. Si importa con javax.swing Su cosa si basa una interfaccia grafica? Sui Componenti (bottoni, etichette, aree di testo etc) Sui contenitori (la finestra, il pannello etc) altri oggetti di supporto (Gestori di Layout, Gestori di eventi) Pag 1
Package AWT Il Contenitore Frame La finestra si realizza tramite la classe Frame Frame f = new Frame ( Primo Programma ); oppure Frame f = new Frame( ); Metodi per modificare la finestra: La dimensione: f.setsize ( 100,100); La posizione : f.setlocation (200,200); La visibilità : f.setvisible (true); Il Contenitore Panel E un contenitore intermedio rispetto al Frame. Dentro una Frame ci possono essere più Panel Si realizza con Panel p = new Panel ( ); Il metodo add aggiunge componenti al Panel o al Frame oppure Panel al Frame in questo modo: f.add(p); per colorare un pannello si usa questo metodo: p.setbackground(color.red); Pag 2
I componenti di AWT Le etichette Ecco la Label con 3 possibili costruttori: Label( ); Label( Ciao ); Label( Ciao,Label.LEFT); Creare una etichetta, aggiungerla Cambiare i colori alle etichette: Label et= new Label( ); et.setbackground(color.red); et.setforeground(color.yellow); I bottoni Button( ); Button( Premi ); Creare un Bottone, disabilitarlo, abilitarlo: Button b1 = new Button ( OK ); b1.setenabled(true); b1.setenabled(false); Pag 3
Le Caselle di testo La creo con: TextField tf=new TextField( ); Ha 4 tipi di costruttori: TextField( ); TextField( inserisci ); TextField( 10); TextField( inserisci,10); Ha 3 metodi importanti: esempio: tf.settext( cognome ); s=tf.gettext( ); tf.seteditable(false); Le aree di testo Creazione: TextArea ta = new TextArea( ); Ha 4 costruttori: TextArea( ); TextArea(5,10 ); TextArea( Prima Riga ); TextArea( Prima Riga,5,10,SCROLLBARS_BOTH); E i metodi: settext( ); gettext( ); seteditable(true); append( nuova riga ); Pag 4
Le caselle combinate Le combobox vanno create e poi si aggiungono voci all oggetto: Choice cb= new Choice( ); ATTENZIONE: Choice è in AWT, in SWING la classe è JComboBox Metodo per aggiungere nella tendina: cb.additem( rosso ); cb.additem( verde ); cb.additem( bianco ); Metodo per acquisire la scelta selezionata: Int x=getselecteditem ( ); Metodo per selezionare una voce della tendina: Int x=setselecteditem ( 5); String x=setselecteditem ( Rosso ); Pag 5
Layout degli elementi grafici I componenti grafici vengono aggiunti al Frame o ad un Panel, ma come si dispongono dipende dal LayoutManager Tre tipi di Layout FlowLayout BorderLayout GridLayout Esempi: dopo Panel p =new Panel( ) scelgo quale setlayout è il piu adatto alla mia finestra p.setlayout(new FlowLayout()); p.setlayout(new BorderLayout()); p.setlayout(new GridLayout(3,2,10,10)); Con il Package swing la gestione del Panel è diversa: Vediamolo con un esempio completo, la differenza però à nell ultima riga: JPanel p =new JPanel(); JPanel p1=new JPanel(); JPanel p2=new JPanel(); JPanel p3=new JPanel(); p.setlayout(new BorderLayout()); p1.add(bottone); p2.add(campotesto); p3.add(testoarea); p.add(p1,"west"); p.add(p2,"center"); p.add(p3,"east"); f.getcontentpane().add(p); p p1 p2 p3 Pag 6
Posizionamento assoluto della finestra Si può disattivare il LayoutManager con p.setlayout(null); e impostare la posizione assoluta nel componente nella finestra. Ma in questo caso è consigliabile disattivare il ridimensionamento della finestra setbounds(100,100,10,10) indica la posizione x y del componente, la larghezza e l altezza del componente Esempio: p.setlayout(null); Button b1=new Button ( OK ); p.add(b1); b1.setbounds(50,50,25,25); Pag 7
Costruire queste interfacce Grafiche Esercizio 1 Esercizio 2 Esercizio 3 Pag 8
Per realizzare la gestione degli eventi si deve: 1. Creare uno o più ascoltatori in base agli eventi che si vogliono gestire 2. Registrare l ascoltatore in un oggetto origine che si vuole controllare 3. Gestire l evento eseguendo il metodo associato Creare l ascoltatore Ogni ascoltatore ha un interfaccia, esiste l interfaccia delle finestre (WindowListener), dei bottoni (ActionListener), del Mouse (MouseListener), e della Tastiera (KeyListener ) La parola chiave implements specifica che la classe implementa una particolare interfaccia class MyGestore implements ActionListener Le interfacce che gestiscono gli eventi sono contenute nel package import java.awt.event.* ; E obbligatorio che tutti i metodi di un ascoltatore siano presenti anche se vuoti, (in quanto metodi astratti), essi contengono le istruzioni da eseguire se accade quell evento. Ogni metodo degli ascoltatori riceve come parametro l evento che è stato generato. public void actionperformed (ActionEvent e) Registrazione presso l origine Predisposti gli ascoltatori, si devono scegliere gli oggetti origine, cioè quegli oggetti che possono generare un evento e ai quali si vuole associare una risposta. Ogni componente ha i metodi per registrare un particolare ascoltatore: per i bottoni addactionlistener per le finestre addwindowlistener Pag 9
esempio b.addactionlistener(new MyGestore( )); oppure MyGestore gest=new MyGestore( ); b1.addactionlistener(gest); b2.addactionlistener(gest); Modialità di esecuzione L interfaccia Action Listener contiene un solo metodo astratto che deve essere ridefinito: actionperformed( ) Siccome possono esistere più bottoni che generano un evento si puo fare riferimento allo stesso ascoltatore ed eseguire un controllo all interno del metodo per verificare quale bottone è stato premuto. Il metodo ActionPerformed riceve come parametro un oggetto di classe ActionEvent. I metodi getactioncommand( ); esempio String s= e.getactioncommand( ); getsource( ); esempio if ( b==e.getsource( )) Ci offrono due possibilità di acquisire informazioni sull oggetto che ha generato l evento. Pag 10
Gestione degli eventi in Java Un esempio concreto MyApp_1.j ava import java.awt.*; import javax.swing.*; import java.awt.event.*; public class MyApp_1 extends JFrame public MyApp_1 ( ) crea_interfaccia_grafica; x.addactionlistener (new Ascolta ( )); public class void main (String args[]) new MyApp_1 ( ); MyApp_1 è il programma Ascolta è la classe ascoltatore che implementa l interfaccia ActionListener Ascolta.java public class Ascolta implements ActionListener private. public Ascolta ( ) public void actionperformed( Action Event e) System.out.println( hai premuto + e.getactioncommand( )); X è il bottone che genera l evento e viene descritto in actionperformed Cliccando sul bottone viene stampata la scritta che descrive il bottone stesso. Lo facciamo attraverso il metodo actionperformed e il metodo getactioncommand Pag 11
Possiamo usare un unico file MyApp_1.java import java.awt.*; import javax.swing.*; import java.awt.event.*; public class MyApp_1 extends JFrame public MyApp_1 ( ) crea_interfaccia_grafica; x.addactionlistener (new Ascolta ( )); setvisible(true); public class void main (String args[]) new MyApp_1 ( ); class Ascolta implements ActionListener private. public Ascolta ( ) public void actionperformed( Action Event e) System.out.println( hai premuto + e.getactioncommand( )); Pag 12
Il nostro primo clic in Java Creare un interfaccia grafica con un bottone e una label. Cliccando sul bottone, al posto di Ancora niente compare Hai cliccato La finestra si disegna nel costruttore della classe MyAppl Registro l origine dell evento clic del Mouse sempre nel costruttore Es: b.addactionlistener(new MyGestore(et)); Scrivo il main della mia classe che consiste nella sola creazione dell oggetto della classe finestra public static void main (String args[]) new MyAppJ1 ( ); Creo la classe ascoltatore che implementa l interfaccia ActionListener class MyGestoreJ1 implements ActionListener Definisco il metodo che realizzerà il cambio dell etichetta della label attraverso il metodo settext( Hai cliccato ) public void actionperformed (ActionEvent e) et.settext("hai cliccato!"); Pag 13
Il Programma completo import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MyAppJ1 extends JFrame MyAppJ1( ) JFrame f=new JFrame ("My Applicazione 1"); JPanel p=new JPanel(); JLabel et=new JLabel ("Ancora niente"); JButton b=new JButton ("Premi Bottone"); p.add(b); p.add(et); et.setbackground(color.yellow); et.setforeground(color.blue); p.setbackground(color.yellow); f.getcontentpane().add(p); //f.add(p); f.setsize(300,200); f.setlocation(0,0); f.setdefaultcloseoperation(jframe.exit_on_close); b.addactionlistener(new MyGestore(et)); f.setvisible(true); public static void main (String args[]) new MyAppJ1 ( ); class MyGestore implements ActionListener private JLabel et; public MyGestore (JLabel et) this.et=et; public void actionperformed (ActionEvent e) et.settext("hai cliccato!"); System.out.println(e.getActionCommand()); Pag 14
Esercizio 1 Cliccando sul bottone, nel text field viene sostituita la scritta ancora niente con Hai cliccato! Esercizio 2 Cliccando sul bottone, nel text field viene conteggiato il numero di clic Pag 15
Esercizio 3 Inserire due bottoni: uno colora il pannello di giallo, l altro di rosso, nel textfield compare il nome del bottone cliccato Esercizio 4 Collocare un bottone, un textfield e una textarea. Scrivendo nel textfield e cliccando sul bottone la textarea si riempie una riga alla volta e la textfield si svuota dopo ogni clic Pag 16
Esercizio 5 Inserire una Label, una combobox con un certo numero di colori, un bottone. Apro la combobox, scelgo il colore, clicco sul bottone e il pannello cambia colore Esercizio 6 Disegnare la calcolatrice con i 12 bottoni e la TextField. Cliccando sui bottoni, nella textfield compare il numero corrispondente. Ma ogni clic sostituisce il numero precedente. Il numero è allineato a destra, la cornice del textfield è più spessa, il carattere è Arial size 12 Pag 17
Esercizio 7 Ora i numeri dei bottoni si aggiungono uno dopo l altro nella TextField. Premendo CE la TextField va 0 (zero) Esercizio 8 Realizziamo ora una semplice calcolatrice Digito un numero, poi un operazione, un secondo numero, e poi con = ottengo il risultato dell operazione Pag 18
Conversioni Da stringa ad intero: int num=integer.parseint( s ); oppure int num= Integer.valueOf( s ).intvalue( ); Da intero a Stringa s= +num; GUIDA X GUI - JAVA Se ho tanti bottoni non ho bisogno di istanziare ogni volta lo stesso ascoltatore Per registrare l Ascoltatore Se ho tanti bottoni non ho bisogno di istanziare ogni volta lo stesso ascoltatore.. JButton b9=new JButton ("9"); JButton b8=new JButton ("8"); JButton b7=new JButton ("7"); JButton b6=new JButton ("6"); JButton b5=new JButton ("5"); JButton b4=new JButton ("4"); JButton b3=new JButton ("3"); JButton b2=new JButton ("2"); JButton b1=new JButton ("1"); b0.addactionlistener(new MyGestore(tf)); b1.addactionlistener(new MyGestore(tf)); b2.addactionlistener(new MyGestore(tf)); b3.addactionlistener(new MyGestore(tf)); b4.addactionlistener(new MyGestore(tf)); b5.addactionlistener(new MyGestore(tf)); b6.addactionlistener(new MyGestore(tf)); b7.addactionlistener(new MyGestore(tf)); b8.addactionlistener(new MyGestore(tf)); b9.addactionlistener(new MyGestore(tf));... class MyGestore implements ActionListener JTextField tf; public MyGestore (JTextField tf) this.tf=tf; public void actionperformed (ActionEvent e) JButton b9=new JButton ("9"); JButton b8=new JButton ("8"); JButton b7=new JButton ("7"); JButton b6=new JButton ("6"); JButton b5=new JButton ("5"); JButton b4=new JButton ("4"); JButton b3=new JButton ("3"); JButton b2=new JButton ("2"); JButton b1=new JButton ("1"); MyGestore gest = new MyGestore(tf); b0.addactionlistener(gest); b1.addactionlistener(gest); b2.addactionlistener(gest); b3.addactionlistener(gest); b4.addactionlistener(gest); b5.addactionlistener(gest); b6.addactionlistener(gest); b7.addactionlistener(gest); b8.addactionlistener(gest); b9.addactionlistener(gest);.. class MyGestore implements ActionListener JTextField tf; public MyGestore (JTextField tf) this.tf=tf; public void actionperformed (ActionEvent e) Pag 19
Alcuni metodi utili Cambiare il font di un oggetto Font prova=new Font("Courier",Font.BOLD,16); ta.setfont(prova); Modificare l allinamento di un oggetto tf.sethorizontalalignment(swingconstants.center); tf.sethorizontalalignment(swingconstants.right); Cambiare i colori di un oggetto p1.setbackground(color.red); p1.setforeground(color.yellow); Chiudere l applicazione insieme alla finestra f.setdefaultcloseoperation(jframe.exit_on_close); Impedire la scrittura in un oggetto di input tf.seteditable(false); Pag 20
Inserire un immagine con Java GUIDA X GUI - JAVA Creo un oggetto JLabel che chiamo per esempio immagine private JLabel immagine=new JLabel(); Lo inserisco in un panello p2.add(immagine); Utilizzo il metodo seticon e la classe ImageIcon per inserire l immagine nel pannello immagine.seticon(new ImageIcon("Classe3g.jpg")); Pag 21
Esercizio Creare tanti bottoni quante sono le immagini che hai in memoria (hard disk) relative a: gli studenti della classe oppure i giocatori della tua squadra oppure le città d Italia Cliccando sul bottone si inserisce nel pannello l immagine che ha il nome del bottone a cui aggiungo l estensione.jpg Per esempio: clicco su Rossi, si inserisce l immagine rossi.jpg Al contrario di altri programmi java non da errore se il file non è presente. Pag 22
Creare un programma a Menù con Java GUIDA X GUI - JAVA Le classi con cui gestisco il menu sono: JMenuBar JMenu JMenuItem JMenuBar è la barra su cui appoggio le voci del menu : File Modifica Formato.. La dichiaro con JMenu barra = new JMenuBar(); e al termine la inserisco con this.setjmenubar(barra) JMenu JMenu menu poi menu=new JMenu( File ); barra.add(menu); inserisco File nella barra del menu ed ora le voci che compongono File: Nuovo Apri Salva etc: JMenuItem JMenuItem voce voce=new MenuItem( Nuovo ); menu.add(voce); voce.addactionlistener(this); proseguo poi con il menu Modifica menu=new JMenu( Modifica ); barra.add(menu); e le voci del menu Modifica ( ) Pag 23
Le import da utilizzare import java.awt.*; import java.awt.event.*; import javax.swing.text.*; import java.io.*; import javax.swing.*; import java.util.*; Come collocare un file di testo in una TextArea int status = fch.showopendialog(this); if (status==jfilechooser.approve_option) try File f = fch.getselectedfile(); FileReader x=new FileReader(f); testo.read(x,null); settitle(f.getname()); catch (IOException ev) Come salvare una TextArea in un file di testo int status = fch.showsavedialog(this); if (status==jfilechooser.approve_option) try File f = fch.getselectedfile(); FileWriter x=new FileWriter(f); testo.write(x); settitle(f.getname()); catch (IOException ev) fch è un oggetto dichiarato: private JFileChooser fch = new JFileChooser(); Pag 24