TS - sp´e ISN
Les interfaces graphiques
TP 111 Le projet
balle qui tombe
Ce projet est constitu´e de trois classes :
– la classe Main dans laquelle on cr´e´e la fenˆetre, on dessine, on r´eagit aux ´ev´enements ;
– la classe PanneauDessin qui est une extension de la classe JPanel et qui permet de cr´eer le panneau o`u sera dessin´e la balle ;
– la classe PanneauBoutons idem pour le panneau des boutons.
Voici les codes :
i m p o r t j a v a.awt.B o r d e r L a y o u t;
i m p o r t j a v a.awt.e v e n t.A c t i o n E v e n t; i m p o r t j a v a x.s w i n g.J F r a m e;
p u b l i c c l a s s M a i n {
s t a t i c J F r a m e f e n e t r e = new J F r a m e() ;
s t a t i c P a n n e a u B o u t o n s p a n n e a u B = new P a n n e a u B o u t o n s() ; s t a t i c P a n n e a u D e s s i n p a n n e a u D = new P a n n e a u D e s s i n() ; s t a t i c b o o l e a n aff = f a l s e;// aff : on a f f i c h e le d e s s i n
p u b l i c s t a t i c v o i d m a i n(S t r i n g[] a r g s) {
d e s s i n e(f e n e t r e) ;// on l a n c e le p r o g r a m m e en a f f i c h a n t la f e n ^e t r e
}
p u b l i c s t a t i c v o i d d e s s i n e(J F r a m e f e n e t r e) {// p r e m i e r d e s s i n de la f e n ^e t r e
f e n e t r e.s e t V i s i b l e(f a l s e) ;
f e n e t r e.s e t T i t l e(” La b a l l e q u i tombe ”) ; f e n e t r e.s e t S i z e(400 , 3 0 0 ) ;
f e n e t r e.s e t L o c a t i o n R e l a t i v e T o(n u l l) ;
f e n e t r e.s e t D e f a u l t C l o s e O p e r a t i o n(J F r a m e.E X I T _ O N _ C L O S E) ;
f e n e t r e.s e t L a y o u t(new B o r d e r L a y o u t() ) ;// C r ´e a t i o n du L a y o u t de la f e n ^e t r e
if (aff) f e n e t r e.add(p a n n e a u D, B o r d e r L a y o u t.C E N T E R) ;// P o u r s a v o i r si on a f f i c h e le d e s s i n
f e n e t r e.add(p a n n e a u B, B o r d e r L a y o u t.W E S T) ;// on a f f i c h e le p a n n e a u de b o u t o n s
f e n e t r e.s e t V i s i b l e(t r u e) ; }
p u b l i c s t a t i c v o i d go() {// m ´e t h o d e a p p e l ´e e p o u r a u g m e n t e r l ’ o r d o n n ´e e de la b a l l e
int y = p a n n e a u D.g e t P o s Y() ;// v o i r c l a s s e P a n n e a u D e s s i n if (y < 1 5 0 ) {y=y+ 1 ; }// on v ´e r i f i e que la b a l l e n ’ est pas
a r r i v ´e e
e l s e {S y s t e m.out.p r i n t l n(”ARRIV´EE ! ! ! ! ! ! ”) ;}
p a n n e a u D.s e t P o s Y(y) ;// v o i r c l a s s e P a n n e a u D e s s i n f e n e t r e.r e p a i n t() ;// a c t u a l i s a t i o n de l ’ a f f i c h a g e
E.Gillon - T. Rey´ Page 1 2 f´evrier 2013
TS - sp´e ISN
Les interfaces graphiques
TP 11}
p u b l i c s t a t i c v o i d a f f i c h a g e() {
// A p p e l ´e e au c l i c sur " A f f i c h e r "
f e n e t r e.add(p a n n e a u D, B o r d e r L a y o u t.C E N T E R) ; f e n e t r e.r e p a i n t() ;
f e n e t r e.v a l i d a t e() ;// a c t u a l i s e r l ’ a f f i c h a g e }
p u b l i c s t a t i c v o i d a c t i o n(A c t i o n E v e n t evt) {
// On d e m a n d e q u e l est l ’ ´e v ´e n e m e n t d ´e c l e n c h e u r : O b j e c t r e s u l t a t E v t = evt.g e t S o u r c e() ;
if (r e s u l t a t E v t == p a n n e a u B.b t n A f f i c h e r) { S y s t e m.out.p r i n t l n(”On a f f i c h e ”) ;
aff=t r u e; a f f i c h a g e() ; }
e l s e if (r e s u l t a t E v t == p a n n e a u B.b t n D e m a r r e r) { if (aff) {
p a n n e a u B.t e m p o.s t a r t() ;// On d ´e c l a n c h e le t i m e r du p a n n e a u D
S y s t e m.out.p r i n t l n(”On d´e m a r r e ”) ; }
e l s e {
S y s t e m.out.p r i n t l n(” Commence p a r a f f i c h e r ! ”) ;//
m e s s a g e d ’ e r r e u r }
}
e l s e if (r e s u l t a t E v t == p a n n e a u B.b t n A r r e t e r) { S y s t e m.out.p r i n t l n(”On a r r ˆe t e ”) ;
p a n n e a u B.t e m p o.s t o p() ;// on a r r ^e t e le t i m e r }
e l s e if (r e s u l t a t E v t == p a n n e a u B.b t n Q u i t t e r) { S y s t e m.out.p r i n t l n(” Bye b y e . . . ”) ;
S y s t e m.e x i t(0) ; }
e l s e if (r e s u l t a t E v t == p a n n e a u B.t e m p o) { go() ;
} } }
i m p o r t j a v a.awt.G r a p h i c s; i m p o r t j a v a x.s w i n g.J P a n e l;
p u b l i c c l a s s P a n n e a u D e s s i n e x t e n d s J P a n e l { p r i v a t e int p o s X = 1 0 0 ;
p r i v a t e int p o s Y = 20;
E.Gillon - T. Rey´ Page 2 2 f´evrier 2013
TS - sp´e ISN
Les interfaces graphiques
TP 11p r i v a t e s t a t i c f i n a l l o n g s e r i a l V e r s i o n U I D = 1L;
p u b l i c v o i d p a i n t C o m p o n e n t(G r a p h i c s g) { g.f i l l O v a l(posX, posY, 80 , 80) ;
}
p u b l i c int g e t P o s X() {// p o u r o b t e n i r la p o s i t i o n en x de la b a l l e d e p u i s une a u t r e c l a s s e
r e t u r n p o s X; }
p u b l i c v o i d s e t P o s X(int p o s X) {// i d e m p o u r m o d i f i e r la p o s i t i o n en x
t h i s.p o s X = p o s X; }
p u b l i c int g e t P o s Y() {// i d e m p o u r les y r e t u r n p o s Y;
}
p u b l i c v o i d s e t P o s Y(int p o s Y) { t h i s.p o s Y = p o s Y;
} }
i m p o r t j a v a.awt.C o l o r;
i m p o r t j a v a.awt.e v e n t.A c t i o n E v e n t; i m p o r t j a v a.awt.e v e n t.A c t i o n L i s t e n e r; i m p o r t j a v a x.s w i n g.B o x L a y o u t;
i m p o r t j a v a x.s w i n g.J B u t t o n; i m p o r t j a v a x.s w i n g.J P a n e l;
i m p o r t j a v a x.s w i n g.*;// P o u r le T i m e r
// A t t e n t i o n T i m e r est un o b j e t d i s p o d a n s p l u s i e u r s b i b l i o t h `e q u e s // ils n ’ ont pas t o u s les m ^e m e s p r o p et m ´e t h o d e s .
p u b l i c c l a s s P a n n e a u B o u t o n s e x t e n d s J P a n e l i m p l e m e n t s A c t i o n L i s t e n e r { T i m e r t e m p o;// L ’ o b j e t qui t e m p o r i s e la c h u t e de la b a l l e
J B u t t o n b t n A f f i c h e r = new J B u t t o n(” A f f i c h e r ”) ;// C ’ est c l a i r non ? J B u t t o n b t n D e m a r r e r = new J B u t t o n(” D´e m a r r e r ”) ;
J B u t t o n b t n A r r e t e r = new J B u t t o n(” A r r ˆe t e r ”) ; J B u t t o n b t n Q u i t t e r = new J B u t t o n(” Q u i t t e r ”) ;
p r i v a t e s t a t i c f i n a l l o n g s e r i a l V e r s i o n U I D = 1L; p u b l i c P a n n e a u B o u t o n s() {
t e m p o = new T i m e r(50 , t h i s) ;// le t i m e r se d ´e c l e n c h e t o u t e s les 50 ms
t h i s.s e t L a y o u t(new B o x L a y o u t(this, B o x L a y o u t.P A G E _ A X I S) ) ;// L ’ o r g a n i s a t i o n du p a n n e a u est r ´e g i e par un n o u v e a u L a y o u t t h i s.s e t B a c k g r o u n d(C o l o r.O R A N G E) ;
t h i s.add(b t n A f f i c h e r) ;// on a j o u t e le b o u t o n au p a n n e a u b t n A f f i c h e r.a d d A c t i o n L i s t e n e r(t h i s) ;// on lui a p p l i q u e un
A c t i o n L i s t e n e r p o u r l ’ ´e c o u t e r
E.Gillon - T. Rey´ Page 3 2 f´evrier 2013
TS - sp´e ISN
Les interfaces graphiques
TP 11t h i s.add(b t n D e m a r r e r) ;
b t n D e m a r r e r.a d d A c t i o n L i s t e n e r(t h i s) ; t h i s.add(b t n A r r e t e r) ;
b t n A r r e t e r.a d d A c t i o n L i s t e n e r(t h i s) ; t h i s.add(b t n Q u i t t e r) ;
b t n Q u i t t e r.a d d A c t i o n L i s t e n e r(t h i s) ; }
@ O v e r r i d e// O b l i g a t o i r e je ne s a i s p l u s p o u r q u o i ...
p u b l i c v o i d a c t i o n P e r f o r m e d(A c t i o n E v e n t evt) { // T O D O Auto - g e n e r a t e d m e t h o d s t u b
// D`es qu ’ un ´e v e n e m e n t s u r g i t ( c l i c ou t i m e r ) on l a n c e la m ´e t h o d e ci - d e s s o u s
M a i n.a c t i o n(evt) ; }
}
Tous ces listings sont disponibles sur le forum.
2 Modifications ` a apporter
Quelques id´ees de modifications `a apporter :
1. Ajouter un titre `a la fenˆetre au Nord du BorderLayout. 2. Faire tomber la balle plus vite.
3. Ajouter un boutonacc´elererqui multiplie la vitesse de la balle par 2 `a chaque appui.
4. Ajouter un deuxi`eme panneau de type PanneauDessin dans la fenˆetre, `a la position Est duBorderLayout.
5. Ajouter un texte explicatif au Sud duBorderLayout.
6. Ajouter les textes qui s’inscrivent dans la console au Sud duBorderLayout. 7. Donner `a la balle une vitesse de chute r´ealiste (souvenir de Physique : x= 12gt2).
8. Faire rebondir la balle sur le sol et au plafond (consid´erer dans un premier temps qu’il nni frottement, ni amortissement).
9. Autres id´ees bienvenues. . .
E.Gillon - T. Rey´ Page 4 2 f´evrier 2013