Cours 5 : Le dessin. F. Gayral 1



Documents pareils
Interfaces graphiques avec l API Swing

Java 7 Les fondamentaux du langage Java

Développement Logiciel

JAVA 8. JAVA 8 - Les fondamentaux du langage. Les fondamentaux du langage Java. Avec exercices pratiques et corrigés JAVA 8 29,90.

Desktop Intégration. Rémi Forax

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Introduction au langage Java

LES NOUVEAUTÉS DE ARCON 15 PRO

Le langage JAVA G. Baulieu Institut de Physique Nucléaire de Lyon Septembre 2009

Outils, langage et approche Android Une introduction. Nicolas Stouls lyon.fr

Installation et paramétrage. Accès aux modèles, autotextes et clip- art partagés

Chapitre 2. Classes et objets

StarDraw, le module de dessin de StarOffice 6/7

Construire des plug-ins pour SAS Management Console SAS 9.1

Adobe Illustrator Logiciel de dessin vectoriel et de Cartographie Assistée par Ordinateur

Tutoriel : logiciel de présentation Openoffice Impress

Rapport de stage. Reprise d'un programme Java, développement web et utilisation de CMS

Modules Multimédia PAO (Adobe)

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

RESPONSIVE WEB DESIGN

Introduction à Expression Web 2

Objets et Programmation. origine des langages orientés-objet

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Programmation Orientée Objet

GIMP. Le traitement d'images libre INSTALLATION SUR WINDOWS

Solutions du chapitre 4

2013 Pearson France Adobe Illustrator CC Adobe Press

Silhouette Studio Leçon N 2

TUTORIEL IMPRESS. Ouvrir Impress cocher «présentation vierge», «suivant» cocher «écran», «suivant» cocher «standard», «créer»

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Création d'un site neutre et présentation des éléments de la page d'accueil

MEMENTO D'UTILISATION Du T.N.I. SmartBoard (Version )

Réalisation de cartes vectorielles avec Word

Freeway 7. Nouvelles fonctionnalités

Chapitre 10. Les interfaces Comparable et Comparator 1

Publication Assistée par Ordinateur

Cours 2 : programmation des interfaces graphiques

TP SIN Programmation sur androïde Support : eclipse

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Impress / Présentation

TUTORIEL CartoDB 11/03/15

Guide d utilisation de fonctionnalités avancées de Beyond 20/20 (application à des données départementales issues de Sit@del2)

La Programmation Orientée Agent Les Agents Réactifs

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

PRODIGE V3. Manuel utilisateurs. Consultation des métadonnées

Création d'une interface graphique

.. CSS. Damien Nouvel. Damien Nouvel (Inalco) CSS 1 / 15

Formation VBA 3 Interagir

Création d un service web avec NetBeans 5.5 et SJAS 9

HMI target Visu / PLC HMI. Pour réaliser une interface homme machine avec PLC control

Fête de la science Initiation au traitement des images

OneDrive, le cloud de Microsoft

Héritage presque multiple en Java (1/2)

Guide pour la réalisation d'un document avec Open Office Writer 2.2

Dessiner dans Galaad FRANÇOIS PALLUT

Programmation avancée et répartie en Java : interfaçage avec d autres langages

Fichiers d'archives java - *.jar

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Guide Draw. Chapitre 5 Combiner plusieurs objets

Programmation par les Objets en Java

les Formulaires / Sous-Formulaires Présentation Créer un formulaire à partir d une table...3

Généralités sur le Langage Java et éléments syntaxiques.

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

Premiers Pas en Programmation Objet : les Classes et les Objets

Outlook Présentation.

GL BE FLYER. Chef de projet de l équipe : SCIONICO Pierre

PowerPoint offre trois modes d affichage principaux : le mode Normal, le mode Trieuse de diapositives et le mode Diaporama

Mise en forme d'un document écrit sous Word - quelques rappels pour consolider ses connaissances -

Support de formation Notebook

Alcatel OmniPCX Office

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Comment faire un Mailing A partir d une feuille Calc

PLAN. Qui peut faire quoi? Présentation. L'internaute Consulte le site public

Tutorial pour une application simple

Swyx Skin Editor - Guide de l'utilisateur. SwyxIt Skin Editor L éditeur de création des habillages individuels

Utiliser le logiciel Photofiltre Sommaire

AVEC LIVE TRADER, VISEZ PLUS HAUT POUR VOS INVESTISSEMENTS

My Custom Design ver.1.0

Programmation Objet Java Correction

Tp_chemins..doc. Dans la barre "arche 2" couleur claire 1/5 21/01/13

F. Barthélemy. 17 mai 2005

Modélisation PHP Orientée Objet pour les Projets Modèle MVC (Modèle Vue Contrôleur) Mini Framework

Bases Java - Eclipse / Netbeans

L Histoire de Java. «Portable» veut dire qu il peut tourner sur plusieurs systèmes d exploitations différents ; Windows, Linux

Ladibug TM 2.0 Logiciel de présentation visuel d'image Manuel de l utilisateur - Français

Création de maquette web

Programmation avec des objets : Cours 7. Menu du jour

Comment créer un diagramme de Gantt avec OpenOffice.org

Programmer en JAVA. par Tama

Centre de formation: Collège IBN BASSAM - TEMARA. Ce cours est proposé par le professeur d informatique:

TP1 : Initiation à Java et Eclipse

Projet de programmation (IK3) : TP n 1 Correction

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Transcription:

Cours 5 : Le dessin - Comment les composants s'affichent? - La méthode paint - La méthode paintcomponent - La méthode repaint - La classe Graphics - La classe Graphics2D F. Gayral 1

Affichage déclenché par le système ou l application Le système demande à un composant de se peindre quand : le composant est rendu visible pour la première fois sur l écran le composant a été redimensionné le rendu du composant a été endommagé (masqué puis à nouveau visible, transformé en icône ou l inverse, activé ) Exemple : show adressé à une JFrame provoque un affichage Affichage déclenché par l application : Le composant doit se repeindre pour refléter un changement dans son état interne F. Gayral 2

Jusque là, on n'a pas eu besoin de s'intéresser à l'affichage graphique. Pourquoi? Les composants Swing gèrent seuls leurs affichage et savent se repeindre quand nécessaire Quand ils sont inclus dans un composant qui doit lui-même se réafficher Quand leur état interne est modifié exemple : méthode settext adressée à un JTextComponent est évoquée F. Gayral 3

Les besoins graphiques «primaires» de l application peuvent être résolus en utilisant des composants Si l'application a besoin d'afficher du texte Elle peut se servir d'un JLabel et de sa méthode settext Si l'application a besoin d'afficher une image Elle peut l'afficher dans un JLabel (ou autre): Icon tigericon = new ImageIcon("SmallTiger.gif"); JLabel monlabel = new JLabel (tigericon, JLabel.CENTER); F. Gayral 4

Principe d affichage d'un composant La demande de repeinte du composant (qu elle soit déclenchée par le système ou par l application) est demandée par l intermédiaire de la méthode public void paint (Graphics g). Même méthode quel que soit le composant Quand cette méthode est appelée, le paramètre, instance de Graphics (contexte graphique) est pré-configuré par le système avec un état approprié pour dessiner sur ce composant particulier F. Gayral 5

Et s'il y a des composants imbriqués? Si la fenêtre principale contient d'autres composants, l'affichage suit l'ordre d'imbrication des composants c= this.getcontentpane(); c.add(newjbutton( I'm a Swing button! ); c.add(new JLabel( Number of buttonclicks:0 )); Imbrication des composants JFrame zone de travail JButton JLabel F. Gayral 6

Décomposition de l'affichage graphique de l exemple 1. La JFrame se peint puis demande à son aire de travail de se peindre 2. Le content pane se peint (en gris) et demande à chacun de ses composants imbriqués de se peindre 3. Le bouton se peint ~ peint son background puis peint son texte 4. Le label se peint ~ peint son texte Remarque : c'est là que l'opacité du composant peut jouer F. Gayral 7

Décomposition de l'affichage graphique en général Un composant (instance de JComponent) se peint lui-même d abord puis peint les composants qu'il contient (ses enfants) Ordre : 1. Se peindre lui-même 2. Peindre son bord 3. Peindre ses enfants (s'il en a) F. Gayral 8

Techniquement, comment ça se passe? La méthode d'affichage graphique d'un composant est toujours la même : public void paint(graphics g) Sa signature est fixe, le paramètre est fourni par le système Cette méthode appelle dans l'ordre les méthodes en leur passant son propre paramètre g : 1. Se peindre soi-même : void paintcomponent(graphics g) 2. Peindre son bord : void paintborder(graphics g) 3. Peindre ses enfants : void paintchildren(graphics g) paintchildren : F. Gayral 9

Que faire pour faire du "Customer painting"? (affichage graphique spécifique) On ne redéfinit ni paint, ni paintborder, ni paintchildren mais seulement void paintcomponent (Graphics g) paintcomponent est une méthode de JComponent donc impossible de faire de redéfinir cette méthode pour la zone de travail d'une JFrame ou JApplet Solution : Définir une sous-classe (appropriée) de JPanel correspondant à la zone où on veut faire de l'affichage graphique. Et rédéfinir dans cette classe la méthode void paintcomponent (Graphics g) F. Gayral 10

Comment faire du "Customer painting"? (affichage graphique spécifique) En swing, on ne redéfinit ni paint, ni paintborder, ni paintchildren mais seulement paintcomponent Définir une classe spécifique (héritant de JComponent ou d une de ses sous-classes) correspondant au composant dans lequel on veut faire de l'affichage graphique Rédéfinir dans cette classe la méthode void paintcomponent (Graphics g) où on met le code indiquant ce qu il faut peindre dans le composant après avoir fait un appel à super.paintcomponent(g). F. Gayral 11

La classe Graphics (contexte graphique) Graphics = Boîte à outils de dessin la classe Graphics : Encapsule les caractéristiques courantes : couleur du fond, couleur du trait, style de trait, police, Offre toutes les méthodes pour dessiner, colorier, A tout composant est associé une instance de la classe Graphics qui est pré-configurée par le système avec un état approprié pour dessiner sur le composant F. Gayral 12

Une instance de Graphics pour un composant L'instance de Graphics, g, associée à un composant est préconfigurée avec un état approprié pour dessiner sur ce composant : l'objet couleur de g prend pour valeur celle du foreground du composant sa fonte est celle de la fonte du composant (instance de la classe Font) sa translation est fixée de sorte que les coordonnées (0,0) représente le coin supérieur gauche du composant son rectangle est fixé à la zone qui doit être repeinte (rectangle de découpe ou clip rectangle) F. Gayral 13

La classe Graphics fournit des méthodes pour changer son état Translater la zone d'affichage translate(x,y) Changer la zone de clipping (forcément + petite) get/setclip(x,y,width,height) Changer la couleur courante get/setcolor(color) Changer la fonte courante get/setfont(font) F. Gayral 14

La classe Graphics fournit des méthodes de dessin (qui utilisent l état courant) Afficher une ligne, rectangle, ellipse ou polygone drawline(x1,y1,x2,y2) drawrect(x,y,width,height) drawoval(x,y,width,height) drawpolygon(polygon) Afficher remplit un rectangle, ellipse ou polygone fillrect(x,y,width,height) filloval(x,y,width,height) fillpolygon(polygon) Les coordonnées ont pour origine le sommet supérieur gauche du rectangle graphique F. Gayral 15

Premier exemple : diagonale de la fenêtre toujours tracée Démo public class FenAfficheDiagonale extends JFrame { public FenAfficheDiagonale(String titre, int w, int h) {super(titre); this.initialise(); this.setsize(w,h); this.show(); } public void initialise() { Container c= this.getcontentpane(); PanelDiagonale pan=new PanelDiagonale(); c.add(pan, «Center»); F. Gayral 16

La nouvelle classe pour le graphique public class PanelDiagonale extends JPanel { public void paintcomponent(graphics g) { super.paintcomponent(g); int larg= this.getwidth(); int haut= this.getheight(); g.drawline(0, 0, larg, haut); } } Les dimensions sont calculées dynamiquement à chaque nouvel appel F. Gayral 17

Fonctionnement de l'affichage de la fenêtre FenAfficheDiagonale contient un composant, instance de PanelDiagonale, "qui prend toute la place" Quand FenAfficheDiagonale s'ouvre, se redimensionne,... la fenêtre se peint elle-même puis peint son seul fils (un PanelDiagonale ) en appelant la méthode paintcomponent définie dans PanelDiagonale Mais on ne sait pas quand l appel a lieu F. Gayral 18

Attention : on ne maîtrise pas quand la méthode paintcomponent est appelée C est le composant qui doit connaître, à tout instant, les informations sur l'affichage qu'il doit réaliser ==> Solution : le composant doit avoir ces informations en variables membres Ces informations doivent être toujours "à jour", de façon à refléter, à tout instant, ce qui doit être affiché dans le composant Elles seront exploitées par la méthode paintcomponent F. Gayral 19

Continuation de l'exemple : choisir, dans un menu, la couleur d'affichage de la diagonale Démo Analyse : qu'est-ce qui change? Au niveau graphique : Munir la fenêtre d un menu Au niveau événementiel : Créer une inner-classe CouleurListener écoutant les événements du menu, implémentant ActionListener Que doit faire la méthode actionperformed? Récupérer la couleur sélectionnée Modifier la couleur d affichage du panneau graphique Et surtout, le panneau graphique doit toujours s afficher dans la couleur choisie. F. Gayral 20

Analyse (suite) Le panneau graphique doit connaître à tout moment la couleur dans laquelle il va afficher le rectangle mettre une variable membre Color coul dans PanelDiagonale coul sera utilisé dans la méthode paintcomponent Il doit y avoir une communication entre l objet fenêtre et l objet panneau graphique pour que l'écouteur CouleurListener puisse changer cette couleur : Mettre le panneau graphique en variable membre de la fenêtre Mettre une méthode setcolor dans PanelDiagonale Adresser cette méthode au panneau graphique L'écouteur CouleurListener doit pouvoir forcer le réaffichage du panneau graphique F. Gayral 21

Mais attention! Le programmeur ne peut pas faire appel directement à la méthode paintcomponent L affichage dans un composant n est jamais fait directement mais de manière asynchrone S'il veut modifier l affichage : Il doit utiliser la méthode repaint() repaint() adressée à un composant déclenche l exécution de sa méthode paintcomponent et donc le réaffichage du composant F. Gayral 22

public class FenDiagonaleMenu extends JFrame { private PanelDiagonale pan; public FenDiagonaleMenu(String titre, int w, int h) { super(titre); this.initialise(); this.setsize(w,h); this.show(); } La fenêtre public void initialise() { pan=new PanelDiagonale(); this.getcontentpane().add(pan, «Center»); this.initialisemenu(); } F. Gayral 23

public void initialisemenu() { JMenuBar jmb = new JMenuBar(); this.setjmenubar(jmb); JMenu mdef = new JMenu ("Couleur"); jmb.add(mdef); JMenuItem ibleu= new JMenuItem ("Bleu"); mdef.add(ibleu); JMenuItem irouge= new JMenuItem ("Rouge"); mdef.add(irouge); irouge.addactionlistener(new CouleurListener()); ibleu.addactionlistener(new CouleurListener()); } F. Gayral 24

L inner-classe : écouteur class CouleurListener implements ActionListener { public void actionperformed(actionevent e) { String s=e.getactioncommand(); if (s.equals("rouge")) pan.setcolor(color.red); else pan.setcolor(color.blue); pan.repaint(); } }// fin CouleurListener }// fin FenDiagonaleMenu F. Gayral 25

public class PanelDiagonale extends JPanel { private Color coul; public PanelDiagonale () { coul=color.black; } Le panneau graphique public void setcolor(color c) { coul=c; } public void paintcomponent(graphics g) { super. paintcomponent(g); g.setcolor(coul); int larg= this.getwidth(); int haut= this.getheight(); g.drawline(0, 0, larg, haut); } F. Gayral 26

Spécificités de Swing Par défaut, l'affichage graphique se fait par doublebufferisation L'affichage est exécuté dans un buffer en mémoire (off screen Intérêts : buffer) puis une fois l'affichage totalement effectué sur ce buffer, ce buffer est vidé (flushed) à l'écran. meilleure performance Exemple : si un composant est opaque, rien ne sera peint derrière lui en final. pas de clignotement F. Gayral 27

Supplément sur la classe Graphics Afficher une image g.drawimage(image, x, y, ImageObserver) Le composant dans lequel l image doit s afficher ImageObserver est une interface L'argument de type ImageObserver passé aux méthodes est souvent this (doit être un objet d'une classe qui implémente l'interface ImageObserver, par exemple Component). F. Gayral 28

Graphics : Afficher une image Première étape : Créer une instance de la classe Image à partir d un fichier Lecture dans un fichier local String nom = bleu.gif ; Image image; image = Toolkit.getDefaultToolkit().getImage(nom ); Lecture sur Internet URL u = new URL( http://www.quelquepart.com/image.jpg ); Image image = Toolkit.getDefaultToolkit().getImage(u); F. Gayral 29

Deuxième étape : utiliser la méthode drawimage de la classe Graphics public class PanelImage expends JPanel { private Image image; public PanelImage(String nom) { image=... // définie à partir du nom public void paintcomponent(graphics g) { super. paintcomponent(g); g.drawimage(image, 0, 0, this); } F. Gayral 30

Affichage de l'image avec déformation éventuelle drawimage(image img, int x, int y, int width, int height, ImageObserver observer) affiche l'image adaptée au rectangle indiqué l'image est mise à la bonne échelle F. Gayral 31

Exemple : Affichage de l'image en double 1 fois en haut à gauche dans son format normal 1 autre fois à l'échelle du reste Démo F. Gayral 32

class PanelImageEchelle extends JPanel { classe graphique private Image im; La public PanelImageTriple(String nomimage) { im = Toolkit.getDefaultToolkit().getImage(nomImage); this.setbackground(color.white); } public void paintcomponent(graphics g){ super.paintcomponent(g); int himage= im.getheight(this); int limage = im.getwidth(this); int hpanel= this.getheight(); int lpanel = this.getwidth(); g.drawimage(im, 0, 0, this); //85x62 image g.drawimage(im, limage, himage, lpanel-limage, hpanelhimage, this); F. Gayral 33

Pour des dessins plus sophistiqués : l API JAVA2D capacités graphiques avancées en deux dimensions graphismes, images, et textes 2D extension java.awt et utilisation de nouvelles classes Caractéristiques Java2D structure de remplissage (dégradés, motifs) personnaliser la largeur et le style d un trait F. Gayral 34

la Classe Graphics2D La classe Graphics2D hérite de la classe Graphics Depuis java 1.2, l objet Graphics fourni à la méthode paint est en réalité une instance de la classe Graphics2D Pour maintenir la compatibilité ascendante avec java 1.1, la signature de la méthode void paint(graphics g) est inchangée F. Gayral 35

Se servir de la classe Graphics2D Pour utiliser Java2D, il faut caster le paramètre (déclaré instance de Graphics) en un objet de la classe Graphics2D : public void paintcomponent (Graphics g) { super.paintcomponent(g); Graphics2D g2d= (Graphics2D) g ; g2d... F. Gayral 36

Exemples basiques de code Utiliser des interfaces/classes de java.awt.* pour Choisir l outil de dessin du trait (pour les contours) Stroke stroke = new BasicStroke(5); g.setstroke(stroke); choisir l outil de remplissage (couleur : Color, dégradé, motif) Paint paint =...; g.setpaint(paint); définir la forme de découpage Shape clip =...; g.setclip(clip); F. Gayral 37