Vous êtes sur la page 1sur 6

Elments graphiques de base en java

Projet de Programmation 2012/2013 - 51IF2IK3


Le but de cette note nest pas de vous fournir un cours dinterface graphique, mais uniquement des lments de base vous permettant de raliser la partie graphique des projets. Ce document regroupe des suggestions. Vous tes libres de grer autrement vos afchages.

1
1.1

Interface graphique
Ouvrir une fentre graphique

La classe javax .swing.JFrame est une fentre graphique avec un titre et une bordure. On peut faire apparatre une telle fentre de la faon suivante :
2 4 6 8 import j a v a x . s w i n g . JFrame ; import j a v a x . s w i n g . Wi n do w C on s ta n ts ; c l a s s MaFenetre { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { JFrame fenetre = new JFrame("titre") ; //nouvel objet fentre graphique fenetre.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE) ; //pour que lobjet soit supprim la fermeture de la fentre fenetre.setVisible(true) ; //afchage de la fentre 12 } }

La fentre ainsi dnie ne contenant rien, elle est de dimension minimale et donc non visible. Pour quon puisse la voir, il faut mettre un lment graphique dedans. Par exemple un javax .swing.JPanel qui est un conteneur dont on peut spcier entre autres la dimension :
2 //... autres imports import j a v a x . s w i n g . J P a n e l ; import j a v a . awt . D i m e n s i o n ; c l a s s MaFenetre { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { JFrame f e n e t r e = new JFrame ( " t i t r e " ) ; JPanel canvas = new JPanel() ; //lment dafchage cr 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 ( W in d o wC o ns t an t s . EXIT_ON_CLOSE ) ; canvas.setPreferredSize(new Dimension(400,200)) ; //dimension du canevas fenetre.getContentPane().add(canvas) ; //canevas rattach la fentre fenetre.pack() ; //la fentre sajuste ce quelle contient f e n e t r e . s e t V i s i b l e ( true ) ; } 16 }

6 8 10 12 14

Rcrire chaque fois tous les dtails douverture de fentre est fastidieux et source derreurs. Cest pourquoi en java on prfre encapsuler les donnes, cest--dire tout cacher dans une nouvelle classe laquelle on dlgue le rle douvrir une fentre. Les objets de la classe MaFenetre sont des fentre qui lors de leur cration ont une taille 400 200 et safchent :
//... imports c l a s s M a F e n e t r e extends JFrame { public MaFenetre ( S t r i n g t i t r e ){ /* toute la mise en place est faite dans le constructeur */ super ( t i t r e ) ; J P a n e l c a n v a s = new J P a n e l ( ) ; t h i s . s e t D e f a u l t C l o s e O p e r a t i o n ( W in d ow C on s ta n t s . EXIT_ON_CLOSE ) ; c a n v a s . s e t P r e f e r r e d S i z e ( new D i m e n s i o n ( 4 0 0 , 2 0 0 ) ) ; t h i s . g e t C o n t e n t P a n e ( ) . add ( c a n v a s ) ; t h i s . pack ( ) ; t h i s . s e t V i s i b l e ( true ) ; } } c l a s s OuvrirMaFenetre { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { MaFenetre fenetre = new MaFenetre("titre") ; /* appel simpli pour crer la fentre */ } }

4 6

10 12 14

18 20 22

1.2

Dessiner un lment dans la fentre

Une fois la fentre ouverte, on peut placer des lments graphiques dans le canevas. Pour cela, il faut rednir la mthode paintComponent de la classe JPanel , qui est toujours appele la cration dun JPanel , en tendant cette classe :
2 4 6 //... autres imports import j a v a . awt . G r a p h i c s ; c l a s s M a F e n e t r e e x t e n d s JFrame { public MaFenetre ( S t r i n g t i t r e ){ super ( t i t r e ) ; JPanel canvas = new Canvas() ; /* instance de Canvas qui rednit paintComponent */ //... mise en place du canevas dans la fentre 10 } class Canvas extends JPanel{ p u b l i c Canvas ( ) { super ( ) ; } public void paintComponent(Graphics g){ //invoque lors de la cration du JPanel g . f i l l R e c t (70 ,120 ,100 ,50); } } }

14 16 18 20

Si on veut pouvoir accder de faon ultrieur au rectangle dessin prcdemment, il faut garder une rfrence lobjet cr, cest pourquoi on lencapsule dans le canevas : 2

1 3

//... autres imports import j a v a . awt . R e c t a n g l e ; import j a v a . awt . G r a p h i c s 2 D ; import j a v a . awt . C o l o r ; c l a s s M a F e n e t r e e x t e n d s JFrame { public MaFenetre ( S t r i n g t i t r e ){ super ( t i t r e ) ; J P a n e l c a n v a s = new Canvas ( new R e c t a n g l e ( 7 0 , 1 2 0 , 1 0 0 , 5 0 ) ) ; /* on fait appel un nouveau constructeur */ //... mise en place du canevas dans la fentre

7 9

13 }

17 19 21

c l a s s Canvas e x t e n d s J P a n e l { private Rectangle rectangle ; /* rectangle encapsul dans le canevas */ p u b l i c Canvas ( R e c t a n g l e r e c t a n g l e ) { super ( ) ; this . rectangle = rectangle ; } public void paintComponent ( Graphics g ){ Graphics2D g2 = (Graphics2D) g ; /* la classe Graphics2D tend la classe Graphics et est bien plus pratique utiliser */ g2 . s e t C o l o r ( C o l o r . WHITE ) ; //on xe la couleur par dfaut g2.ll(this.getBounds()) ; //on remplit la fentre de blanc g2 . s e t C o l o r ( C o l o r . BLACK ) ; g2 . f i l l ( t h i s . r e c t a n g l e ) ; } }

25 27 29 31

Le downcast de la ligne 25 est autoris car depuis sa version 1.2 la JVM cre une instance de la classe
Graphics2D quand on lui demande un instance de la classe Graphics.

1.3

Dplacer un lment dans la fentre

Pour dplacer un lment dans le canevas, il faut que le canevas ragisse certaines actions de lutilisateur. Nous allons faire en sorte que le rectangle prcdent se dplace lendroit on lon clique avec la souris. Pour cela, on cre un contrleur quon attache au canevas.
//... imports c l a s s M a F e n e t r e e x t e n d s JFrame { public MaFenetre ( S t r i n g t i t r e ){ super ( t i t r e ) ; c a n v a s = new Canvas ( new R e c t a n g l e ( 7 0 , 1 2 0 , 1 0 0 , 5 0 ) ) ; //... mise en place du canevas dans la fentre MonControleur controleur = new MonControleur(canvas) ; //cration dun contrleur canvas.addMouseListener(controleur) ; //rattachement du contrleur au canevas } } c l a s s Canvas e x t e n d s J P a n e l {

4 6 8 10 12

16 } 1 3

//... dnition de la classe Canvas

import j a v a . awt . e v e n t . M o u s e L i s t e n e r ; import j a v a . awt . e v e n t . MouseEvent ; import j a v a . awt . R e c t a n g l e ;

7 9 11 13 15

p u b l i c c l a s s M o n C o n t r o l e u r implements MouseListener { Canvas c a n v a s ; p u b l i c M o n C o n t r o l e u r ( Canvas c a n v a s ) { t h i s . canvas = canvas ; } public void mouseClicked(MouseEvent e){ //action ralise au clic de souris t h i s . c a n v a s . r e c t a n g l e = new R e c t a n g l e ( e.getX() , e.getY() , 1 0 0 , 5 0 ) ; this.canvas.repaint() ; // appel (indirect) paintComponent } //autres mthodes pour ragir dautres vnements de la souris public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} }

19 21 23

Contrleur Dautres contrleur peuvent tre crs pour dautres types dactions. Ils implmentent alors dautres interfaces. Ces interfaces tendent linterface java . util . EventListener .

1.4

Autres widget
javax .swing.JButton : boutons cliquables javax .swing.JComboBox : menus droulants javax .swing. JTextField : fentre pour crire une ligne de texte javax .swing.JLabel : afchage dun texte ou dune image javax .swing.JColorChooser : table de choix de couleurs javax .swing. JSlider : choix par ascenceur dune valeur dans un intervalle Sous-classes de javax .swing.JComponent

http://download.oracle.com/javase/tutorial/uiswing/components/componentlist.html

2
2.1

Images
Lire une image

La classe java .awt.image.BufferedImage permet de stocker et manipuler une image. Pour lire une image, la stocker dans un objet de type BufferedImage et rcuprer son type, sa largeur et sa hauteur, on procde de la faon suivante :
2 import j a v a . i o . ; import j a v a . awt . image . B u f f e r e d I m a g e ; import j a v a x . i m a g e i o . ImageIO ; c l a s s MyImage{ protected BufferedImage image ;

int type ; protected int largeur ; protected int hauteur ; MyImage ( S t r i n g i n p u t ) { try { image = ImageIO.read(new File(input)) ; //initialise lobjet image avec les donnes de limage input type = image.getType() ; //recupre le type de limage largeur = image.getWidth() ; //recupre la largeur de limage hauteur = image.getHeight() ; //recupre la hauteur de limage } catch ( IOException exception ){ System . o u t . p r i n t l n ( " L e c t u r e du f i c h i e r " + i n p u t + " i m p o s s i b l e ! " ) ; } } }

12 14 16 18 20

La mthode read doit tre invoque dans un try . . . catch . . . car cette mthode lve une exception si lors de la lecture un problme survient (par exemple si le chier input nexiste pas).

2.2

Les composantes r, g et b dune image et son niveau de transparence


Pour obtenir la couleur au format RGB dun pixel de coordonnes (i, j), il faut appeler la mthode

getRGB(i,j) sur lobjet de type BufferedImage. Celle-ci retourne un entier contenant les composantes r, g et

b, ainsi que le niveau de transparence du pixel. Pour obtenir respectivement les composantes r, g et b, ainsi que le niveau de transparence dune couleur c code en RGB, il faut crer un objet de type java .awt.Color initialis la couleur c et respectivement invoquer dessus les mthodes getRed, getGreen, getBlue et getAlpha qui retournent un entier compris entre 0 et 255.
2 4 6 8 10 12 14 } int getTransparence ( int i , int j ){ return (new Color(image.getRGB(i,j))).getAlpha() ; /* retourne le niveau de transparence de c, donc de rgb (0 : transparent, 255 : opaque) */ } } import j a v a . awt . C o l o r ; //... autres imports c l a s s MyImage{ p r o t e c t e d B u f f e r e d I m a g e image ; //... autres attributs MyImage ( S t r i n g i n p u t ) { //... constructeur} i n t getRouge ( i n t i , i n t j ){ int rgb = image.getRGB(i,j) ; //recupre la valeur RGB du pixel (i,j) Color c = new Color(rgb) ; //nouvel objet initialis avec la couleur rgb return c.getRed() ; //retourne la composante rouge de c, donc de rgb

18 20

2.3

Dessiner dans limage

Lorsquon veut dessiner dans limage, il faut pouvoir rcuprer un objet graphique. La mthode createGraphics , applique un objet image de type BufferedImage, retourne un objet de type Graphics2D, qui peut tre utilis pour dessiner dans limage contenue dans image.

2 4 6 8 10 12 14

import j a v a . awt . G r a p h i c s 2 D ; //... autres imports c l a s s MyImage{ p r o t e c t e d B u f f e r e d I m a g e image ; //... autres attributs MyImage ( S t r i n g i n p u t ) { //... constructeur} Graphics2D getMonGraphique ( ) { return image.createGraphics() ; /* retourne un objet de type Graphics2D permettant de dessiner dans limage */ } }

2.4

Sauvegarder une image

Pour sauvegarder une image stocke dans un objet de type BufferedImage, il faut connatre son format (jpeg, png, gif, . . .). Comme la mthode read , la mthode write lve une exception si lors de lcriture un problme survient (par exemple si lutilisateur du programme na pas les droits en criture).
//... imports c l a s s MyImage{ p r o t e c t e d B u f f e r e d I m a g e image ; //... autres attributs MyImage ( S t r i n g i n p u t ) { //... constructeur} void e c r i r e I m a g e ( S t r i n g o u t p u t ){ try { ImageIO.write(image, "jpeg", new File(output)) ; //crit limage contenue dans image dans le chier output } catch ( IOException exception ){ System . o u t . p r i n t l n ( " E r r e u r d e c r i t u r e : " + e x c e p t i o n . t o S t r i n g ( ) ) ; } } }

10 12 14 16