La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Conception d'interfaces utilisateur en Java Cédric Dumas Jean-Daniel Fekete Ecole des Mines de Nantes contrat Creative Commons Paternité-Pas.

Présentations similaires


Présentation au sujet: "Conception d'interfaces utilisateur en Java Cédric Dumas Jean-Daniel Fekete Ecole des Mines de Nantes contrat Creative Commons Paternité-Pas."— Transcription de la présentation:

1 Conception d'interfaces utilisateur en Java Cédric Dumas Jean-Daniel Fekete Ecole des Mines de Nantes contrat Creative Commons Paternité-Pas d'Utilisation Commerciale- Partage des Conditions Initiales à l'Identique 2.0 France License

2 2 Plan du cours zArchitecture d une application graphique interactive zLa programmation AWT zLa programmation avec Java Swing

3 3 Java et les interfaces graphiques interactives zLangage conçu d'emblée avec une interface graphique interactive zAjout de mécanismes spécifiques pour les interfaces yinner classes z2 interfaces et 2 modèles graphiques en standard zBeaucoup d'exemples, de documentations et d'expérience.

4 4 Application graphique interactive : architecture zLes boîtes à outils 2D sont maintenant très stéréotypées z3 composants ysystème de fenêtrage yAPI graphique ygestion de l'arbre d'affichage et d'interaction zOrganisation sous forme d'objets

5 5 Le système de fenêtrage zAccès partagé à l'écran zSubdivision de l'écran en fenêtres zChaque fenêtre est positionné (x, y, z) et dimensionnée (largeur x hauteur) zModèle graphique d'affichage zModèle d'événements zCommunication entre les applications zGestion de ressources spécifiques

6 6 Les API graphiques zDans une fenêtre, une application dessine en utilisant des fonctions qui prennent des paramètres z2 catégories en 2D yorientée pixel yorientée "dimension réelle", ou "indépendante de la résolution" zRichesse variable suivant les plate formes

7 7 La gestion de l'arbre d'affichage zAfficher = appeler une succession de fonctions graphiques zReprésentation sous forme d'un arbre d'affichage (ou graphe directe acyclique) zOn affiche récursivement, en profondeur d'abord, tous les nœuds de l'arbre zOn modifie l'arbre pour changer l'affichage puis on réaffiche

8 8 La gestion de l'interaction zLes dispositifs d'entrée génèrent des événements (petit bloc mémoire contenant un type, un temps, une fenêtre cible et des détails suivant le type) zLa boîte à outils achemine l'événement vers un nœud cible zLe nœud gère l'événement, ce qui peut modifier l'état de l'arbre d'affichage zOn passe à l'événement suivant

9 9 Acheminement des événements zPositionnel (souris) yon regarde quel est le nœud de l'arbre le plus près de la position yOn l'envoie au plus prés, qui renvoie a son père s'il ne veut pas le gérer zNon positionnel (clavier) ysi un nœud à le "focus", on lui envoie xtraduction d'une touche en caractère(s) ou action ysinon, on cherche une cible xgestion des raccourcis clavier

10 10 Les composants graphiques interactifs zLe nœud est capable de s'afficher et de gérer les événement zOn lui ajoute une interface de communication suivant sa sémantique ybouton, label, menu, ligne de texte, etc. zOn appelle ce nœud communicant un composant ou widget ou gadget ou objet de contrôle.

11 11 Organisation sous forme d'objets zLes langages à objets permettent de représenter ces nœuds comme des objets ayant une interface zTous les nœuds héritent d'une classe de base (Component dans Java) zChaque composant particulier spécifie une interface particulière adaptée à sa sémantique

12 12 Principales différences entre les GUIs zIl existe un grand nombre de boîtes à outils graphiques interactives (Graphical User Interfaces ou GUI) zLangage / portabilité / performances / mécanismes de communications / extensibilité / rapidité de développement / robustesse zPas de "meilleur" mais des spécialisations zLire le chapitre consacré aux GUIs

13 13 Les boîtes à outils graphiques interactives de Java zJava propose deux boîtes à outils graphiques : yAWT (Abstract Window Toolkit), simple, petite et limitée ySWING, cohérente, grosse et extensible. zLes deux peuvent s'utiliser dans les applets zSWING facilite la transition à partir d'AWT.

14 14 Java AWT zInterface indépendante de la plate-forme zAPI simple (simpliste) zComposants peu nombreux zApparence pauvre zRelativement rapide zSimilaire sur toutes les plate-formes

15 15 Organisation d AWT zPackages java.awt et java.applet zClasses de composants (dérivées de Component) yComposants conteneurs yComposants « feuille » zClasses de gestionnaire dévénements zMyriade de classes utilitaires yImage, Color, Cursor, Dimension, Font, etc.

16 16 Construction d une application AWT zConstruire un arbre d objets dérivés de « Component » zAttacher des gestionnaires d événements zCe sont les gestionnaires d événements qui feront les actions et modifieront les composants

17 17 Exemple 1 AWT import java.awt.*; class hw { public static void main(String args[]) { Frame f = new Frame("Hello World"); f.add(new Label("Hello World")); f.pack(); f.setVisible(true); }

18 18 Exemple 2 AWT import java.awt.*; import java.awt.event.*; class hw2 { public static void main(String args[]) { Frame f = new Frame("Hello World"); Button b = new Button("Hello World"); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); f.add(b); f.pack(); f.setVisible(true); }

19 19 AWT: explications zCréation de l arbre de composants : yFrame + Label ou Button zDéclaration des actions: yaddEventHandler + création d une « inner class » zCalcul du placement des composants: ypack zAffichage

20 20 AWT: composants zComponent yButton yCanvas yCheckbox yChoice yContainer xPanel xScrollPane xWindow Dialog –FileDialog Frame xLabel xList xScrollbar xTextComponent TextArea TextField yMenuComponent xMenuBar xMenuItem CheckBoxMenuItem Menu –PopupMenu

21 21 Parcours des événements zPlusieurs boucles envoient des événements dans une file unique ySystem.getSystemEventQueue() zUn Thread lit la file et distribue les événements à la racine de l arbre des composants associé à la fenêtre de l événement zL événement est acheminé au composant auquel il est destiné

22 22 Gestion des actions zAssocier une action à un événement z2 types d événements yissu du système de fenêtrage (bas niveau) yissu d un composant ou dun sous-système Java (haut niveau) z2 niveaux de gestion ydérivation des composants yassociation de gestionnaires dactions

23 23 Les événements zPackage java.awt.event.* zHéritent de la classe java.awt.AWTEvent yidentificateur (numéro unique) yconsumed (a-t-il été utilisé?) ysource (qui l'a émis) zEnvoyés dans une file unique yToolkit.getSystemEventQueue() zLus par un thread spécique

24 24 Types dévénements

25 25 Dérivation d un composant (obsolète) zRedéfinition de la méthode processEvent(AWTEvent e) zTest de la classe de l événement y if (e instanceof FocusEvent) processFocusEvent((FocusEvent)e); else super.processFocusEvent(e); zNe pas oublier d appeler super sinon, rien ne marche plus.

26 26 Association de gestionnaires d actions zPour chaque famille d événements, une interface « listener » est définie yMouseListener, MouseMoveListener, KeyListener, etc. zChaque classe composant définit « add Listener( Listener ) Frame Button ActionListener actionPerformed( ActionEvent e) addActionListener( ActionListener)

27 27 Les listeners zChaque composant peut renvoyer certains événements à l'application si elle le demande zLe renvoi se fait par un Listener zactionListener, AdjustmentListener, FocusListener, InputMethodListener, ItemListener, KeyListener, MouseListener, MouseMotionListener, TextListener, WindowListener

28 28 Exemple public class MyClass implements MouseListener {... someObject.addMouseListener(this);... public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseClicked(MouseEvent e) {...//Event handler implementation goes here... } }

29 29 Les adaptateurs zLes Adapters sont des classes concrètes qui facilitent l'utilisation des Inner Classes zPour chaque Listener ayant plusieurs méthodes, un Adapter est défini zIl implémente toutes les méthodes en ne faisant rien zSeules les méthodes faisant quelque chose doivent être implémentés par des inner classes

30 30 Exemple adapté public class MyClass extends MouseAdapter {... someObject.addMouseListener(this);... public void mouseClicked(MouseEvent e) { //Event handler implementation goes here... }

31 31 Rappel sur les "inner classes" zExistent depuis Java 1.1 z3 versions yclasse définie dans l'espace de nommage d'une autre classe yclasse définie dans le contexte d'une autre classe yclasse anonyme définie au fil du code dans le contexte courant

32 32 Syntaxe des inner classes zclass a { static class B { … } …} zclass a { class B { … } …} zclass a { type method(args) { … Thread t = new Thread() { void run() { … } }; …} }

33 33 Définition d un Listener z4 méthodes yDéfinition dune classe qui implémente linterface ActionListener yDéfinition de linterface ActionListener dans la classe qui gère laction yUtilisation des « inner classes », définition à la volée du code yUtilisation d un classe « Adapter » pour ne pas avoir à définir toutes les méthodes

34 34 Inner classes public class MyClass extends Applet {... someObject.addMouseListener(new MyAdapter());... class MyAdapter extends MouseAdapter { public void mouseClicked(MouseEvent e) {...//Event handler implementation goes here... } }

35 35 Anonymous Inner classes public class MyClass extends Applet {... someObject.addMouseListener( new MouseAdapter() { public void mouseClicked(MouseEvent e) { //Event handler implementation goes here... } } );... }

36 36 Calcul du placement zLe placement est calculé dans les conteneurs zSoit les composants sont placés explicitement (x, y, largeur, hauteur) zSoit ils sont gérés par un « LayoutManager » qui calcul ces paramètres dynamiquement ybesoins du composant (taille min, max, normale) + positionnement relatif

37 37 Mise en place d un gestionnaire de placement zLes conteneurs définissent la méthode setLayout(layoutManager) pour changer le gestionnaire par défaut zLe gestionnaire par défaut change d une classe de conteneur à une autre zLa méthode pack() déclenche le calcul du placement zLa méthode invalidate() rend le placement courant invalide

38 38 Les gestionnaires de placement... zFlowLayout yPlace les composants de gauche à droite zCardLayout ySuperpose les composants z GridLayout yDécoupe en une grille régulière sur laquelle les composants sont placés z GridBagLayout yDécoupe en une grille et place les composants sur une ou plusieurs cases

39 39...ou Layout Manager zBorderLayout yDécoupe en 5 régions: south, north, east, west, center zAucun :.setBounds(x,y,h,l);

40 40 Affichage dans AWT zDeux cas de figure: ycomposant primitif, l affichage est laissé au « peer » ycomposant redéfini, l affichage est géré par xupdate et paint zEn principe, seul le Canvas est censé être dérivé pour modifier son affichage zL affichage se fait sur une surface graphique, le « Graphics »

41 41 Graphics zJava définit deux interfaces pour le graphique passif: Graphics et Graphics2D zGraphics implémente un modèle graphique très simple et orienté pixel zGraphics2D implémente un modèle graphique sophistiqué indépendant de la résolution zOn peut aussi créer une image et créer un graphique pour dessiner dessus

42 42 Capacités d un Graphics zLes attributs sont: yColor, PaintMode, Font, clip, origin, taille zLes primitives graphiques sont: yline, rect, roundRect, oval, arc, polyline, polygon, string, image zOn peut tracer le contour ou remplir les rect, roundRect, oval, arc et polygones zOn ne peut pas changer l épaisseur des traits ou faire des pointillés par exemple.

43 43 Récupération dun Graphics zPas de composant ZonedeDessin zrafraichissement : public static void main(...) { […} JPanel pa = new JPanel(); Graphics g = pa.getGraphics(); g.drawOval(10,10,50,50); // centre supérieur gche }

44 44 Dessiner à tous les coups Public class MonPanel extends JPanel { public void PaintComponent(Graphics g) { super.paintComponent(g); g.drawOval(10,10,50,50); }

45 45 Les couleurs zModèle simple: 3 composants rouge, vert et bleu zModèle complexe : ColorSpace, Color et ColorModel yColorSpace est un espace de couleur (RGB, CIEXYZ, etc) yColor représente une couleur dans un espace de couleur yColorModel spécifie comment une image code la couleur

46 46 Les Images zImage: tableau de pixels zpeut être ychargé du WEB ou d un fichier ycréé pour accélérer laffichage ycréé pour éviter des clignottements ycréé pour dessiner dedans zPlusieurs niveaux d API zIci, le plus simple.

47 47 Création d une image zDans Component: yImage img = createImage(largeur, hauteur) zPour dessiner dedans, créer un Graphics : yGraphics g = img.createGraphics(); yg.setBackground(getBackground()); zOn peut ensuite dessiner dans g zOn peut dessiner limage sur le graphics courant.

48 48 Chargement d une image zjava.awt.Toolkit.getImage(String file); zjava.awt.Toolkit.getImage(URL url); zcreateImage fait la même chose mais ne partage pas les images zAttention, dans une applet, getImage ne marche que sur le répertoire de l URL de l applet

49 49 Affichage d une image zGraphics.drawImage(Image img, int x, int y, ImageObserver o); zPlusieurs autres version qui retaillent l image zjava.awt.image.ImageObserver interface yboolean imageUpdate(Image i, int info, int x, int y, int w, int h) yappelé lors d un chargement incrémental d image

50 50 Les polices de caractères zJava utilise des caractères Unicode (16 bits) zLes polices traduisent des suites de caractères en suite de glyphes affichables zUne police a un nom, un style et une taille ynoms systèmes: Dialog, DialogInput, Monospaced, Serif, SansSerif, Symbol yStyles: PLAIN, BOLD, ITALIC zLa famille est gérée en interne

51 51 Les métriques de polices zAscenthauteur / ligne de base zLeadingavance / début à gauche zcharWidthlargeur d un caractère zcharsWidthlargeur de plusieurs caractères

52 52 Exemple de composant spécifique dans AWT zUn composant Canvas affiche une liste de dessins zOn dérive le Canvas pour ajouter une liste daffichage zOn définit une interface simple pour les objets de la liste d affichage zOn modifie paint pour afficher la liste

53 53 Imprimer zLa classe qui imprime dérive de Graphics et doit être passée à la méthode « printAll(Graphics g) » de la racine des composants à imprimer zPour obtenir le Graphics, il faut un java.awt.PrintJob yclass PrintJob { PrintJob(); void end(); Graphics getGraphics(); … }

54 54 Imprimer (2) zPour obtenir un PrintJob, utiliser un dialogue d impression yjava.awt.Toolkit.getPrintJob(Frame f, String jobtitle, JobAttributes jobAttributes, z PageAttributes pageAttributes) zOn peut tester dans la méthode « paint » si on affiche à l écran ou si on imprime: yif (g instanceof PrintGraphics) …

55 55 Imprimer (3) PrintJob pjob = getToolkit().getPrintJob(frame, "Printing Test", null, null); if (pjob != null) { Graphics pg = pjob.getGraphics(); if (pg != null) { root.printAll(pg); pg.dispose(); // flush page } pjob.end();

56 56 AWT et les applets zLes applets sont téléchargées à partir de pages WEB z If you were using a Java-enabled browser such as HotJava, you would see dancing text instead of this paragraph. zLe classe NervousText doit dériver de Applet dans java.Applet

57 57 Les Applets zApplet dérive de Panel zDéfinit les méthodes suivantes: yvoid init() appelé une fois au chargement yvoid start() appelé quand la page saffiche yvoid stop() appelé quand la page disparaît yString getParameter(String) récupère un argument passé en paramètre

58 58 Surprises avec les Applets zDes mécanismes de sécurité sont activés zLe focus nest pas implicitement sur lapplet, elle ne reçoit pas les touches du clavier par défaut zIl faut que la taille de la fenêtre soit fixe zLapparence varie d une machine à lautre (les fonts disponibles par exemple).

59 59 Organisation graphique d'une interface zConnaître les utilisateurs zConcevoir avec eux l'interface zSe rattacher à des choses connues ycode de couleurs, organisation spatiale, vocabulaire, etc. zTester les interfaces

60 60 Comment connaître les utilisateurs ? zPas d'introspection: vous n'êtes pas un utilisateur type! yModèle mental de l'utilisateur vs. Modèle d'implémentation zConception participative zUse cases zAnalyse des tâches : que fait-il et comment le fait-il ?

61 61 Faire participer les utilisateurs zDessin d'interfaces sur papier zPrototypage rapide et scénarios d'utilisation zCycle de développement en spirale

62 62 Hiérarchisation de l'information zOrganiser les écrans de manière hiérarchique zUtiliser un vocabulaire simple zBien délimiter les zones yregrouper les objets similaires ydétacher les objets différents zFaire appel à des graphistes

63 63 Utilisation des couleurs zConcevoir avec des niveaux de gris puis passer à la couleur y10% de daltoniens ou autres trouble de la perception zUtiliser peu de couleurs zUtiliser des teintes pastels et des couleurs complémentaires

64 64 Utilisation des polices de caractères zPrendre des polices réglées pour les écrans et non traditionnelles à l'impression zPas d'italique ou de penché mais plutôt du gras zUtiliser des couleurs contrastées fond / lettre zFaire attention à la taille

65 65 Animations, images et sons zAttention à ne pas divertir l'attention zL'œil est très sensible aux animations: yil est attiré par ce qui bouge yil ne peut pas contrôler cette attirance ypeut provoquer de la fatigue et des maux de tête zImage très colorées perturbantes zSons à éviter, sauf pour les erreurs graves yredondance pour les erreurs

66 66 Java SWING zSWING implémente tous les composants en Java zSWING offre plusieurs mécanismes originaux, pratiques et puissants zSWING peut se programmer à plusieurs niveaux zSWING est très gros et souvent lent.

67 67 Programmation avec Java SWING zGénéralités sur Java SWING zSWING et AWT zConcepts de SWING zUne application Java SWING pas à pas yTPs zLes composants standards de SWING zCréer ses propres composants

68 68 SWING et AWT zSWING cohabite avec AWT et utilise le minimum de ses services zTous les composants sont redéfinis zAWT n est pas régulier ypas de canvas dans un menu zSWING est totalement régulier ytout conteneur peut afficher tout objet graphique

69 69 Concepts de SWING zSéparation du composant et de son apparence yplusieurs apparences existent: Windows, Unix, Mac et « Metal » yL apparence par défaut dépend de la plate forme zSéparation du composant et de son modèle zSéparation du composant et de son modèle de sélection

70 70 Concepts de SWING zBasé sur des containers zgénérique zgère collection de composants zdesign Pattern composite

71 71 Programmation SWING zPackage javax.swing zRelativement proche de AWT pour faciliter la migration, ajout « J » avant le nom des classes:

72 72 Exemple import java.awt.*; import javax.swing.*; class hwSwing { public static void main(String args[]) { JFrame f = new JFrame("Hello World"); Jlabel texte = new JLabel("Hello World"); f.getContentPane().add(texte); f.pack(); f.setVisible(true); }

73 73 Autre approche import java.awt.*; import javax.swing.*; public class Test { public static void main(String args[]) { Simple f = new Simple(); f.pack(); f.setVisible(true); } public class Simple extends JFrame { Jlabel texte = new JLabel("Hello World"); public Simple() { getContentPane().add(texte); } }

74 74 Mon premier Composant zJFrame yfenêtre principale zJDialog yfenêtre de dialogue (modale) zJwindow show() hide() ou dispose() toFront() ou toBack() setTitle(titre !) setSize(int, int)et setResizable(false)

75 75 Les autres composants

76 76 Jlabel zJavax.swing.Jlabel zdescriptif : texte statique + image zexemple : devant un champ de saisie Jlabel jl = new Jlavel(Label 1); ou jl.setText(Label 1); // ->.getText() jl.setIcon(new ImageIcon(java.gif)); jl.setVerticalTextPosition(SwingConstants.BOTTOM) jl.setHorizontalTextPosition(SwingConstants.CENTER);

77 77 JTextField zJavax.swing.JTextField zsaisie de texte (non typé) JTextField jt = new JTextField(Thomas); String nom = new String(Thomas); jt.setText(nom); jt.setColumns(nom.length()); jt.copy(); jt.cut(); jt.paste();

78 78 JButton zBouton simple à états JButton jb= new Jbutton(OK,new ImageIcon(boc.gif)); jb.setRolloverIcon(new ImageIcon(cob.gif)); jb.setPressedIcon(new ImageIcon(ocb.gif)); jb.setDisabledIcon(new ImageIcon(obc.gif)); jb.setMnemonic(o); // ALT + o jb.setBorderPainted(false); jb.setFocusPainted(false); jb.doClick();

79 79 JmachinButton zJToggleButton ydeux états (setIcon et setSelectedIcon) zJCheckBox ycases à cocher zJRadioButton ydans un groupe de bouttons radio ypenser à regarder Abstract Button

80 80 Exemple de Radio ButtonGroup grp = new ButtonGroup(); JRadioButton r1 = new JRadioButton(it1); JRadioButton r2 = new JRadioButton(it2); r2.setSelected(true); grp.add(r1); grp.add(r2);

81 81 Le modèle de bouton poussoir zModèle utilisé pour les CheckBox, RadioButton et Button zPlusieurs niveaux d utilisation ygère l état du bouton, au repos, sous le pointeur, appuyé et relâché. yGère la notification vers les listeners yGère l envoie d un événement « action »

82 82 Le modèle de bouton poussoir (2) public interface ButtonModel extends ItemSelectable { attribute boolean armed; attribute boolean selected; attribute boolean enabled; attribute boolean pressed; attribute boolean rollover; attribute int mnemonic; attribute String actionCommand; attribute ButtonGroup group; listener ActionListener; listener ItemListener; listener ChangeListener; }

83 83 JComboBox zListe déroulante (ouverte ou fermée) zvector ou tableau dobjets passés en paramètres JComboBox cb = new JComboBox( items); cb.setMaximumRowCount(4); cb.setEditable(true); // JTextField

84 84 JMenu zUne instance de JMenuBar par Jframe setJMenuBar(JMenuBar mb); zPlusieurs Jmenu par JMenuBar add(JMenu jm); zPlusieurs JMenuItem/JCheckboxMenu par Jmenu add(JMenuItem mi); addSeparator(); zStructurez !!!

85 85 JPanel zJpanel yconteneur zJScrollPane yun seul composant ! ybarres de défilement JScrollPane sp = new JScrollPane(); sp.add(monJLabel); sp.setViewportView (monJLabel); ycomposants implémentant Scrollable class MonLabel extends Jlabel implements Scrollable Panel ScrollPane

86 86 Les composants de SWING DialogFrameSplit paneTabbed Pane Tool bar Internal frame Layered pane

87 87 Composants de Swing File chooser Color chooser Table TextTree List Slider Progress bar Tool tip

88 88 Capacités communes des composants z(dés)activation isEnabled()setEnabled(…) z(in)visible setVisible(…)isVisible() ymodule le coût de linstanciation dun container ! ztailles réelle et souhaitable Dimension getSize() ou Dimension getSize(Dimension r) setSize(…) Dimension getPreferredSize() ; setPreferredSize(Dimension r);

89 89 Factory zBordures Border mbd= new Border( BorderFactory.createEtchedBorder() BorderFactory.createLoweredBevelBorder() BorderFactory.createTitledBorder(Titre !) etc… ); monJbutton.setBorder(mbd); zCurseur Cursor nc = new Cursor(Cursor.CROSSHAIR_CURSOR); monJbutton.setCursor(nc);

90 90 Couleurs znew Color (r,g,b) znew Color (r,g,b,a) z0 -> 255 za=255 opaque monJbutton.setBackground(Color.white); //constantes monJbutton.setForeground(Color.black); monJbutton.setOpaque(true);

91 91 Quelques difficultés à retenir zConteneurs de fenêtre : ne pas ajouter directement avec "add" mais ajouter avec "getContentPane()" zPas de multi-threading, sauf autorisation explicite dans la documentation

92 92 Pourquoi getContentPane ? zLes containers Swing ont un JRootPane monContainer.getContentPane().add(...) composants « lourds » : JDialog, JFrame, JWindow Root pane

93 93 La classe JComponent zTool tip zBords zActions associées aux touches zPropriétés zAccès aux handicapés zDouble buffer

94 94 Comment être multi ? zPlusieurs vues : DessinListener listDessin = new DessinListener(); CoordListener listCoord = new CoordListener(); maZoneDessin.addMouseMotionListener(listDessin); maZoneDessin.addMouseMotionListener(listCoord); Coordonnées : 83 28

95 95 Le modèle de liste zUtilisé pour les listes public interface ListModel { int getSize(); Object getElementAt(int index); Listener ListDataListener; } zFacilite l affichage d un conteneur par une liste zCellRenderer pour changer l apparence des items

96 96 Création d une liste String[] data = {« un », « deux »}; Jlist l = new JList(data); zJList peut être créé avec un modèle ou un tableau (le modèle est créé implicitement) zOn peut lui changer son CellRenderer zOn peut lui changer son SelectionModel yun ou plusieurs séléctionnés yplusieurs contigus ou non yle contrôle peut être plus fin

97 97 Le modèle de boîte combiné (combo box) zComme List plus un item sélectionné zLe modèle de sélection est « un seul » zPeut être modifiable ou non (ajout implicite d un item saisi au clavier dans la liste)

98 98 Le modèle d'intervalle borné zBoundedRangeModel zUtilisé par les sliders, scrollbar et les progress bars zMinimun <= value <= value+extent <= Maximum zJScrollBar j = new JScrollBar(myBRModel);

99 99 Le modèle d'arbre JTree zTreeModel yObject getRoot(), Object getChild(Object parent, int index), int getChildCount(Object parent), boolean isLeaf(Object node), valueForPathChanged(TreePath p, Object newValue), int getIndexOfChild(Object parent, Object child), TreeModelListener zPour déplacer, ajouter ou retirer une colonne dans une table

100 100 Le modèle de table JTable JTable(Object[][] rowData, Object[] columnNames) JTable(Vector rowData, Vector columnNames) new AbstractTableModel() { public String getColumnName(int col) { return columnNames[col].toString(); } public int getRowCount() { return rowData.length; } public int getColumnCount() { return columnNames.length; } public Object getValueAt(int row, int col) { return rowData[row][col]; } public boolean isCellEditable(int row, int col) { return true; } public void setValueAt(Object value, int row, int col) { rowData[row][col] = value; fireTableCellUpdated(row, col); }

101 101 La gestion du texte zGestion simple et configurable zNiveau de configuration très poussé yTexte simple, Texte HTML, Texte XML? zInterface « Document » pour gérer l intérieur d un texte zPlusieurs Viewers pour les différentes classes de documents

102 102 Les composants spécifiques SWING zDériver de JComponent zpaint appelle paintComponent, paintBorder et paintChildren zOn peut changer lun des trois ou paint directement zSimilaire à AWT zOn peut utiliser Java2D

103 103 Capacités d un Graphics2D (Java2D) zDérive dun Graphics zAjoute les attributs suivants: ycomposite, paint, stroke, RenderingHints, transform zLes primitives obéissent à la transformation affine installée zLes « stroke » et « paint » définissent les attributs d affichage des remplissages et des traits.

104 104 Les objets géométriques de Java2D zPackage java.awt.geom.* zDéfinit les objets de gestion de la géométrie et leurs interfaces

105 105 Les transformations affines zSpécifie à la fois l échelle en X et Y, la rotation, la translation et des déformations affines zLes transformations se composent zUne transformation courante est appliquée aux primitives graphiques

106 106 Les formes zLigne, rectangle, arcs, ellipse, polygone, etc. zCourbes quadratiques et cubiques zArea

107 107 Les courbes cubiques zCourbes de Bézier zRelativement facile à contrôler

108 108 Les "area" zPermet de calculer avec des Shapes: yintersection yajout, soustraction, différence symétrique zLent mais puissant

109 109 La notion de "Path" zForme définie par son contour ypoint de départ ysuite de lignes ou courbes ylevé du crayon yfermeture zOn peut remplir ou tracer le Path zOn peut itérer le long du Path ysuite de segments typés connus

110 110 Les traits zNombreux attributs: yépaisseur, style de fin (end cap), style de join (join style), pointillé zBasicStroke : transformer un trait en son contour (pour lui appliquer un remplissage)

111 111 Les remplissages zCouleur pleine zComposition avec mélange (translucide) zTexture zGradient zPochoir

112 112 Imprimer avec Java2D public void actionPerformed(ActionEvent e) { if (e.getSource() instanceof JButton) { PrinterJob printJob = PrinterJob.getPrinterJob(); printJob.setPrintable(this); if (printJob.printDialog()) { try { printJob.print(); } catch (Exception ex) { ex.printStackTrace(); }

113 113 Conclusion et perspectives zJava facilite la construction dapplications graphiques interactives zLes APIs sont bien conçues zPlusieurs niveaux de complexité zProblèmes yperformances parfois ycomplexité parfois

114 114 Bibliographie zDesigning the User Interface; Ben Shneiderman, Addison-Wesley 1997; ISBN zDeveloping User Interfaces, Dan R. Olsen, Morgan Kaufmann, 1998; ISBN zThe Java Class Libraries : Java.Applet, Java.Awt, Java.Beans (Vol 2) P. Chan, R. Lee Addison-Wesley, 1997; ISBN The JFC Swing Tutorial: A Guide to Constructing GUIs K. Walrath, M. Campione; Addison-Wesley, 1999; ISBN zSystèmes d'information et Interaction Homme-Machine, Ed. C. Kolski, 2000; Hermes. zThe Java Tutorial

115 115 Bibliographie zjava.sun.com ytutorials yreferences zhttp://manning.spindoczine.com/sbe/


Télécharger ppt "Conception d'interfaces utilisateur en Java Cédric Dumas Jean-Daniel Fekete Ecole des Mines de Nantes contrat Creative Commons Paternité-Pas."

Présentations similaires


Annonces Google