• Non ci sono risultati.

Ing . F ra n c o Z a m b o n e lli

N/A
N/A
Protected

Academic year: 2021

Condividi "Ing . F ra n c o Z a m b o n e lli"

Copied!
34
0
0

Testo completo

(1)

Denti, Zambonelli - GRAFICA in JAVA - 1

U n iv e rs it à d e g li S tud i d i M od e n a e R e gg io E m ili a

F ac o lt à d i Ing e g n e ri a

C O R S O D I

F O N D A M E N T I D I I N F O R M A T IC A II L in g u a g g io Ja va : L a G ra fica e L a P rog ra m m a z io n e a d E v e n ti

Ing . F ra n c o Z a m b o n e lli

Lu c id i rea li zz a ti i n c o ll a bo ra z ion e c o n Ing . E n ri c o D e n ti - U n iv . B o logn a

A n no A cc a d e m ic o 1 9 99 /2 000

Denti, Zambonelli - GRAFICA in JAVA - 2

J A V A E L A G RA F ICA

L ’a rc h ite tt u ra J a v a è g ra p h ics -r e a d y

P a ck a g e java.awt

il p rim o pa ck a ge g ra fic o (J a v a 1 .0 )

in d ip e n d en te da lla p ia tt a fo rm a ... o qua s i!

P a ck a g e javax. s wing

il n u o v o p a ck age g ra fic o ( J a v a 2 ; v e rs io n e p re lim ina re da J a v a 1 .1 .6 )

sc ritt o e ss o s te ss o in J a v a , rea lm en te ind ip e n d en te d a lla p ia tt a fo rm a

S W IN G : A R CH IT E TT U R A

S w in g de fin isc e una g e ra rc h ia d i c la s s i c he fo rn isc o n o o g n i tipo d i c o m p o nen te g ra fic o

fine s tr e , p a nne lli , f ra m e , bo tt o n i, a re e d i te s to , c he c k b o x , lis te a d is c e s a , e tc e tc

P rog ra m m a z ion e e v e n t- d ri v e n :

non p iù a lgo rit m i s til e inpu t/ e la b o ra z io n e /ou tp u t...

... m a re a z io ne a g li e v en ti c he l’u ten te , in m odo in te ra tt iv o , ge n e ra s u i c o m p o n e n ti g ra fic i

C on c e tt i d i e v en to e d i a sc o lta to re de g li e v en ti

S i può c o n s ide ra re un p a ra d ig m a d i p rog ra mm a z ion e a s é s tan te !!

(2)

Denti, Zambonelli - GRAFICA in JAVA - 3

S W IN G: G ERARCH IA D I C L A SS I

Component

Container

Window

JFrameJDialog FrameDialog JComponent JLabel

JList

JMenuBar

JPanel

JScrollBar

JTextComponent

JTextFieldJTextArea AbstractButton Object

Denti, Zambonelli - GRAFICA in JAVA - 4

S W IN G: G ERARCH IA D I C L A SS I

C on ta in e r: t u tt i i c o m ponen ti p rin c ip a li s o no c o n te n ito ri, de s tin a ti a c on te ne re a ltr i c o m p o n en ti W in d o w : le fine s tr e s o n o c a s i p a rti c o la ri d i c o n te n iro ri e s i d is tin gu o no in fr a m e e fin e s tr e d i d ia lo g o J fr a m e : c o m p o n e n te fin e s tr a p rin c ip a le : h a un a s pe tt o g ra fic o , una c o rn ic e rid im en s io n ab ile e u n tit o lo Jc o m pon e n t: è il gene ric o c o m po n en te g ra fic o J p a n e l: il pa n ne llo , un c o m po ne n te de s tina to a c o n te n e re a ltr i c o m p o n e n ti g ra fic i p e r o rg a n izz a rli

JMenuItem JButton

JToggleButton

JRadioButtonJCheckBox AbstractButton

(3)

Denti, Zambonelli - GRAFICA in JAVA - 5

S W IN G: UN ESE M P IO

La p iù s e m p lic e a p p lic a z io ne g ra fic a c on s is te in u na c la ss e il c u i m a in c rea un J F ra m e e lo re n d e v is ib ile c o l m e to do s h o w () :

import java.awt.*; import javax.swing.*; public class EsSwing1 { public static void main( String[] v){ JFrame f = new JFrame("Esempio 1");

// crea un nuovo JFrame Inizialmente invisibile // con titolo "Esempio 1" f .show(); // mostra il JFrame } }

R IS U L T A T O :

I c o m and i s ta nda rd d e lle fine s tr e s o no g ià a tt iv i

A T T E N Z IO N E : la c h iu s u ra n on d is tr u g ge il F ra m e m a lo na sc o n d e s o lta n do . P e r c h iu de rlo e ff e tt iv a m en te c i v uo le C tr l+ C

Denti, Zambonelli - GRAFICA in JAVA - 6

S W IN G: ESE M P IO 1

C on rif e rim en to a ll'e s e m p io p re c e d en te :

La fine s tr a c he c o s ì na sc e ha p e rò d im e n s io n i n u lle (b is o g n a a lla rga rla "a m an o ")

P e r im po s ta re le d im en s io n i d i un q u a lu n que c on te n ito re s i u s a setSize() , c he ha c o m e p a ra m e tr o u n o p po rtu no og g e tt o d i c la ss e Dimension :

f .setSize( new Dimension(300,150));

// le misure x , y sono in pixel // tutto lo schermo: 800*600, 1024*768, etc.

Ino ltr e , la fin e s tr a v iene v is u a liz z a ta n e ll'a n g o lo s u pe rio re s in is tr o d e llo sc he rm o

P e r im po s ta re la po s iz io n e d i u n q u a lu n q ue c o n te n ito re s i u s a setLocation() :

f .setLocation(200,100));

// ( 0,0) = angolo superiore sinistro

P o s iz io ne e d im e n s ion i s i p o ss o no a n c h e fiss a re in s ie m e , c o l m e to d o setBounds()

(4)

Denti, Zambonelli - GRAFICA in JAVA - 7

S W IN G: ESE M P IO M IG L IO RA T O

U n e s e m p io d i fine s tr a g ià d im e n s io na ta e c o llo c a ta n e l pun to p re v is to de llo sc h e rm o :

import java.awt.*; import javax.swing.*; public class EsSwing1 {

public static void main( String[] v){ JFrame f = new JFrame("Esempio 1"); f .setBounds(200,100, 300,150) f .show(); } } PE R S O NA L IZ Z A R E IL JF RA M E

U n a pp ro cc io e ff icace c on s is te n e ll' es te nd e re JFrame , d e fin e nd o un a nu o v a c la s se :

public class MyFrame extends JFrame { public MyFrame(){ super(); setBounds(200,100,300,150); } public MyFrame( String titolo){ super(titolo);

s etBounds(200,100, 300,150); } }

Denti, Zambonelli - GRAFICA in JAVA - 8

ESE M P IO 2

Q u es to ese m p io u sa un MyFrame :

import java.awt.*;

import javax.swing.*;

public class EsSwing2 { public static void main( String[] v){ MyFrame f = new MyFrame ("Esempio 2"); // posizione (200,100) dimensione (300,150) f .show();

} }

(5)

Denti, Zambonelli - GRAFICA in JAVA - 9

S T R U TT U R A D E L F RA M E

In S w ing n on s i po ss o no a gg iu n ge re nuo v i c o m p o n en ti d ire tt a m e n te a l Jframe P e rò …

D en tr o a o g n i JFrame c 'è un Container , re c upe ra b ile c o l m e todo getContentPane() : è a lu i c h e v an n o a gg iun ti i nuo v i c o m p onen ti

T ip ic a m en te , s i agg iu n g e un p an ne llo (u n JPanel o u na no s tr a v e rs ione p iù s pe c ifi c a ), t ra m ite il m e to do add()

s u l p a n n e llo s i p u ò d is eg n a re (fo rm e , im m a g in i... )

... o agg iu nge re p u ls a n ti, e tic he tt e , ic o ne , (c io è ag g iu n g e re a ltr i c o m p o n en ti! )

ESE M P IO 3

A gg iun ta d i un p a n ne llo a l Container d i un fr a m e , t ra m ite l'u s o d i getContentPane() :

import java.awt.*; import javax.swing.*;

public class EsSwing3 { public static void main( String[] v){ MyFrame f = new MyFrame("Esempio 3"); Container c = f.getContentPane(); JPanel panel = new JPanel(); c. add ( panel); f.show();

}} N O T A : n o n ab b ia m o d is e g n a to n ien te , n é a g g iu n to c o m p o n e n ti, s u l p a nn e llo ! P e rò , a v e n do , il p a n ne llo , po tr e mm o u s a rlo pe r d is e g na re e in s e rir e a ltr i c o m p on e n ti!

Denti, Zambonelli - GRAFICA in JAVA - 10

D ISE G NA R E S U UN P A N N E LL O

P e r d is e g n a re s u u n p a nn e llo o cc o rr e :

de fin ire u na p rop ria c la ss e ( MyPanel ) c h e e s te n da il

JPanel o rig ina le

in ta le c la ss e , ride fin ire paintComponent() , c he è il m e todo (e re d ita to da JComponent ) c he s i o cc u pa d i d is e gna re il c o m p o nen te

A TT E N Z IO N E : il nuo v o paintComponent() da n o i de fin ito de v e s e m p re ric h ia m a re il m e to d o

paintComponent() o rig in a le , t ra m ite super

Il no s tr o p a nne llo pe rs o n a lizz a to :

public class MyPanel extends JPanel { // nessun costruttore, va bene il default public void paintComponent(Graphics g){ super.paintComponent(g); ... // qui aggiungeremo le nostre istruzioni di // disegno… // g è un oggetto gestito dal sistema a cui ci si // rivolge per disegnare } }

Graphics g , d i c u i n o n c i do b b ia m o o c c u p a re e s p lic ita m e n te , è l'o g ge tt o d e l s is te m a c h e e ff e tt iv a m e n te d is e gna c iò c he g li o rd in ia m o

(6)

Denti, Zambonelli - GRAFICA in JAVA - 11

D ISE G NA R E S U UN P A N N E LL O

Q ua li m e to d i p e r d is e g n a re ?

drawImage() , drawLine() , d r awRect() ,

drawRoundRect() , draw3DRect() , d r awOval() ,

drawArc() , drawString() , d r awPolygon() , drawPolyLine()

fillRect() , fillRoundRect() , f i ll3DRect() ,

fillOval() , fillArc() , fillPolygon() , fillPolyLine()

getColor() , getFont() , setColor() , setFont() ,

copyArea() , clearRect()

Denti, Zambonelli - GRAFICA in JAVA - 12

ESE M P IO 4 : D ISE G N O D I F IG URE

Il p a n n e ll o p e rs on a li zz a to c o n il d ise gno :

public class MyPanel extends JPanel { public void paintComponent(Graphics g){ super.paintComponent(g); g.setColor( Color.red); // white, gray, lightGray, darkGray

// red, green, yellow, pink, etc. etc. g.fillRect(20,20, 100,80); g.setColor( Color.blue); g.drawRect(30,30, 80,60); g.setColor( Color.black); g.drawString("ciao",50,60); }

} Il m a in c h e lo c rea e lo in se ri sce n e l fr a m e :

import java.awt.*; import javax.swing.*; public class EsSwing4 { public static void main( String[] v){ MyFrame f = new MyFrame("Esempio 4"); // potremmo anche usare un JFrame standard… Container c = f.getContentPane();

MyPanel panel = new MyPanel(); c.add( panel); f.show(); } }

(7)

Denti, Zambonelli - GRAFICA in JAVA - 13

ESE M P IO: D ISE G N O D I F IG URE

P e r c a m b ia re fon t:

s i c rea un o gge tt o Font app rop ria to

lo s i i m p o s ta c o m e fon t p rede fin ito u s a n do il m e to d o setFont() Font f1 = new Font(" Times", Font.BOLD, 20); // nome del font, stile, dimensione in punti // stili possibili: Font.PLAIN, Font.ITALIC g.setFont(f1);

R e c u pe ra re le p rop rie tà d i un fon t

Il fon t c o rr en te s i re c upe ra c on getFont()

D a to un Font , le s ue p ro p rie tà s i re c u pe ran o c o n

getName() , getStyle() , getSize()

e s i v e rif ic a no c on i p re d ic a ti isPlain() , isBold() , isItalic()

Font f1 = g.getFont(); int size = f1.getSize(); int style = f1.getStyle(); String name = f1.getName();

Denti, Zambonelli - GRAFICA in JAVA - 14

ESE M P IO: G RA F IC O D I F (X ) - 1

P e r d is e g n a re il g ra fic o d i u n a fun z ione o cc o rr e

c rea re u n 'a p po s ita c la ss e FunctionPanel c h e e s te nda

JPanel , ride finen d o il m e to do paintComponent() c o m e app rop ria to , ad e s e m p io :

s fondo b ia n c o , c o rn ic e n e ra

a ss i c a rte s ian i ro ss i, c on e s tr e m i i n d ic a ti

fun z io ne d is eg n a ta in b lu

c rea re , n e l m a in , un o g ge tt o d i tipo FunctionPanel

D e fin iz ion e d e l s o li to m a in :

import java.awt.*; import javax.swing.*;

public class EsSwing5 { public static void main( String[] v){ JFrame f = new JFrame("Grafico f(x)"); Container c = f.getContentPane (); FunctionPanel p = new FunctionPanel (); c .add(p); f .setBounds(100,100,500,400);

f .show(); } }

(8)

Denti, Zambonelli - GRAFICA in JAVA - 15

ESE M P IO: G RA F IC O D I F (X ) - 2

D e fin iz ion e d e l p a nn e llo a p po s it o :

c lass FunctionPanel extends JPanel { i nt xMin=-7, xMax=7, yMin=-1, yMax=1; // gli intervalli in cui vogliamo graficare i nt larghezza=500, altezza=400; // corrispondono alla grandezza del Jframe

// ERA MEGLIO USARE UN COSTRUTTORE…. f loat fattoreScalaX, fattoreScalaY;

public void paintComponent(Graphics g){ s uper. p aintComponent (g); // va fatto sempre s etBackground( Color. w hite); // fondo bianco f attoreScalaX=larghezza/(( float) xMax-xMin);

f attoreScalaY=altezza/(( float) yMax-yMin); // dobbiamo fare le proporzioni tra // l'intervallo di valori della finestra // (500*400) e l'intervallo da graficare (14*2)

// incornicia il grafico in nero g .setColor( Color.black); g .drawRect(0,0,larghezza-1,altezza-1); // e disegna degli assi cartesiani g .setColor( Color.red); g .drawLine(0,altezza/2, larghezza-1,altezza/2);

g .drawLine(larghezza/2,0,larghezza/2,altezza-1); // scrittura valori estremi degli assi g .drawString(""+ xMin, 5,altezza/2-5); g .drawString(""+ xMax, larghezza-10,altezza/2-5); g .drawString(""+ yMax, larghezza/2+5,15); g .drawString(""+ yMin, larghezza/2+5,altezza-5);

C on tinua … ..

Denti, Zambonelli - GRAFICA in JAVA - 16

C on tinua g ra fic o de lla fun z ione f( x )… .. - 3

// disegna il grafico della funzione in blu g .setColor( Color.blue); s etPixel( g,xMin,f( xMin)); // punto iniziale

f or ( int ix=1; ix<larghezza; ix++){ // per ognuno dei pixel della finestra f loat x = xMin+(( float) ix)/ fattoreScalaX;

s etPixel( g,x,f(x)); } }

// definizione della funzione, // statica, da graficare

s tatic float f( float x){ r eturn ( float) Math.sin(x); // sin (x) è la funzione (statica!) // che decidiamo di graficare: // ovviamente potrebbe essere qualsiasi funzione }

// questa serve per riportare i valori della // funzione sui valori della finestra v oid setPixel(Graphics g, float x, float y){ i f (x<xMin || x>xMax || y<yMin || y>yMax ) r eturn; i nt ix = Math.round(( x-xMin)* fattoreScalaX); i nt iy = altezza-Math.round(

( y-yMin )* fattoreScalaY); g .drawLine( ix,iy,ix,iy) ; // disegna in effetti un singolo punto } }

(9)

Denti, Zambonelli - GRAFICA in JAVA - 17

ESE M P IO: G RA F IC O D I F (X ) - 4

E cco c iò che s i o tti ene :

Denti, Zambonelli - GRAFICA in JAVA - 18

D ISE G NA R E IMM A GI N I

C o m e s i d is eg n a u n 'imm a g in e p re s a da u n fil e (p .e . un a imm ag ine J P G )?

1 ) c i s i p ro c u ra un a p p o s ito o gge tt o Image

1a ) s i re c u pe ra il "to o lk it d i d e fa u lt" : Toolkit tk = Toolkit.getDefaultToolkit();

1b ) s i c h ie d e a l to o lk it d i re c u pe ra re l'imm a g ine : Image img = tk.getImage(" new.gif"); S ono s u p p o rta ti i fo rm a ti GI F e J PE G S i può a n c h e fo rn ire un U R L : URL url = ...; Image img = tk.getImage( url);

2 ) s i d is e gna l'im m a g ine c on drawImage()

P R O B L E M A : drawImage() r ito rn a a l c h ia m a n te s u b ito d opo a v e r in iz ia to il c a ric a m en to de ll'i mm a g in e , s en z a a tt e n d e re d i a v e rla c a ric a ta . C 'è il risc h io c he l'im m ag ine n o n fa cc ia in te m po a v is u a lizz a rs i p rim a d e lla fine d e l p rog ra m m a .

S O L U Z IO N E : s i c rea un o g ge tt o MediaTracker d e d ic a to ad o cc u p a rs i d e l c a ric a m e n to d e ll'i mm a g in e , e a c u i a p p u n to il c a ric a m en to d e ll'i m m ag ine (o d e lle imm a g in i), e g li s i a ff ida l'imm ag ine d a c a ric a re

(10)

Denti, Zambonelli - GRAFICA in JAVA - 19

D ISE G NA R E IMM A GI N I

U s o d e l M ed ia T ra ck e r

1 ) N e l c o s tr u tt o re de l p a n n e llo , s i c rea un o gge tt o MediaTracker , p re c is and o g li s u q u a le c o m p o n e n te a vv e rr à il d is e gno ... Di s o lit o il p a ra m e tr o è this ( il p a n n e llo s te ss o )

MediaTracker mt = new MediaTracker ( this);

2 ) ... s i agg iu nge l'im m ag ine a l M e d ia T ra ck e r...

mt.addImage(img,1);

Il s e c on d o pa ra m e tr o è u n nu m e ro in te ro , a no s tr a s c e lta , c he id en tif ic a un iv o c a m en te l'im m ag ine .

3 ) .. e g li s i d ic e d i a tt e n de re il c a ric a m en to d i ta le imm a g ine , u s a n do il nu m e ro in te ro (ID ) da n o i a ss e g n a to

try { mt.waitForID(1); } catch ( InterruptedException e) {}

O cc o rr e un b lo cc o try/ catch pe rc h é l'a tt e s a po tr e b b e e ss e re in te rr o tt a da un 'e c c e z io n e . S e s i de v o no a tt en d e re m o lte im m a g in i:

try { mt.waitForAll(); } catch ( InterruptedException e) {}

Denti, Zambonelli - GRAFICA in JAVA - 20

D ISE G NA R E IMM A GI N I: ESE M P IO

public class ImgPanel extends JPanel { Image img1; public ImgPanel(){

Toolkit tk = Toolkit.getDefaultToolkit (); img1 = tk.getImage(" new.gif"); MediaTracker mt = new MediaTracker ( this); m t.addImage(img1, 1); // aggiunta di eventuali altre immagini t ry { mt.waitForAll(); } catch ( InterruptedException e){}

}

public void paintComponent(Graphics g){ s uper. p aintComponent(g); g .drawImage(img1, 30, 30, null); /* Immagine (img1), posizione nel pannello (30,30)

e un oggetto ( null, cioè nessuno) a cui notificare l'avvenuto caricamento */ }}

(11)

Denti, Zambonelli - GRAFICA in JAVA - 21

ESE M P IO 7 : I L C O M P O NEN T E JL a be l

Ol tr e a d ise gn a re , d e n tr o a i p a n n e lli s i po ss o n o in se ri re a lt re c o m pon e n ti.. .. Il c o m po n en te J P a n e l n o n fa a ltr o c he sc riv e re q u a lc o s a ne l pa n ne llo .

Il s o lit o m a in :

import java.awt.*; import javax.swing.*; public class EsSwing7 { public static void main( String[] v){ JFrame f = new JFrame(”Esempio 7"); Container c = f.getContentPane ();

Es7Panel p = new Es7Panel (); c .add(p); f .pack(); //pack dimensiona il frame in modo da //contenere esattamente il pa nnello f .show(); } }

public class Es7Panel extends JPanel {

public Es7Panel(){ super(); JLabel l = new JLabel("Etichetta"); a dd(l); } }

Denti, Zambonelli - GRAFICA in JAVA - 22

O LT RE IL S O L O D ISE G N O: G L I EVEN T I

F ino ra , la g ra fic a c on s ide ra ta c on s is te v a n e l pu ro d is eg n o d i fo rm e e imm ag in i

È g ra fic a "p a ss iv a ": non c on s e n te a ll'u ten te a lc u na in te ra z io n e

s i può s o lo gu a rd a re il d is e g no ... !!

La c o s tr u z io n e d i in te rfa cc e g ra fic h e ric h ie d e in v e c e in te ra tt iv ità

l'u ten te d e v e po te r p re m e re bo tt o n i, sc riv e re te s to , sc eg lie re e le m e n ti d a lis te , e tc e tc

C o m p on e n ti a tt iv i, c he ge n e ra n o e v e n ti

(12)

Denti, Zambonelli - GRAFICA in JAVA - 23

S W IN G: G ERARCH IA D I C L A SS I

J L a b e l: UN IC O c o m po n en te p a ss iv o , c ioè c he n o n g e ne ra e v en ti

G li a ltr i s o n o tu tt i c o m p o nen ti A T T IV I c h e g e n e ra no e v e n ti

E s e m p io :

J B u tt on : è il c la ss ic o "b o tt one ", e g ene ra u n e v e n to q u a n do v ie n e p re m u to

JComponent JLabel

JList

JMenuBar

JPanel

JScrollBar

JTextComponent

JTextFieldJTextArea AbstractButtonJMenuItem JButton

JToggleButton

JRadioButtonJCheckBox

Denti, Zambonelli - GRAFICA in JAVA - 24

EV E N T I

O gn i c o m p o n en te g ra fic o , q u a n do s i o pe ra s u d i e s s o , ge n e ra u n e v en to c he d e sc riv e c o s a è a c c a d u to (a tt en z io n e : il c on c e tt o d i e v en to n o n s i ap p lic a n e c e ss a ria m e n te s o lo ag li og g e tt i g ra fic i, m a è ge n e ra lm en te c o n la g ra fic a c h e e ss o a ss u m e ril e v an z a e c o m p ren s io n e imm e d ia ta )

T ip ic a m en te , ogn i c o m po n en te p uò g e n e ra re m o lti tip i d iv e rs i d i e v e n ti, in re la z ione a c iò c h e s ta a cc a d e n do

un bo tt o ne p uò g ene ra re l’e v en to “a z ion e ” c he s ign ifi c a c he è s ta to p re m u to

una c a s e lla d i o p z io n e può ge n e ra re l’e v en to “s ta to m o d ifi c a to ” pe r la c a s e lla è s ta ta s e le z io n a ta o de s e le z io n a ta

In J a v a , un e v e n to è u n o g ge tt o , is tan z a d i (u n a s o tt o c la s s e d i) java.util.EventObject

java.util.EventObject

java.awt.AWTEvent

ActionEvent

KeyEventMouseEvent InputEventWindowEvent ComponentEvent packagejava.awt.event

AdjustmentEventTextEventItemEvent

FocusEventPaintEventContainerEvent

(13)

Denti, Zambonelli - GRAFICA in JAVA - 25

G ES T IO NE DE G L I EV E N T I

Q uan d o s i i n te ra g isc e c o n un c o m po n en te "a tt iv o " s i g e n e ra un e v e n to , c he è un o g ge tt o Event d e lla (s o tt o )c la ss e op p o rtu n a

l’o gge tt o E v e n t c on tie ne tu tt e le in fo rm a z io n i s u ll’e v en to (c h i l’ h a c rea to , c o s a è s u cc e s s o , e tc )

Il s is te m a in v ia ta le “og g e tt o E v en to ” a ll’og g e tt o a sc o lta to re de g li e v e n ti p re v en tiv a m e n te reg is tr a to c o m e ta le , c he ge s tisc e l’e v en to .

L ’a tt iv ità n on è p iù a lg o rit m ic a (inpu t / c o m pu ta z io ne / ou tpu t) , è in te ra tt iv a e rea tt iv a

Ogni componente viene associato a unascoltatore degli eventi (un oggettoche implementa l'oppor-tuna interfacciaListener)

EventListener

Quando si agisce sul com-ponente(ad es., si preme ilpulsante) si ha un evento, che èinviato all'ascoltatore L'ascoltatore gestiscel'evento

Denti, Zambonelli - GRAFICA in JAVA - 26

IL PU L SA N T E J B u tt on

Q uan d o v ie ne p re m u to , un b o tt o n e ge n e ra u n e v e n to d i c la ss e ActionEvent

Q ue s to e v e n to v iene in v ia to d a l s is te m a a llo s pe c ifi c o a sc o lta to re deg li e v en ti p e r qu e l b o tt one .

L 'a c o lta to re deg li e v en ti de v e im p le m en ta re la in te rfa cc ia ActionListener ,

può e s s e re un og g e tt o d i u n 'a ltr a c la s s e a l d i fuo ri d e l pa n ne llo …

.. o può e ss e re a n c he il p a nn e llo s te ss o n e l q u a le ( this )

T a le a sc o lta to re de g li e v e n ti de v e im p le m e n ta re il m e to d o de fin ito n e lla in te rfa cc ia actionListener

v oid actionPerformed( ActionEvent ev);

c he g es tis ce l' e v e n to , ne l s e n s o c h e rea g isc e a ll'e v en to c on o p po rtu ne a z io n i

(14)

Denti, Zambonelli - GRAFICA in JAVA - 27

ESE M P IO 8 : US O D I J B u tt on

U n 'a p p lic a z ione fa tt a da un 'e tic he tt a ( JLabel ) e un p u ls a n te ( JButton )

L 'e tic he tt a p uò v a le re " Tizio " o " Caio "; a ll'i n iz io v a le " Tizio "

P re m e n do il bo tt one , l'e tic he tt a d e v e c o mm u ta re , d iv en ta n do " Caio " s e e ra " Tizio ", o " Tizio " s e e ra " Caio "

A rc h it e tt u ra d e ll' a pp li ca z ion e

U n p a n n e llo c he c on tie ne e tic h e tt a e p u ls a n te → il c o s tr u tt o re de l pa n ne llo c re a l'e tic h e tt a e il p u ls a n te

Il pan n e llo fa da a sc o lta to re de g li e v en ti p e r il p u ls a n te → il c o s tr u tt o re d e l pann e llo im po s ta il p a n n e llo s te ss o c o m e a sc o lta to re deg li e v en ti de l p u ls an te

Denti, Zambonelli - GRAFICA in JAVA - 28

// Il codice del pannello… public class Es8Panel extends JPanel implements ActionListener {

private JLabel l; public Es8Panel(){ super(); l = new JLabel("Tizio"); a dd(l); JButton b = new JButton("Tizio/Caio"); // Tizio/Caio è l'etichetta del pulsante

b . addActionListener ( this); // registra l'oggetto panel stesso come // ascoltatore degli eventi a dd(b); }

E v en ti da ge s tir e :

l'e v en to d i a z ione s u l p u ls a n te de v e p ro v o c a re il c a m b io d e l te s to de ll'e tic he tt a C o m e s i fa?

il te s to de ll'e tic h e tt a s i può re c u p e ra re c on getText() e c a m b ia re c o n setText()

l'a sc o lta to re de ll'e v e n to , c he im p le m en ta il m e to d o ActionPerformed() , de v e re c upe ra re il te s to de ll'e tic he tt a e c a m b ia rlo

public void actionPerformed( ActionEvent e){ i f ( l.getText(). equals("Tizio")) l .setText("Caio"); else l .setText("Tizio");

} }

(15)

Denti, Zambonelli - GRAFICA in JAVA - 29

ESE M P IO 8 : Il s o li to m a in :

import java.awt.*; import javax.swing.*; import java.awt.event.*; // bisogna importare il package degli eventi!

public class EsSwing8 { public static void main( String[] v){ JFrame f = new JFrame(”Esempio 7"); Container c = f.getContentPane (); Es8Panel p = new Es8Panel (); c .add(p); f .pack(); f.show();

} }

Denti, Zambonelli - GRAFICA in JAVA - 30

ESE M P IO 8 : UNA VAR IAN T E

A rc h ite tt u ra d e ll'a p p lic a z io n e

U n p a n n e llo c he c on tie ne e tic h e tt a e p u ls a n te → il c o s tr u tt o re de l pa n ne llo c re a l'e tic h e tt a e il p u ls a n te

L 'a sc o lta to re deg li e v en ti pe r il p u ls an te è u n o g ge tt o s epa ra to → il c o s tr u tt o re de l p a n n e llo im p o s ta ta le o gg e tt o c o m e a sc o lta to re de g li e v e n ti d e l p u ls an te

public class Es8Panel extends JPanel { public Es8Panel(){ super(); JLabel l = new JLabel("Tizio");

a dd(l); JButton b = new JButton("Tizio/Caio"); b . addActionListener ( new Es8Listener(l) ); // crea un oggetto es8Listener e lo imposta // come ascoltatore degli eventi del bottone a dd(b); } }

L 'a sc o lta to re d e g li e v en ti: c lass Es8Listener implements ActionListener { public void actionPerformed( ActionEvent e){ i f ( l.getText(). equals("Tizio"))

l .setText("Caio"); else l .setText("Tizio"); } private JLabel l;

public Es8Listener( JLabel label){ l=label;} // deve farsi dare come parametro la Jlabel su // cui dovrà andare ad agire }

(16)

Denti, Zambonelli - GRAFICA in JAVA - 31

C O N F R O N T O F R A L E D U E VERS IO N I

EventListener

Nella prima versione, l'ascoltatore è il pannello stesso Pannello

EventListener Nella seconda,l'ascoltatore è unaltro oggetto Pannello

Denti, Zambonelli - GRAFICA in JAVA - 32

ESE M P IO 9 : DUE PU L S A N T I

S c opo d e ll'ap p lic a z io ne

C a m b ia re il c o lo re d i s fo ndo tr a m ite d u e pu ls an ti: u n o lo ren d e ro ss a , l'a ltr o a zz u rr o A rc h ite tt u ra d e ll'a p p lic a z io n e

U n p a n n e llo c he c on tie ne i d ue p u ls a n ti c rea ti d a l c o s tr u tt o re de l p a nn e llo

U n u n ic o a s c o lta to re d e g li e v en ti p e r en tr a m b i i p u ls a n ti

ne c e s s ità d i c a p ire , in actionPerformed() , qu a le pu ls an te è s ta to p re m u to

Il c od ic e d e l p a n ne llo :

public class Es9Panel extends JPanel implements ActionListener { JButton b1, b2; public Es9Panel(){

super(); b1 = new JButton("Rosso"); b2 = new JButton("Azzurro"); b1. addActionListener ( this); b2. addActionListener ( this); // il pannello fa da ascoltatore degli // eventi per entrambi i pulsanti

a dd(b1); a dd(b2); } ...

(17)

Denti, Zambonelli - GRAFICA in JAVA - 33

ESE M P IO 9 , c on tinua il c od ic e d e l p a n n e llo …

...

public void actionPerformed( ActionEvent e){ Object pulsantePremuto = e.getSource(); // si recupera il riferimento all'oggetto // che ha generato l'evento if (pulsantePremuto==b1) // e si confronta questa con i riferimenti // agli oggetti bottoni b1 e b2

setBackground( Color.red); if (pulsantePremuto==b2) setBackground( Color.cyan); } }

D a to l'o g ge tt o -e v en to , il s uo m e to do ge tS ou rc e re s tit u isc e un rif e rim en to a ll'o gg e tt o c he h a g e ne ra to l'e v en to s te s s o .

U n m o d o a lte rn a tiv o pe r c a p ire c h i a v e v a g e ne ra to l'e v en to po te v a e ss e re q u e llo d i g u a rd a re l'e tic he tt a a ss o c ia ta a l pu ls an te :

String nome = e. g etActionCommand(); i f nome. e quals("Rosso") …

Denti, Zambonelli - GRAFICA in JAVA - 34

ESE M P IO 9 : VAR IAN T E

P rim a a b b ia m o de fin ito u n s in g o lo a sc o lta to re p e r en tr a m b i i pu ls an ti:

S e de fin ia m o a sc o lta to ri d iv e rs i p e r e v e n ti d iv e rs i il s is te m a p ro vv e de rà ad in v ia re g li e v en ti s o lo a ll'a s c o lta to re op p o rtu n o , e il m e to d o a c tio n P e rfo rm ed n o n d e v e p iù p re o cc u pa rs i d i s ape re q u a le pu ls an te è s ta to p re m u to

EventListener Versione con un unico ascoltatore per entrambi i pulsanti

Pannello

Il metodo actionPerformed()dell'ascoltatore dovrà discriminare qualepulsante ha generato l'evento

EventListener Pannello

EventListener

(18)

Denti, Zambonelli - GRAFICA in JAVA - 35

ESE M P IO 9 : v a rian te IL PA NN E LL O:

c lass Es9PanelBis extends JPanel { public Es9PanelBis(){ super();

JButton b1 = new JButton("Rosso"); JButton b2 = new JButton("Azzurro"); b1.addActionListener( new Es9Listener( this,Color. r ed) ); b2.addActionListener( new Es9Listener( this,Color. c yan) ); // crea du e oggetti ascoltatori e a ognuno

// passa il riferimento del pannello su cui // agire ( this) e il colore da usare a dd(b1); a dd(b2); } }

L 'a sc o lta to re d e g li e v en ti:

c lass Es9Listener implements ActionListener { private JPanel pannello; private Color colore; public Es9Listener( JPanel p, Color c){ pannello = p; colore = c;

}

public void actionPerformed( ActionEvent e){ p annello. s etBackground(colore); } }

Denti, Zambonelli - GRAFICA in JAVA - 36

G L I EVEN T I D I F INES T R A

Le o p e ra z io n i s u lle fine s tr e (fi ne s tr a c h iu s a , a p e rta , m in im iz z a ta , ing ra n d ita … ) g ene ra n o un WindowEvent

G li e v en ti d i fine s tr a s ono g e s tit i d a i m e to d i d ic h ia ra ti da ll'i n te rfa cc ia WindowListener

public void windowClosed( WindowEvent e); public void windowClosing( WindowEvent e); public void windowOpened( WindowEvent e); public void windowIconified( WindowEvent e); public void windowDeiconified( WindowEvent e);

public void windowActivated( WindowEvent e); public void windowDeactivated( WindowEvent e);

og n i m e to d o v iene sc a te na to d a ll'e v en to a pp ro p ria to (p .e ., qu a n d o s i ic o n ifi c a una fin e s tr a , ne ll'a sc o lta to re v iene in v o c a to il m e todo windowIconified ()) e ge s tisc e l'e v en to app rop ria to , au to m a tic a m e n te

Il c o m po rta m en to p re de fin ito d i q u e s ti m e tod i v a g ià be n e tr anne windowClosing() , c he n o n fa u sc ire l'a pp lic a z io n e : na sc o n d e s o lo la fine s tr a .

P e r fa r s ì c he c h iude n do la fine s tr a d e l fr a m e l'a pp lic a z io n e v en g a c h iu s a , il fr a m e de v e im p le m en ta re l'in te rfa c c ia

WindowListener , e ride fin ire WindowClosing in m o d o c he in v o c h i System. e xit()

G li a ltr i m e to d i de v ono e ss e re fo rm a lm e n te im p le m e n ta ti, m a , non d o v endo sv o lg e re c o m p iti p re c is i, po s s ono e ss e re de fin iti s e m p lic e m en te c o n un c o rpo v u o to : public void WindowOpened( WindowEvent e){}

(19)

Denti, Zambonelli - GRAFICA in JAVA - 37

ESE M P IO 9 C O N G ES T IO NE DE L L A CH IU S URA DE L L A F INE S T R A A c

tion L is tene r

P anne llo

A i due A c tionL is tene r g ià e s i-s ten ti, aggan c ia ti a i s ingo li pu l-s an ti, s i a gg iun g e u n W in d o w -L is te n e r, ass o c ia to a l J fr a m e c he p e rm e tt e d i ge s tir e l'e v en to d i c h iu s u ra de lla fine s tr a fa c endo te rm in a re l'app lic a z ione A c tion L is tene r F ra m e

W indo w L is tene r

Denti, Zambonelli - GRAFICA in JAVA - 38

ESE M P IO 9 C O N CH IU S URA

public class EsSwing9 { public static void main( String[] v){

JFrame f = new JFrame("Esempio 9"); Container c = f.getContentPane (); Es9Panel p = new Es9Panel (); c .add(p); f .addWindowListener( new Terminator() ); // Terminator è la classe che implementa

// l'interfaccia WindowListener f .pack(); f .show(); } }

c lass Terminator implements WindowListener { public void windowClosed( WindowEvent e){} public void windowClosing( WindowEvent e){ System.exit(0); // in questo modo chiudendo la finestra

// si esce dalla applicazione

} public void windowOpened( WindowEvent e){} public void windowIconified( WindowEvent e){} public void windowDeiconified( WindowEvent e){} public void windowActivated( WindowEvent e){}

public void windowDeactivated( WindowEvent e){} }

(20)

Denti, Zambonelli - GRAFICA in JAVA - 39

IL CA M P O D I T ES T O JTex tF ie ld

Il JTextField è un c o m ponen te "c a m po d i te s to ", u s a b ile pe r sc riv e re e v is ua liz z a re u na rig a d i te s to

il c a m p o d i te s to p u ò e ss e re e d ita b ile o no

il te s to è a cc e s s ib ile c o n ge tT e x t() / s e tT e x t()

Il c a m po d i te s to è pa rte d i un o g ge tt o Document

O gn i v o lta c he il te s to in e ss o c o n te n u to c a m b ia s i g ene ra un DocumentEvent ne l do c u m en to c he c o n tie ne il c a m po d i te s to

S e pe rò è s u ff ic ien te reg is tr a re i c a m b ia m en ti s o lo q u a n do s i p re m e IN V IO , ba s ta ge s tir e s e m p lic e m en te il s o lit o ActionEvent

ES E M P IO 10

U n 'a p p lic a z ione c o m p re n d en te un p u ls an te e d u e c a m p i d i te s to

uno p e r sc riv e re te s to , l'a ltr o pe r v is ua lizz a rlo

Q uan d o s i p re m e il p u ls a n te , il te s to d e l s e c o n d o c a m po (non m o d ifi c ab ile d a ll'u te n te ) v ie ne c a m b ia to , e re s o u g u a le a qu e llo sc ritt o ne l p rim o

L 'un ic o e v e n to è an c o ra il pu ls a n te p re m u to : an c o ra non u s ia m o il DocumentEvent

Denti, Zambonelli - GRAFICA in JAVA - 40

ESE M P IO 10 - 2

Il s o lit o m a in :

public class EsSwing10 { public static void main( String[] v){ JFrame f = new JFrame("Esempio 10");

Container c = f.getContentPane (); Es10Panel p = new Es10Panel (); c .add(p); f .addWindowListener( new Terminator() ); f .setSize(300,120); f .show(); }

} Il pan n e llo :

c lass Es10Panel extends JPanel i mplements ActionListener { JButton b; JTextField txt1, txt2; public Es10Panel(){

super(); b = new JButton("Aggiorna"); txt1=new JTextField("Scrivere qui il testo", 25); txt2 = new JTextField(25); // larghezza in caratt. txt2.setEditable(false); // non modificabile b .addActionListener( this); a dd(txt1);

a dd(txt2); a dd(b); }

(21)

Denti, Zambonelli - GRAFICA in JAVA - 41

ESE M P IO 10 - 3

La ge s tio n e d e ll'e v e n to "p u ls a n te p re m u to ":

public void actionPerformed( ActionEvent e){ txt2.setText( txt1.getText() ); }

}

Denti, Zambonelli - GRAFICA in JAVA - 42

ESE M P IO 11 : VAR IA N T E A LL 'E S E M P IO 10

Ni e n te p iù pu ls an te , s o lo i d u e c a m p i d i te s to

S fr u tt ia m o la p re ss io ne d e l ta s to IN V IO c o m e pu ls an te , qu ind i in te rc e tt ia m o l' ActionEvent (an c o ra n o n u s ia m o il

DocumentEvent )

Q uan d o s i p re m e IN V IO , il te s to de l s e c o ndo c a m po (n on m od ifi c ab ile d a ll'u ten te ) v ie ne c a m b ia to , e re s o u g u a le a qu e llo sc ritt o ne l p rim o

D o b b ia m o m e tt e re un ActionListener in A sc o lto s u l c a m po d i te s to tx t1 p ron to a d in te rc e tt a re g li e v en ti d i a z io n e ActionEvent (c he s i sc a tena c on la p re s s io n e d e l ta s to in v io )

(22)

Denti, Zambonelli - GRAFICA in JAVA - 43

ESE M P IO 11

c lass Es11Panel extends JPanel i mplements ActionListener { JTextField txt1, txt2; public Es11Panel(){ super();

txt1=new JTextField("Scrivere qui il testo", 25); txt2 = new JTextField(25); txt2.setEditable(false); txt1.addActionListener( this); // gli eventi di txt1 vengono ascoltati da this a dd(txt1); a dd(txt2);

} ...

La ge s tio n e d e ll'e v e n to rim a ne ina lte ra ta : è c a m b ia to s o lo c o lu i c he g ene ra l'e v e n to .

Denti, Zambonelli - GRAFICA in JAVA - 44

ESE M P IO 12 : U LT ER IO RE V AR IA N T E

S fr u tt ia m o il c on c e tt o d i D O C U M E N T O c he s ta d ie tr o a o g n i c a m po d i te s to

A ogn i m o d ifi c a de l c on te nu to , il d o c u m e n to d i c u i il c a m po d i te s to fa pa rte gene ra un DocumentEvent p e r s e g n a la re l'a vv e n u to c a m b ia m e n to

T a le e v en to de v 'e ss e re g e s tit o d a un o ppo rtuno DocumentListener c ioè da un og ge tt o d i u n a c la ss e c h e im p le m en ti l 'in te rfa cc ia DocumentListener

D O CU M E N T L IS T E N E R

L 'in te rfa cc ia DocumentListener d ic h ia ra tr e m e to d i:

void insertUpdate( DocumentEvent e); void removeUpdate( DocumentEvent e); void changedUpdate( DocumentEvent e);

Il te rz o non è m a i c h ia m a to d a un JTextField , s e rv e s o lo pe r a ltr i tip i d i c o m po n en ti

L 'og g e tt o -e v e n to DocumentEvent pa ss a to c o m e pa ra m e tr o in re a ltà è in u til e , in qu a n to c o s a s ia a c c adu to è g ià im p lic ito ne l m e to do c h ia m a to ; e ss o e s is te s o lo p e r u n ifo rm ità . La s te ss a c o s a v a le v a pe r i WindowListener .

(23)

Denti, Zambonelli - GRAFICA in JAVA - 45

ESE M P IO 12 - 2

N e l n o s tr o c a s o :

l'a z io ne d a sv o lge re in c a s o d i i n s e rim e n to o rim o z io n e d i c a ra tt e ri è id en tic a , qu ind i i due m e tod i v oid insertUpdate( DocumentEvent e); v oid removeUpdate( DocumentEvent e); s a ra n no iden tic i (pu rtr o p p o v a n no c o m u n q ue im p le m en ta ti en tr a m b i)

Il m e todo changedUpdate( DocumentEvent e) è pu re inu til e , da to c he JTextField n o n lo c h ia m a , m a v a c o m u n q u e fo rm a lm en te im p le m e n ta to .

Denti, Zambonelli - GRAFICA in JAVA - 46

ESE M P IO 12 : C O D ICE

import javax.swing.event.*; // solito main… c lass Es12Panel extends JPanel i mplements DocumentListener { // deve implementare l'interfaccia

JTextField txt1, txt2;

public Es12Panel(){ super(); txt1= new JTextField("Scrivere qui il testo", 25); txt2 = new JTextField(25); txt2.setEditable(false);

txt1.getDocument(). addDocumentListener( this); // ricava il documento di cui il campo // di test txt1 fa parte e gli associa il

// pannello come listener a dd(txt1); a dd(txt2); }

// La ge s tione de ll'e v en to :

public void insertUpdate( DocumentEvent e){

txt2.setText(txt1.getText()); } public void removeUpdate( DocumentEvent e){ txt2.setText(txt1.getText()); } public void changedUpdate( DocumentEvent e){} // implementazione formale

O ra , a ogn i in s e rim en to o c a n c e lla z io ne d i c a ra tt e ri l'ag g io rn a m e n to è au to m a tic o

(24)

Denti, Zambonelli - GRAFICA in JAVA - 47

ESE M P IO: UNA MI N I- CA L C O L A T R ICE

A rc h ite tt u ra :

un p a n n e llo c on un c a m p o d i te s to e s e i p u ls an ti

un u n ic o ActionListener pe r tu tt i i pu ls a n ti (è il v e ro c a lc o la to re )

G e s tione de g li e v en ti: O gn i v o lta c he s i p re m e u n p u ls an te :

s i re c u p e ra il no m e de l p u ls an te (è la s u cc e ss iv a o p e ra z io n e da sv o lge re )

s i l e g ge il v a lo re n e l c a m po d i te s to

s i sv o lg e l'o p e ra z io n e p re c eden te

E se m p io : 1 5 + 14 - 3 = + 8 = • quando s i p re m e + , s i m e m o rizz ano s ia 15 s ia l'ope ra z ione + • quando s i p re m e -, s i l egge 14 , s i fa la s o mm a 15 + 14 , s i m e m o rizz a 29 , e s i m e m o rizz a l'ope ra z ione - • quando s i p re m e = , s i l egge 3 , s i fa la s o tt ra z ione 2 9 -3 , s i m e m o rizz a 26 , e s i m e m o rizz a l'ope ra z ione = • quando s i p re m e + (dopo l' = ), è c o m e e ss e re a ll'i n iz io : s i m e m o rizz ano 26 (r is u lta to p re c eden te ) e l'o pe ra z ione + • quando s i p re m e = , s i l egge 8 , s i fa la s o mm a 26 + 8 , s i m e m o - rizz a 34 , e s i m e m o rizz a l'ope ra z ione = • … e cc e te ra ...

Denti, Zambonelli - GRAFICA in JAVA - 48

MI N I- CA L C O L A T R ICE - 2

Il s o lit o m a in :

public class EsSwingCalculator { public static void main( String[] v){ JFrame f = new JFrame(" Mini-calcolatrice"); Container c = f.getContentPane (); CalcPanel p = new CalcPanel ();

c .add(p); f .setSize(220,150); f .addWindowListener( new Terminator()); // Per gestire la chiusura della finestra f .show(); } }

U n p u ls an te c on u n fon t "pe rs on a liz z a to " :

c lass CalcButton extends JButton { CalcButton ( String n) { super(n); s etFont( new Font("Courier",Font.BOLD,20)); // estendiamo Jbutton per personalizzare il font

} }

(25)

Denti, Zambonelli - GRAFICA in JAVA - 49

MI N I- CA L C O L A T R ICE - 3

Il pan n e llo :

c lass CalcPanel extends JPanel {

JTextField txt; CalcButton sum, sub, mul, div, calc, canc; public CalcPanel(){ super(); t xt = new JTextField(15); t xt.setHorizontalAlignment( JTextField.RIGHT); c alc = new CalcButton("=");

s um = new CalcButton("+"); sub = new CalcButton("-"); m ul = new CalcButton("*"); d iv = new CalcButton("/"); c anc = new CalcButton("C"); a dd( txt); a dd( sum); add(sub); add( mul);

a dd( div); add( calc); add( canc); Calculator calcolatore = new Calculator ( txt); // l'unico ascoltatore è questo oggetto // calclatore che gestisce tutti gli eventi // e rappresenta il vero e proprio calcolatore s um.addActionListener(calcolatore);

s ub. a ddActionListener(calcolatore); m ul.addActionListener(calcolatore); d iv.addActionListener(calcolatore); c alc.addActionListener(calcolatore); c anc.addActionListener(calcolatore); } }

Denti, Zambonelli - GRAFICA in JAVA - 50

MI N I- CA L C O L A T R ICE - 3

Il lis te n e r / ca lc o la to re :

c lass Calculator implements ActionListener { d ouble res = 0; JTextField display;

String opPrec = " nop"; public Calculator( JTextField t) { display = t; } public void actionPerformed( ActionEvent e){ d ouble valore = Double.parseDouble( display.getText( )); // recupera il valore dal campo di testo // e lo converte da stringa a double

d isplay. s etText(""); d isplay. r equestFocus(); // fa si' che il campo di testo sia già // selezionato, pronto per scriverci dentro

String operazione = e. g etActionCommand();

// recupera il nome del pulsante premuto // e' un modo alternativo per capire, tra tanti // bottoni, quale e' ha generato l'evento

i f ( operazione. e quals("C")) { //cancella tutto r es = valore = 0; opPrec = new String(" nop"); } else { // esegui l'operazione precedente

i f ( opPrec.equals("+")) res += valore; else i f ( opPrec.equals("-")) res -= valore; else i f ( opPrec.equals("*")) res *= valore; else i f ( opPrec.equals("/")) res /= valore; else i f ( opPrec.equals(" nop")) res = valore; d isplay. s etText(""+ res); o pPrec = operazione;

//la prossima operazione da eseguire è la corrente } } }

(26)

Denti, Zambonelli - GRAFICA in JAVA - 51

IL CHE C KB O X (case ll a d i op z ione )

Il JCheckBox è una "c a s e lla d i o p z ion e ", c he p u ò e ss e re s e le z io n a ta o de s e le z iona ta

lo s ta to è v e rif ic ab ile c o n isSelected() e m o d ifi c a b ile c on setSelected()

O gn i v o lta c he lo s ta to de lla c a s e lla c a m b ia , s i ge n e ra no :

un ActionEvent , c o m e pe r og n i p u ls an te

un ItemEvent , ge s tit o d a un ItemListener

S o lit a m en te c on v ie ne g e s tir e l' ItemEvent , pe rc hé p iù s pe c ifi c o .

L ' ItemListener d ic h ia ra il m e todo :

public void itemStateChanged( ItemEvent e)

c he de v e e ss e re im p le m e n ta to d a lla c la ss e c he re a liz z a l'a sc o lta to re deg li e v en ti.

In c a s o d i p c a s e lle ge s tit e d a llo s te ss o lis tene r, il m e todo e. g etItemSelectable() re s tit u isc e un rif e rim en to a ll'o gge tt o s o rgen te d e ll'e v e n to .

Denti, Zambonelli - GRAFICA in JAVA - 52

ESE M P IO 13

U n 'a p p lic a z ione c o m p re n d en te u na c h e ck b o x e un c a m po d i te s to (non m o d ifi c ab ile ), c he rif le tt e lo s ta to de lla c h e ck bo x

A lla c h e ck bo x è a ss o c ia to u n ItemListener , c he in te rc e tt a g li e v en ti d i s e le z io ne / de s e le z io n e im p le m e n ta n do il m e todo itemStateChanged ()

c lass Es13Panel extends JPanel implements ItemListener {

JTextField txt; JCheckBox ck1 ;

public Es13Panel(){ super(); t xt = new JTextField(10); t xt.setEditable(false); ck1 = new JCheckBox("Opzione"); ck1.addItemListener( this);

a dd(ck1); add( txt); } public void itemStateChanged( ItemEvent e){ i f (ck1.isSelected()) t xt.setText("Opzione attivata"); else txt.setText("Opzione disattivata");

} }

(27)

Denti, Zambonelli - GRAFICA in JAVA - 53

ESE M P IO 14 : P IÙ CAS E LL E D I O P Z IO NE

U n 'a p p lic a z ione c on d u e c he c k b o x e un c a m p o d i te s to c h e ne rif le tt e lo s ta to

Lo s te ss o ItemListener è a ss o c ia to a en tr a m be le c he ck bo x : u s a e. g etItemSelectable() pe r d e du rr e qu a le c a s e lla è s ta ta m od ifi c a ta

Denti, Zambonelli - GRAFICA in JAVA - 54

ESE M P IO 14

c lass Es14Panel extends JPanel implements ItemListener {

JTextField txt1, txt2; JCheckBox c1, c2;

public Es14Panel(){ super(); txt1 = new JTextField(15); txt1.setEditable(false); txt2 = new JTextField(15); txt2.setEditable(false);

c1 = new JCheckBox("Mele"); c1.addItemListener( this); c2 = new JCheckBox("Pere"); c2.addItemListener( this); a dd(c1); add(c2); a dd(txt1); add(txt2); }

public void itemStateChanged( ItemEvent e){ Object source = e. g etItemSelectable(); i f (source==c1) txt1.setText("Sono cambiate le mele"); else txt1.setText("Sono cambiate le pere");

// ora si controlla lo stato globale String frase = (ck1.isSelected() ? "Mele " : "") + (ck2.isSelected() ? "Pere" : ""); txt2.setText(frase); }

}

(28)

Denti, Zambonelli - GRAFICA in JAVA - 55

IL RAD IO BU TT O N

Il JRadioButton è una c a s e lla d i o p z io ne c he fa pa rte d i un g ru p p o : in ogn i i s ta n te p u ò e ss e re a tt iv a una s o la c a s e lla de l g ru p po

Q uan d o s i c a m b ia la c a s e lla s e le z io n a ta , s i ge n e ra no tr e e v en ti

un ItemEvent pe r la c a s e lla d e s e le z io n a ta , uno pe r la c a s e lla s e le z iona ta , e un ActionEvent da p a rte d e lla c a s e lla s e le z iona ta (pu ls an te p re m u to )

In p ra tic a :

s i c rea n o i JRadioButton c he s e rv o n o

s i c rea un o gge tto ButtonGroup e s i a g g iun g o n o i

JRadioButton a l g ru ppo

Denti, Zambonelli - GRAFICA in JAVA - 56

ESE M P IO 15

U n 'a p p lic a z ione c o m p re n d en te u n g ru ppo d i tr e rad io b u tt on , c on un c a m po d i te s to c he n e rif le tt e lo s ta to

S o lit a m en te c on v ie ne g e s tir e l' ActionEvent (p iù c h e l' ItemEvent ) pe rc hé og n i c a m b io d i s e le z io ne ne ge n e ra uno s o lo ( a fr on te d i d u e ItemEvent ), il c he s e m p lif ic a la ge s tio ne .

(29)

Denti, Zambonelli - GRAFICA in JAVA - 57

ESE M P IO 15

c lass Es15Panel extends JPanel implements ActionListener {

JTextField txt; JRadioButton b1, b2, b3; ButtonGroup grp;

public Es15Panel(){ super(); t xt = new JTextField(15); txt.setEditable(false); b1 = new JRadioButton("Mele"); b2 = new JRadioButton("Pere"); b3 = new JRadioButton("Arance");

g rp = new ButtonGroup(); g rp.add(b1); grp.add(b2); grp.add(b3); b1.addActionListener( this); add(b1); b2.addActionListener( this); add(b2); b3.addActionListener( this); add(b3); a dd( txt); }

public void actionPerformed( ActionEvent e){ String scelta = e. g etActionCommand(); t xt.setText("Scelta corrente: " + scelta); } }

Denti, Zambonelli - GRAFICA in JAVA - 58

L A L IS T A JL is t

U na JList è una lis ta d i v a lo ri fr a c u i s i p uò sc e g lie rn e u n o o p iù

Q uan d o s i sc eg lie una v o c e s i g ene ra un e v en to ListSelectionEvent , ge s tit o da un ListSelectionListener

Il lis tene r d e v e im p le m en ta re il m e to do v oid valueChanged( ListSelectionEvent)

P e r r e c u p e ra re la /e v o c e /i sc e lta /e s i u s a n o

getSelectedValue () e getSelectedValues()

(30)

Denti, Zambonelli - GRAFICA in JAVA - 59

ESE M P IO 16

U n 'a p p lic a z ione c on u n a lis ta e un c a m po d i te s to c h e rif le tt e la s e le z io ne c o rr en te

P e r in te rc e tt a re le s e le z ion i o c c o rr e g e s tir e il ListSelectionEvent

Di no rm a , JList non m o s tr a una b a rr a d i s c o rr i-m en to v e rti c a le : s e la s i v uo le , v a a g g iun ta a p a rte

Denti, Zambonelli - GRAFICA in JAVA - 60

ESE M P IO 16

Il c od ic e :

c lass Es16Panel extends JPanel

implements ListSelectionListener { JTextField txt; JList list; public Es16Panel(){ super(); t xt = new JTextField(15); t xt.setEditable(false); String voci[]={" Rosso" , "Giallo","Verde", "Blu"};

l ist = new JList(voci); l ist. a ddListSelectionListener( this); a dd( list); add( txt); }

public void valueChanged( ListSelectionEvent e){ String scelta = ( String) list . g etSelectedValue();

t xt.setText("Scelta corrente: " + scelta); }

}

(31)

Denti, Zambonelli - GRAFICA in JAVA - 61

ESE M P IO 16 : VAR IA N T E

C on g li u s u a li ta s ti S H IF T e C T R L , s ono po ss ib ili an c h e s e le z io n i m u lti p le :

c on S H IF T s i s e le z ion a no tu tt e le v o c i c o m p re s e fr a d u e e s tr e m i, c on C T R L s i s e le z ion an o v o c i s p a rs e

g etSelectedValue() re s tit u isc e s o lo la p rim a , pe r a v e rle tu tt e o cc o rr e getSelectedValues()

P e r ge s tir e le s e le z io n i m u lti p le ba s ta c a m b ia re l'im p le m en ta z io ne d i valueChanged() :

public void valueChanged( ListSelectionEvent e){ Object[] scelte = list. g etSelectedValues(); StringBuffer s = new StringBuffer ();

f or ( int i=0; i<scelte.length; i++) s .append(( String)scelte[i] + " "); t xt.setText("Scelte: " + s); }

Denti, Zambonelli - GRAFICA in JAVA - 62

ESE M P IO 16 : U LT ER IO RE V AR IAN T E

P e r ag g iu nge re u n a ba rr a d i sc o rr im en to , s i s fr u tt a un JScrollPane , e s i fiss a un nu m e ro m a ss im o d i e le m e n ti v is u a lizz a b ili pe r la lis ta :

public Es18Panel(){ ... list = new JList(voci); JScrollPane pane = new JScrollPane( list); list.setVisibleRowCount(3); list.addListSelectionListener( this); add(pane); // invece che add( list) add( txt); }

Riferimenti

Documenti correlati

• Le donazioni per le &#34;Adozioni a distanza&#34;, a causa del Covid-19, del distanziamento e della chiusura delle scuole anche nei Paesi più poveri, sono state conver- tite

Graziano Merotto’s estate is located in Col San Martino, an area whose vocation is the production of Valdobbiadene DOCG.. Here grapes have been ripening on the hills for over

5 - 52024 Loro Ciuffenna (AR); in questo caso per la data di presentazione farà fede il timbro postale. La domanda dovrà comunque pervenire inderogabilmente

Referenti di sede COMMISSIONE COVID  Supporto all’allestimento delle aule e degli spazi utilizzati per le attività didattiche, con indicazione ai collaboratori scolastici per

[r]

AUTONOMIA DELLE STUDENTE se lo studente risiede fuori dall’unita abitativa della famiglia di origine da almeno 2 anni rispetto alla data di presentazione della

ANTICHE VARIETA' DI MAIS TRA TRADIZIONE E INNOVAZIONE Paolo Valoti - Esperto Banca Germoplasma di Mais del CREA

Non sono state riscontrate difformità catastali ad esclusione, come sopra evidenziato, dell’apertura nella parete a sinistra rispetto l’ingresso dell’autorimessa che