Programmation événementielle & Interfaces Graphiques

Transcription

Programmation événementielle& interfaces graphiques Java SwingEric LecolinetTélécom Pariswww.telecom-paris.fr/ elcPage 1Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTechJanvier 2021

Toolkits graphiques JavaPour le Desktop JavaFXnouveau, inspiré du Web Swing AWT Componentsobsolète SWTEclipse FoundationSwing est multi-plateformes repose sur AWT Components mais pas la même chose !– attention : JButton ! Button !Page 2Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Composants SwingSource: documentation IBMPage 3Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

InteracteursPage 4Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

BoutonsJButtonJCheckbox :choix idépendantsJRadioButton :choix exclusif : cf. ButtonGroupSource: documentation Java OraclePage 5Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

TexteJTextFieldJPasswordFieldJTextArea :texte simple multilignesAscenseurs :JScrollPanePage 6JEditorPane : texte avec stylescompatible HTML et RTFProgrammation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

ConteneursJPanel: conteneur générique.JScrollPane:avec ascenseurs intégrésJSplitPane:avec « diviseur » intégréPage 7Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

ConteneursJToolBar: barre d’outils(sous la barre de menus)JTabbedPane:ongletsJTreeJTablePage 8Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

FenêtresJFrame : fenêtre principale de l’applicationJDialog : fenêtre secondaire– normalement dépendante de la JFrame : pas d’iconification séparée, toujours au dessus de la JFrame– souvent temporaire et modale : bloque l’interaction, impose à l’utilisateur de répondrePage 10Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

FenêtresCréent des paneaux intermédiaires ContentPane : conteneur où on ajouteles composants graphiques GlassPane : conteneur transparent superposé(pour usages avancés)Page 11Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Boîtes de dialogue éPeuvent être créés : comme composants internes ou comme boîtes de dialogueJOptionPane (multiples variantes)Page 12Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Menusraccourciclavier(accelerator)mnémoniquePage 13Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Arbre d’instanciationArbre d’instanciation arbre de filiation des instances de composants graphiquesPage 14Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Arbre d’instanciationChaque objet graphique « contient » ses enfants superposition : enfants affichés au dessus des parents clipping : enfants « découpés » : ne dépassent pas des parentsPage 15Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Arbre d’instanciationAttention : ne pas confondre avec l’arbre d’héritage ! arbre d’instanciation arbre de filiation des instances arbre d’héritage hiérarchie des classesPage 16Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Arbre d’instanciationObjet de plus haut niveau de l’arbre : JFrameLes conteneurs peuvent être emboîtés en particulier les JPanelsLes layout managers assurent la disposition spatiale un layout manager par conteneur défaut pour JPanel : FlowLayout, pour JWindow : BorderLayout, etc.Ne pas oublier d’appeler : frame.pack( ) frame.setVisible(true)Page 17// calcul récursif des positions et des tailles// fait apparaître la fenêtreProgrammation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Exemple : version 0import javax.swing.*;public class BipBip extends JFrame {JButton button null;// fenêtre principalepublic static void main(String argv[ ]) {BipBip toplevel new BipBip();// en gris : optionnel}public BipBip() {button new JButton ("Please Click Me !");getContentPane().add(button);// en gris : avant version 5setDefaultCloseOperation(JFrame.EXIT ON CLOSE);setTitle("Bib Bip");pack();setVisible(true);// calcule la disposition spatiale// rend l’interface visible}}Page 18Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Exemple : version 0Notes et rappels package javax.swing une seule classe public par fichier, le fichier doit avoir le même nom button est une variable d’instance (on peut l’initialiser contrairement à C ) toplevel est une variable locale main() est une méthode de classe (cf. static) les méthodes d’instance ont automatiquement accès aux variables d’instanceelles ont un paramètre caché this qui pointe sur l’instance getContentPane() nécesaire avant la version 5 à cause du JRootPaneJWindow.add() a été redéfini dans les versions ultérieure de JavaPage 19Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

EvénementsEvénements envoyés à l’application ciblée à chaque action élémentaire de l’utilisateurPage 20Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Boucle de gestion des événementsBoucle infinie qui récupère les événements notifie les composants graphiquesLancée automatiquement à la fin de la méthode main() dans le cas de JavaPage 21Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Evénements JavaEvénements AWT et Swing objets correspondant à des catégories d’évenements les principaux héritent de java.awt.event.AWTEventEvénements de “bas niveau” MouseEvent KeyEvent WindowEvent FocusEventetc.appuyer, relacher, bouger la souris .appuyer, relacher une touche clavier.fermeture des fenêtres .focus clavier ( où vont les caractères tapés au clavier)Evénements de “haut niveau” ActionEvent TextEventetc.Page 22activer un bouton, un champ textuel .abstraction des événements de bas niveaumodification du texte entréProgrammation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Evénements JavaMéthodes communes aux AWTEvent getSource()objet producteur (Object) getID()type d’événement (int)Exemple: méthodes de MouseEvent getX(), getY() getClickCount() getModifiers() getWhen() etc.Page 23Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Détecter les événementsPrincipe : patron Observateur / Observé Associer un ou des observateurs aux objets observés Les observateurs sont notifié(s) automatiquement quand une certaine condition se produit sur un observésource: WikipediaPage 24Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Event listenersA chaque classe d’événement correspond une classe d’Event Listener(sauf cas particuliers)Exemple : ActionEvent Evénement : ActionEvent Listener :ActionListener Méthode : actionPerformed(ActionEvent)Page 25Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Event listenersExemple : MouseEvent Evénement : MouseEvent Listener : MouseListener Méthodes : Released(MouseEvent) Listener : MouseMotionListener Méthodes : mouseDragged(MouseEvent) mouseMoved(MouseEvent)Remarque toutes les méthodes doivent être implémentées car les Listeners sont des interfaces (au sens du langage Java)Page 26Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Rendre les composants réactifsAssocier des Listeners aux composants graphiques un composant peut avoir plusieurs listeners un même listener peut être associé à plusieurs composantsPage 27Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Exemple : version 1import javax.swing.*;import java.awt.event.*;public class BipBip extends JFrame {JButton button;public static void main(String argv[ ]) {new BipBip();class Ecoute implements ActionListener {}public BipBip() {button new JButton ("Do It!");add(button);// méthode appelée quand on active le boutonpublic void actionPerformed(ActionEvent e) {System.out.println("Done!");}}// créer et associer un ActionListenerEcoute elc new CloseOperation(EXIT ON CLOSE);pack();setVisible(true);Inconvénients ?}Page 28Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

import javax.swing.*;import java.awt.event.*;public class BipBip extends JFrame {JButton button;JLabel label new JLabel();public static void main(String argv[ ]) {new BipBip();class Ecoute implements ActionListener {public void actionPerformed(ActionEvent e) {}public BipBip() {button new JButton ("Do It!");add(button);Ecoute elc new loseOperation(EXIT ON "Done!");label.setText("Done!"); // ne compile pas !}}Communication entre objetscomment le Listener peut-il agirsur les composants graphiques ?}}Page 29Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

import javax.swing.*;import java.awt.event.*;class Ecoute implements ActionListener {BipBip bipbip;public class BipBip extends JFrame {JButton button;JLabel label new JLabel();public Ecoute (BipBip mainWin) {this.bipbip mainWin;}public static void main(String argv[ ]) {new BipBip();public void actionPerformed(ActionEvent e) "Done!");}public BipBip() {button new JButton ("Do It!");add(button);Ecoute elc new loseOperation(EXIT ON CLOSE);pack();setVisible(true);}}}Solution le Listener a une référencevers la partie graphique solution flexible mais lourde}Page 30Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Objets hybridesA la fois composant graphique et Listener un seul objet plus de problème de communication entre objets ! principe de l’héritage multiple restreint avec Java : on peut « hériter » de plusieurs interfaces (mais pas de plusieurs classes)Page 31Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Exemple : version 2import javax.swing.*;import java.awt.event.*;public class BipBip extends JFrame implements ActionListener {JButton button;JLabel label new JLabel();public static void main(String argv[ ]) {new BipBip();}public BipBip() {add(button new JButton ("Do It"));// BibBip est à la fois un JFrame et un loseOperation(EXIT ON CLOSE);pack();setVisible(true);}public void actionPerformed(ActionEvent e) {label.setText("Done!");}}Page 32actionPerformed() à accès à labelcar c’est une méthode d’instancede BibBipInconvénients ?Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

import javax.swing.*;import java.awt.event.*;public class BipBip extends JFrame implements ActionListener {JButton button;JLabel label new JLabel();public static void main(String argv[ ]) {new BipBip();}public BipBip() {add(button new JButton ("Do It"));// BibBip est à la fois un JFrame et un loseOperation(EXIT ON CLOSE);pack();setVisible(true);}Plusieurs boutons ?comment avoir plusieurs comportementsavec un seul Listener ?public void actionPerformed(ActionEvent e) {label.setText("Done!");}}Page 33Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

import javax.swing.*;import java.awt.event.*;// suite de la classe BipBippublic void actionPerformed(ActionEvent e) {if (e.getSource() doIt)label.setText("Done!");public class BipBip extends JFrameimplements ActionListener {JButton doIt, close;JLabel label new JLabel();public static void main(String argv[ ]) {new BipBip();}public BipBip() {add(doIt new JButton("Do It"));add(close new n(EXIT ON CLOSE);pack();setVisible(true);else if (e.getSource() close)System.exit(0);}}// fin de la classe !On peut distinguer les boutonsvia getSource()Autre solution getActionCommand()(moins sûre car elle dépend des noms)}Page 34Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Avantages et inconvénientsVersion 1 plus souple :autant de listeners que l'on veut mais peu concise :on multiplie les objets et les lignes de codeVersion 2 plus simple mais limitée :on ne peut avoir qu'une seuleméthode actionPerformed() peu adaptéesi beaucoup de commandesPage 35Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Classes imbriquéesClasses définies à l’intérieur d’une autre classe ont accès aux variables d’instancedes classes qui les contiennent(forme de capture de variables) attention : pas en C !Avantages des 2 solutions précédentes souplesse sans la lourdeur !Page 36Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Exemple : version 3import javax.swing.*;import java.awt.event.*;BipBip extends JFrame {JButton doIt, close;JLabel label new JLabel();public static void main(String argv[ ]) {new BipBip();}public BipBip() {add( doIt new JButton("Do It") );add( close new JButton("Close") );class DoItListener implements ActionListener {public void actionPerformed(ActionEvent e){label.setText("Done!");}}class CloseListener implements ActionListener {public void actionPerformed(ActionEvent e){System.exit(0);}}} // fin de la classe BibBipdoIt.addActionListener(new DoItListener( ));close.addActionListener(new CloseListener( ));setDefaultCloseOperation(EXIT ON CLOSE);pack();setVisible(true);actionPerformed() à accès à labelcar DoItListener est une classeimbriquée de BibBip}Page 37Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

SynthèsePage 38Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

RemarquesRemarques les classes imbriquées peuvent également servir à encapsulerl’implémentation le terme exact est classes internes (inner classes en Anglais) il existe aussi des classes imbriquées statiques nested classes pour structurer en sous-partiesPage 39Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Classes imbriquées anonymespublic class BipBip extends JFrame {JLabel label new JLabel();// label doit être une variable d’instance (pas une variable locale).// car elle est référencée dans une méthode d’instancepublic BipBip() {JButton doIt new JButton("Do It");add(doIt);doIt.addActionListener(new ActionListener( ) {// sous-classe anonyme de ActionListenerpublic void actionPerformed(ActionEvent e) {label.setText("Done!");}});.}Page 40 ressemblent un peuaux lambdas du C 11 qui existent aussi depuis Java 8Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Mélanger les plaisirs !abstract class MyButton extends JButton implements ActionListener {MyButton(String name) {super(name);addActionListener(this);}}public class BipBip extends JFrame {JLabel label new JLabel();.public BipBip() {add(new MyButton("Do It")) {public void actionPerformed(ActionEvent e) {label.setText("Done!");}});.Page 41Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Conflitspublic class BipBip extends JFrame {JButton close new JButton("Close");class CloseListener implements ActionListener {boolean close falsepublic void actionPerformed(ActionEvent e) {}setVisible(close);// OKsetVisible(BipBip.close);// FAUX : pas le bon « close »this.setVisible(close);// ERREUR : pas le bon « this »BipBip.this.setVisible(close);// OK}Même nom de variable dans classe imbriquante et classe imbriquéeÞ 1) à éviter !Þ 2) préfixer par le nom de la classePage 42Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Compléments sur les constructeursabstract class MyButton extends JButton implements ActionListener {public MyButton(String name, Icon icon) {super(name, icon);.}public MyButton (String name) {this(name, null);}Un constructeur peut en appeler un autre !Note : en C 11: MyButton(string name) : MyButton(name, nullptr) {} on pourrait aussi utiliser les paramètres par défaut}abstract class Toto {static {.}Constructeur de classe Pour initaliser des variables de classes Pas d'équivalent direct en C }Page 43Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Dessinimport javax.swing.*;import java.awt.event.*;import java.awt.*;public class Scribble extends JApplet {private int last x, last y;public void init( ) {setBackground(Color.white);// définir, instancier et enregistrer le ListeneraddMouseListener(new MouseAdapter ( ) {public void mousePressed(MouseEvent e) {last x e.getX( );last y e.getY( );}} );Page 44si on u4lisait MouseListeneril faudrait implémenter :public void mouseReleased (MouseEvent e) { }public void mouseClicked (MouseEvent e) { }public void mouseEntered (MouseEvent e) { }public void mouseExited(MouseEvent e) { }Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

addMouseMotionListener(new MouseMotionAdapter ( ) {public void mouseDragged(MouseEvent e) {Graphics g getGraphics( );int x e.getX( );int y e.getY( );g.drawLine(last x, last y, x, y);last x x;last y y;}} );JButton b new JButton("Clear");// bouton qui efface toutadd(b);b.addActionListener(new ActionListener ( ) {public void actionPerformed(ActionEvent e) {Graphics g getGraphics( );g.setColor(getBackground( ));g.fillRect(0, 0, getSize( ).width, getSize( ).height);}} );Page 45Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Persistance de l’affichageProblèmes de l’exemple précédent1) l’affichage du dessin n’est pas persistant effacé si on déplace une fenêtre dessus, si on iconifie. (en fait ça dépend des plateformes)2) normalement les méthodes des listeners ne doivent pas dessinerPage 46Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Modèle "damaged / repaint"Principes à suivre Les listeners sauvegardent les opérations à faire dans une « display list » notifient le toolkit qu'il faut réafficher Le toolkit appelle la methode qui réaffiche le composant graphique qui doit afficher le composant, puis le dessinPage 47Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Modèle "damaged / repaint"repaint()paintComponent()class Dessin extends JPanel {public void paintComponent(Graphics g) {super.paintComponent(g);// ne pas oublier cette ligne !// .etc.}}Page 48Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

NotesSwing vs. AWT avec AWT redéfinir la méthode paint() avec Swing, paint() appelle paintComponent() puis paintBorder() puis paintChildren()Divers Appeler revalidate() dans certains cas de changements de taille Taille des bords : getInsets() Opacité des widgets certains composants sont opaques, d’autres sont transparents setOpaque() rend le composant opaquePage 49Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

JFileChooserJFileChooser chooser new JFileChooser();FileNameExtensionFilter filter new FileNameExtensionFilter ("JPG & GIF Images", "jpg", "gif"););chooser.setFileFilter(filter);Ouvre la boîte de dialogue et bloque l’interaction (dialogue modal) :int returnVal chooser.showOpenDialog(parent);if (returnVal JFileChooser.APPROVE OPTION) {System.out.println("You chose to open this file: " chooser.getSelectedFile().getName());}Page 50Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Disposition spatialeLes LayoutManagers calculent automatiquement la disposition spatialedes enfants des ContainersA chaque conteneur est associé un LayoutManager qui dépend du type de conteneur qui peut être changé par la méthode setLayout() :conteneur.setLayout( unAutreLayoutManager )Pour faire le calcul "à la main" (à éviter sauf cas particuliers) :conteneur.setLayout(null)Page 51Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Avantages des LayoutManagersC'est plus simple pas de calculs compliqués à programmer !Configurabilité accessibilité : indépendance par rapport aux tailles des polices internationalisation : indépendance par rapport à la longueur du texte langues orientales : texte 1/3 plus petit que l'anglais français, allemand : texte 1/3 plus grand que l'anglaisAdaptativité des interfaces les composants graphiques se retaillent automatiquement quand l'utilisateur retaille les fenêtresPage 52Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Principaux LayoutManagersFlowLayout défaut des JPanel met les objets à la suite comme un "flux textuel" dans une page de gauche à droite puis à la lignePage 53Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Principaux LayoutManagersBorderLayout défaut des JFrame et JDialog retaille automatiquement les enfants du conteneur disposition de type points cardinaux via constantes: BorderLayout.CENTER, EAST, NORTH, SOUTH, WESTPage 54Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Principaux LayoutManagers (2)GridLayout divise le conteneur en cellules de même taille (grille virtuelle) de gauche à droite et de haut en bas retaille automatiquement les enfantsPage 55Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Principaux LayoutManagers (2)GridBagLayout grille contraintes spatiales les enfants n'ont pas tous la même taille spécification par des GridBagConstraintsPage 56Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Principaux LayoutManagers (3)CardLayout empile les enfants (et les met à la même taille) usage typique: pour les ongletsBoxLayout disposition verticale ou horizontale exemple :panel.setLayout(new BoxLayout(panel, BoxLayout.Y AXIS));SpringLayout contraintes entre les bords des enfantsPage 57Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Architecture SwingSwing est inspiré du modèle MVC Model : données de l'application View : représentation visuelle Controller : gestion des entréessource: enode.comPage 58Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Architecture SwingSwing est inspiré du modèle MVC Model : données de l'application View : représentation visuelle Controller : gestion des entréesBut de MVC mieux structurer les applications représentations multi-vues un modèle peut être associé à plusieurs vues la synchronisation est impliciteEn pratique V fortement lié à C plusieurs variantes de MVC !Page 59Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTechsource: enode.com

Architecture Swing (2)"Separable Model Architecture" View et Controller regroupés dans un UIComponent Model : reste séparé"Pluggable Look and Feel" chaque JComponent Swing encapsule un UIComponent les UIComponent peuvent être changés dynamiquement par le UIManagerPage 60Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Architecture Swing (3)Modèles et multi-vues (la plupart des) JComponent Swing créent implicitement un Modèle qui peut être "exporté" et partagé avec un autre JComponentExemple JSlider et JScrollbar : même modèle BoundedRangeModel mise commun du modèle synchronisation automatiquePage 61Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

ExempleDans l’API de JSlider et JScrollBar :public BoundedRangeModel getModel();public void setModel(BoundedRangeModel);Changer le modèle du slider et du scrollbar :JSlider slider new JSlider();BoundedRangeModel myModel new DefaultBoundedRangeModel( ) {public void setValue(int n) {System.out.println(“SetValue: “ scrollbar.setModel(myModel);On peut aussi ignorer l’existence des modèles :JSlider slider new JSlider();int value slider.getValue();// cohérent car dans l’API de JSlider :public int getValue() {return getModel().getValue(); }Page 62Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Pluggable Look and FeelJava Metalpublic static void main(String[ ] args) {try rmLookAndFeelClassName());} catch (Exception e) { }//Create and show the va.swing.plaf.windows.WindowsLookAndFeel”);Page 63Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Une variante de MVCsource: SunPage 64Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Graphics2DCouche graphique évoluée plus sophistiquée que GraphicsQuelques caractéristiques système de coordonnées indépendant du type de sortie (écran, imprimante) et transformations affines : translations, rotations, homothéties package java.awt.geom transparence AlphaComposite, BITMASK , OPAQUE, TRANSLUCENT . Composition Paths et Shapes Fonts et Glyphs etc. (voir démo Java2D de Sun)Page 65Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Pour en savoir plusSite pédagogique de l’UE INF224 http://www.telecom-paristech.fr/ elc/cours/inf224.htmlUEs liées à INF224 IGR201: Développement d'applications interactives 2D, 3D, Mobile et Web IGR203: Interaction Homme-MachinePage 66Programmation événementielle et interfaces graphiques - Eric Lecolinet – Telecom ParisTech

Page 2 Programmation événementielle et interfaces graphiques -Eric Lecolinet –Telecom ParisTech Toolkits graphiques Java Pour le Desktop JavaFX nouveau, inspiré du Web Swing AWT Components obsolète SWT Eclipse Foundation Swing est multi-plateformes repose surAWT Componen