Introduction aux composants JTable, JTree et JGraph

17 016 vues

Publié le

Publié dans : Technologie, Formation
0 commentaire
4 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
17 016
Sur SlideShare
0
Issues des intégrations
0
Intégrations
3 236
Actions
Partages
0
Téléchargements
630
Commentaires
0
J’aime
4
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Introduction aux composants JTable, JTree et JGraph

  1. 1. Java pour le développement de clients lourds Visualisation d’informations : JTree, JTable et JGraph Mickaël BARON - 2006 (Révision Août 2010) mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr
  2. 2. Licence Creative Commons Contrat Paternité Partage des Conditions Initiales à lIdentique 2.0 Francekeulkeul.blogspot.com http://creativecommons.org/licenses/by-sa/2.0/fr Java Visu - M. Baron - Page 2
  3. 3. Visualisation d’informations : objets graphiques adaptés Cette partie s’intéresse à présenter des composants en Java permettant la visualisation et la manipulation d’informations de grande quantité Les informations peuvent être présentées sous forme de tableau, d’arbre ou de graphe L’API Java Swing propose nativement deux composants complexes pour la visualisation d’informations Tableau avec JTablekeulkeul.blogspot.com Arbre avec JTree La représentation sous forme de graphe n’est pas encore proposée par Sun et nous utiliserons la bibliothèque Graphe avec JGraph Java Visu - M. Baron - Page 3
  4. 4. Visualisation d’informations : objets graphiques adaptés Composant JTable Composant JGraph Composant JTreekeulkeul.blogspot.com Java Visu - M. Baron - Page 4
  5. 5. Visualisation d’informations : objets graphiques adaptés L’objectif principale de cette partie est de vous montrer comment paramétrer ces composants Modification du rendu des informations Modification du rendu d’édition Ajout et suppression dynamique d’éléments Manipulation des modèles (contenu et de sélection) Technique de prévisualisation et zoom Nous présenterons dans Impression et génération d’images cette partie les choses à faire et à ne pas fairekeulkeul.blogspot.com Ressources JTree : java.sun.com/docs/books/tutorial/uiswing/components/tree.hml JTable : java.sun.com/docs/books/tutorial/uiswing/components/table.html JGraph : www.jgraph.com Java Visu - M. Baron - Page 5
  6. 6. Visualisation d’informations : objets graphiques adaptés Les composants complexes et d’autres composants respectent le modèle d’architecture MVC (Model View Controller) L’implémentation proposée par Java/Swing se rapproche plus du Document/Vue ou Model/View (le contrôleur étant associé à la vue) Principe de l’architecture Le modèle est l’élément principale du composant La ou les vue(s) du composant sont abonnées au modèle La modèle notifie ses vues suite à des modifications La partie Documentkeulkeul.blogspot.com La partie Modèle V (Notification des vues (En Java le vue et le après modification) contrôleur ne sont pas M dissociés) C Java Visu - M. Baron - Page 6
  7. 7. JTable : présentation générale Avec le composant JTable vous pouvez afficher les données sous forme de table et éditer les données à partir des cellules Les cellules sont éditables Les données par colonne On peut ajouter des composants sont typées et formatées autre que des JLabel Un composant JTable doit être ajouté à un container JScollPane et non à un simple JPanelkeulkeul.blogspot.com JTable myTable = new JTable(...); Affiche la JTable JScrollPane myScrollPane = new JScrollPane(myTable); avec des JScrollPane myScrollPane = new JScrollPane(); ascenseurs si myScrollPane.add(myTable); besoin La JTable n’est pas visible Java Visu - M. Baron - Page 7
  8. 8. JTable : création du modèle Le modèle JTable doit implémenter l’interface TableModel Modèle Vue TableModel JTable Deux implémentations existent pour faciliter l’utilisation du modèle TableModel (méthodes supplémentaires) La classe abstraite AbstractTableModel La classe DefaultTableModel Le fonctionnement du modèle dépend de l’implémentation Méthode abstraites dans la des méthodes (ou redéfinition) classe AbstractTableModelkeulkeul.blogspot.com int getRowCount() : retourne le nombre de ligne int getColumnCount() : retourne le nom de colonne Object getValueAt(int row, int column) : retourne l’objet pour la cellule setValueAt(Object, int row, int co) : nouvelle valeurVisu -la cellulePage Java de M. Baron - 8
  9. 9. JTable : création du modèle Le fonctionnement du modèle dépend de l’implémentation des méthodes (suite) Class getColumnClass(int cc) : type de la colonne boolean isCellEditable(int r, int l) : indique si la cellule est modifiable String getColumnName(int coIn) : nom de la colonne pour coIn addTableModelListener(TableModelListener) : ajoute un écouteur qui est notifié à chaque fois que le modèle est modifié Des méthodes (issues des sous-classes de TableModel) n’ont pas à être redéfinies et peuvent être utilisées fireTableDataChanged() : notifie toutes les vues de modificationskeulkeul.blogspot.com fireTableRowsUpdated(int fr, int lr) : notifie entre les lignes fr et lr L’interface TableModelListener contient une méthode tableChanged(TableModelEvent e) : appelée à la suite de chaque modification du modèle Java Visu - M. Baron - Page 9
  10. 10. JTable : création du modèle Exemple : une première JTable et son modèle public class MyTableModel extends AbstractTableModel { private String[] columnNames = ... private Object[][] data = ... public int getColumnCount() {return columnNames.length;} public int getRowCount() {return data.length;} public String getColumnName(int col) {return columnNames[col];} public Object getValueAt(int row, int col) {return data[row][col];} public Class getColumnClass(int c) {return getValueAt(0,c).getClass();} public boolean isCellEditable(int row, int col) {return (col < 2);} public void setValueAt(Object value, int row, int col) { data[row][col] = value; fireTableCellUpdated(row,col) Notification explicite } des modifications }ublic class MyTableDemo implements TableModelListener { p aux vues public MyTableDemo() { JTable myTable = new JTable(new MyTableModel());keulkeul.blogspot.com myTable.getModel().addTableModelListener(); ... } Préférez ce mode de public void tableChanged(TableModelEvent e) { construction d’une System.out.println("Coucou"); JTable avec un modèle } explicite } Optimisation des notifications en choisissant le bon fire Java Visu - M. Baron - Page 10
  11. 11. JTable : Editors et Renderers Une JTable (JTree et JGraph fonctionnent un principe commun) dispose de classes spécifiques pour effectuer un rendu des cellules appelée classe Renderer une édition des données des cellules appelée classe Editor Un objet Editor est appelé quand l’utilisateur effectue une action sur la cellule (sous condition que la cellule soit éditable) Un objet Renderer est une vue sans réaction directe qui retourne une visualisation de la données de la cellule L’objet Renderer utilisé pour cettekeulkeul.blogspot.com cellule affiche un JLabel L’objet Editor associé à cette colonne affiche un JComboBox pour l’édition d’une chaîne de caractères Java Visu - M. Baron - Page 11
  12. 12. JTable : Editors et Renderers Principe d’appel des objets Editor et Renderer Utilisateur déplace la fenêtre et sélectionne les cellules 1 Les renderers affiche les données du modèle getValueAt(…) Utilisateur clique sur L’objet Editor est appelé. La une cellule éditable valeur courante de la cellule est 2 retournée à l’objet Editor Utilisateur termine l’édition L’objet Editor retourne la nouvelle valeur qui est retournée au 3 modèlekeulkeul.blogspot.com setValueAt(…) Java Visu - M. Baron - Page 12
  13. 13. JTable : Editors et Renderers Il existe par défaut des objets Editor et Renderer définis dans la JTable Rappelons que getColumnClass() retourne le type de l’objet de la cellule Selon le type de données se trouvant dans le modèle (indi- qué par getColumnClass()) les objets Editor et Renderer retournent des composants prédéfinis Composant retourné par l’objet Renderer Boolean : JCheckBox Number, Double et Float : JLabel aligné à droitekeulkeul.blogspot.com ImageIcon : JLabel aligné au centre Composant retourné par l’objet Editor Boolean : JCheckBox Autre : JTextField Java Visu - M. Baron - Page 13
  14. 14. JTable : Editors et Renderers Possibilité de modifier les objets Renderer et Editor de manière à paramétrer la visualisation et l’édition La JTable propose plusieurs manières de modifier ces objets Un Renderer et/ou Editor par type d’objet (Class) Un Renderer et/ou Editor par colonne Si vous souhaitez associer un Renderer et un Editor pour toutes les colonnes qui ont le même type utiliser la première solution Si vous souhaitez effectuer un Renderer et un Editor ponctu- elle pour une colonne utilisez la seconde solutionkeulkeul.blogspot.com Quelle que soit la solution les Renderer/Editor sont les mêmes. Seuls la liaison entre les Renderer/Editor et la JTable change Nous présenterons les deux solutions … Java Visu - M. Baron - Page 14
  15. 15. JTable : Editors et Renderers Première solution : un Renderer/Editor par type d’objet setDefaultRenderer(Class, TableCellRenderer) : associe un Renderer au type défini par le paramètre Class setDefaultEditor(Class, TableCellEditor) : associe un Editor à un type Toutes les colonnes dont le type est associé à un Renderer/Editor a une visualisation et/ou édition personnalisée Deuxième solution : un Renderer/Editor par colonne Extraire le modèle de colonne TableColumnModel getcolumnModel() A partir du TablecolumnModel choisir la colonne qui vous intéresse à paramétrer : TableColumn getColumn(int) Modifier le Renderer/Editorkeulkeul.blogspot.com setCellEditor(TableCellEditor) : associe l’Editor à la colonne setCellRenderer(TableCellRenderer) : lie le Renderer à la colonne Si vous mixez les deux solutions c’est le Renderer/Editor par la colonne qui prend le dessus Java Visu - M. Baron - Page 15
  16. 16. JTable : Editors et Renderers Exemple : associer les Renderer/Editor à une JTable Modification des Editors pour les colonne dont la classe est de type Integer et public class JTableDirectRenderer1 extends JFrame { public MyTableDemo() { Boolean ... JTable myTable = new JTable(new MyDefaultTableModel()); myTable.setDefaultEditor(Integer.class, new MyAbstractCellEditor()); myTable.setDefaultEditor(Boolean.class, new MyAbstractCellEditorBoolean()); myTable.setDefaultRenderer(Boolean.class, new MyAbstractCellRenderer()); TableColumnModel myColumnModel = myTable.getColumnModel(); TableColumn myTableColumn = myColumnModel.getColumn(0); Modification du Renderer pur la myTableColumn.setCellEditor(new MySecondAbstractCellEditor()); colonne Booleankeulkeul.blogspot.com myTableColumn.setCellRenderer(new TableCellRenderer() { public Component getTableCellRendererComponent(JTable, ...) { return new JButton((String)arg1); } }); } Modification des Renderer/Editor } pour la colonne 0 Java Visu - M. Baron - Page 16
  17. 17. JTable : Renderers Un Renderer doit implémenter l’interface TableCellRenderer Cette interface possède une méthode unique qui retourne le composant à afficher dans la cellule Component getTableCellRendererComponent(JTable table, Object v, boolean isSelected, boolean hasFocus, int row, int column) JTable table : référence de la JTable associé au Renderer Object v : valeur à afficher du modèle obtenue par getValueAt(…) boolean isSelected : la cellule est-elle sélectionnée ? boolean hasFocus : la cellule a-t-elle le focus ? int row : numéro de ligne de la cellule considéréekeulkeul.blogspot.com int column : numéro de colonne de la cellule considérée Il faut donc retourner un objet graphique Component qui sera utilisé pour effectuer le rendu de la cellule Le composant de retour n’a pas de « réaction » il est utilisé pour effectuer un rendu = image Java Visu - M. Baron - Page 17
  18. 18. JTable : Renderers Exemple : un Renderer personnalisé pour les types Boolean Le composant chargé du rendu est construit à la construction de la classe public class MyAbstractCellRenderer implements TableCellRenderer { private JToggleButton vraie = new JToggleButton(); public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4, int arg5) { Boolean myBool = (Boolean )arg1; vraie.setSelected(myBool.booleanValue()); return vraie; Récupère la valeur qui doit être } Modifie la valeur du composant et le affichée (getValueAt(…) du } retourne au Renderer pour affichage modèle) Le Rendererkeulkeul.blogspot.com initial Le composant JCheckBox a été remplacé par un JToogleButton Java Visu - M. Baron - Page 18
  19. 19. JTable : Editors Un Editor doit implémenter l’interface TableCellEditor qui hérite également de l’interface CellEditor utilisée par tous les objets ayant un Editor : JTree, JTable, JListBox, … Cette interface possède entre autre une méthode qui retourne le composant à afficher pour l’édition Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) JTable table : référence de la JTable associé à l’Editor Object value : valeur de la cellule (pas uniquement un String) boolean isSelected : la cellule est-elle sélectionnéekeulkeul.blogspot.com int row : numéro de ligne de la cellule int column : numéro de la colonne Pour éviter d’implémenter toutes les méthodes de l’interface CellEditor vous pouvez utiliser la classe AbstractCellEditor 19 Java Visu - M. Baron - Page
  20. 20. JTable : Editors Si la classe AbstractCellEditor est utilisée en place de CellEditor certaines méthodes ont un comportement prédéfini stopCellEditing() : déclenche l’arrêt de l’Editor cancelCellEditing() : déclenche l’annulation de l’Editor addCellEditorListener(CellEditorListener) : ajoute un écouteur d’édition … Cependant vous devrez fournir obligatoirement une implémentation de la méthode Object getCellEditorValue() : la valeur que l’utilisateur vient de saisir (méthode setValueAt(…) du modèle est alors appelée)keulkeul.blogspot.com Principe de codage Implémentez getTableCellEditorComponent(…) pour retourner le composant d’édition La validation du composant d’édition doit appeler stopCellEditing() Implémentez getCellEditorValue() Java Visu - M. Baron - Page 20
  21. 21. JTable : Editors Exemple : un Editor personnalisé pour les types Boolean public class MyAbstractCellEditorBoolean extends AbstractCellEditor implements TableCellEditor { private JToggleButton myButton = new JToggleButton(); L’action du bouton permet public MyAbstractCellEditorBoolean() { de valider la valeur qui vient myButton.addActionListener(new ActionListener(){ d’être saisie public void actionPerformed(ActionEvent e){ MyAbstractCellEditorBoolean.this.fireEditingStopped(); } }); } Cette méthode retourne au public Object getCellEditorValue() { modèle la nouvelle valeur return new Boolean(myButton.isSelected()); (setValueAt(…) du modèle) } public Component getTableCellEditorComponent(JTable arg0, Object arg1,keulkeul.blogspot.com boolean arg2, int arg3, int arg4) { Boolean myBool = (Boolean )arg1; myButton.setSelected(myBool.booleanValue()); return myButton; } L’initialisation du composant } qui se charge de l’édition Java Visu - M. Baron - Page 21
  22. 22. JTable : modèle de sélection Le modèle de sélection permet de gérer les aspects liés à la sélection de lignes ou de colonnes (une ou plusieurs …) Un modèle de sélection doit implémenter l’interface appelée ListSelectionModel Possibilité de modifier un modèle de sélection pour toutes les lignes et un modèle de sélection pour toutes les colonnes JTable#setSelectionModel(ListSelectionModel) : modifie le modèle de sélection pour les lignes TableColumnModel#setSelectionModel(ListSelectionModel) : modifie le modèle de sélection pour toutes les colonneskeulkeul.blogspot.com Pour écouter le changement de sélection de lignes ou de colonnes ajoutez un écouteur sur le modèle de sélection ListSelectionModel#addListSelectionListener(ListSelectionListener) : ajoute un écouteur de sélection Java Visu - M. Baron - Page 22
  23. 23. JTable : modèle de sélection La définition explicite du modèle de sélection n’est utile que si vous souhaitez effectuer des traitements pointus sur les sélections Pour le reste des aspects liés à la sélection utilisez les méthodes de la classe JTable qui pointent directement sur le modèle de sélection setSelectionMode(int) : choix du modèle de sélection SINGLE_SELECTION : une seule cellule peut-être sélectionnée MULTIPLE_INTERVAL_SELECTION : plusieurs cellules sélection- nées à des moments différentskeulkeul.blogspot.com SINGLE_INTERVAL_SELECTION : plusieurs cellules sélectionnées en même temps int getSelectedColumn() : indice de la colonne sélectionnée int getSelectedRow() : indice de la ligne sélectionnée clearSelection() : supprime la sélection actuelleJava Visu - M. Baron - Page 23
  24. 24. JTable : modèle de sélection Trois différents modes de sélection Mode de sélection à SINGLE_SELECTION Mode de sélection à SINGLE_INTERVAL_SELECTIONkeulkeul.blogspot.com Mode de sélection à MULTIPLE_INTERVAL_SELECTION Java Visu - M. Baron - Page 24
  25. 25. JTable : modèle de sélection Exemple : accès aux informations de la sélection courante public class JTableDirectRenderer2 extends JFrame { ... Réaction au clic sur la public JTableExemple() { JTable ... myTable.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { System.out.println("Ligne:" + myTable.getSelectedRow()); System.out.println("Colonne:" + myTable.getSelectedColumn()); } }); ... Méthodes liées à la sélection disponibles } ... directement dans la classe JTablekeulkeul.blogspot.com Sortie « console » Java Visu - M. Baron - Page 25
  26. 26. JTable : ajout et suppression dynamique L’ajout et la suppression dynamique de ligne se fait en ajou- tant ou en supprimant des éléments au contenu sémantique de la JTable Rappelons que la méthode getRowCount() et getValueAt(…) sont appelées pour « peupler » la table Une solution est d’ajouter au modèle deux méthodes addRow(Object p, int pRow) : ajoute l’objet p à la ligne pRow removeRow(int pRow) : supprime la ligne pRow Le modèle n’est pas à même de connaître la ligne d’ajout ou la ligne à supprimer tout dépend de la ligne sélectionnéekeulkeul.blogspot.com Ajout : ligne suivante de celle sélectionnée ou dernière ligne Suppression : ligne en cours de sélection A chaque ajout ou suppression d’une ligne n’oubliez pas de notifier la vue des modifications apportées Java Visu - M. Baron - Page 26 au modèle
  27. 27. JTable : ajout et suppression dynamique Exemple : ajout et suppression de ligne dans une JTable public class MyDefaultSecondTableModel extends AbstractTableModel { private ArrayList colonneName = new ArrayList(); private ArrayList colonneLastName = new ArrayList(); ... public void addNewRow(int ligne) { int addline = getRowCount(); Transformer les tableaux en if (ligne != -1) ArrayList pour l’ajout Une méthode pour addline = ligne +1; dynamique des objets colonneName.add(addline, "Name"); ajouter des lignes colonneLastName.add(addline, "First Name"); ... this.fireTableStructureChanged(); } public void removeNewRow(int ligne) { if (getRowCount() == 0 || ligne < 0) Notification à return; l’ensemble des vueskeulkeul.blogspot.com Une méthode pour colonneName.remove(ligne); pour avertir que le supprimer des colonneLastName.remove(ligne); modèle a changé ... lignes this.fireTableStructureChanged(); } ... } Java Visu - M. Baron - Page 27
  28. 28. JTable : ajout et suppression dynamique Exemple (suite) : ajout et sup. de ligne dans une JTable public class JTableDirectRenderer3 extends JFrame { ... public JTableExemple() { JButton myAddButton = new JButton("Ajouter"); myAddButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { MyDefaultTableModel refModel = (MyDefaultTableModel)myTable.getModel(); refModel.addNewRow(myTable.getSelectedRow()); } }); Identifie le modèle JButton myRemoveButton = new JButton("Supprimer"); myRemoveButton.addActionListener(new ActionListener(){ du composant JTable public void actionPerformed(ActionEvent e) { MyDefaultTableModel refModel = (MyDefaultTableModel)myTable.getModel(); refModel.removeNewRow(myTable.getSelectedRow()); } }); Récupère l’indice de } ... la lige sélectionnéekeulkeul.blogspot.com Deux boutons pour ajouter ou supprimer des lignes Java Visu - M. Baron - Page 28
  29. 29. JTable : bilan Un composant JTable est une vue paramétrable qui permet d’afficher et modifier des données d’une table JTable Données du Sélection des Modification des composant données données 1 .. >= Colonne 1 .. >= Colonne 1 1 TableCellRenderer TableCellEditor TableModel ListSelectionModel 0..n 0..n Paramétrage de CellEditorListener TableModelListener l’affichage des 0..n donnéeskeulkeul.blogspot.com Ecouteur pour avertir que Ecouteur pour ListSelectionListener l’édition est annulée ou validée avertir que le modèle a changé Ecouteur pour avertir Grâce au pattern MVC de Java il est possible de que la sélection a brancher un modèle existant à une autre vue changé (voir le composant JGraph pour un exemple) Java Visu - M. Baron - Page 29
  30. 30. JTree : présentation générale Avec le composant JTree vous pouvez afficher les données sous forme d’arbre, plier/déplier des nœuds et les éditer Le nœud racine, il est Un nœud père qui contient unique et ne possède pas quatre nœuds fils de parent Un nœud feuille et fils du Des icônes pour nœud « colors » représenter l’état des nœuds Un composant JTree doit être ajouté à un container JScollPane et non à un simple JPanelkeulkeul.blogspot.com JTree myTree = new JTree(...); Affiche le JScrollPane myScrollPane = new JScrollPane(myTree); JTree avec JScrollPane myScrollPane = new JScrollPane(); des myScrollPane.add(myTree); ascenseurs si besoin Le JTree n’est pas visible dans ce cas là Java Visu - M. Baron - Page 30
  31. 31. JTree : gestion des noeuds L’interface MutableTreeNode (hérite de TreeNode) fournit un service de gestion et de manipulation des données de l’arbre Un MutableTreeNode modélise un nœud de l’arbre. La classe DefaultMutableTreeNode est une implémentation par défaut add(MutableTreeNode p) : ajoute p comme dernier enfant noeud int getChildCount() : retourne le nombre d’enfant du nœud TreeNode getParent() : retourne le nœud parent TreeNode getChildAt(int p) : retourne l’enfant de l’indice pkeulkeul.blogspot.com insert(MutableTreeNode child, int index) : ajout l’enfant à la position indice remove(MutableTreeNode child) : supprime le nœud child isLeaf() : le nœud est une feuille ou pas, … Java Visu - M. Baron - Page 31
  32. 32. JTree : gestion des noeuds Chaque nœud peut contenir un objet utilisateur setUserObject(Object object) : modifie l’objet du nœud Object getUserObject() : récupère l’objet du nœud Un objet DefaultMutableTreeNode peut être construit à partir d’un objet utilisateur : DefaultMutableTreeNode(Object user) Par défaut, le texte affiché pour chaque nœud correspond à l’objet utilisateur retourné par sa méthode toString() (étudié plus en détail dans le Render/Editor du JTree)keulkeul.blogspot.com Par comparaison avec la JTable l’objet utilisateur est l’objet retourné par getValueAt() du modèle Un composant JTree affiche l’objet DefaultMutableTreeNode qui correspond au nœud racine appelé « root Visu - M. Baron - Page 32 Java »
  33. 33. JTree : gestion des noeuds Exemple : manipulation d’un objet DefaultMutableTreeNode public JTreeExample1() { DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Père de tous"); DefaultMutableTreeNode childNode = new DefaultMutableTreeNode("Enfant Raoul"); rootNode.add(childNode); childNode = new DefaultMutableTreeNode("Enfant Gasper"); rootNode.add(childNode); Ajout de nœuds dans le childNode = new DefaultMutableTreeNode("Enfant Leon"); nœud racine rootNode.add(childNode); DefaultMutableTreeNode childChildNode = new DefaultMutableTreeNode("Petit Leon"); childNode.add(childChildNode); childChildNode = new DefaultMutableTreeNode("Petit Leon second"); childNode.add(childChildNode); Les nœuds sont construits avec un objet System.out.println("Nombre denfants : " + rootNode.getChildCount()); System.out.println("Nombre denfants ayant des petits enfants : " + utilisateur de type rootNode.getSiblingCount()); String System.out.println("Objet du noeud racine : " + rootNode.getUserObject()); rootNode.setUserObject("Père de tous M");keulkeul.blogspot.com JTree myJTree = new JTree(rootNode); JScrollPane myScrollPane = new JScrollPane(myJTree); this.getContentPane().add(myScrollPane()); ... } } Java Visu - M. Baron - Page 33
  34. 34. JTree : création du modèle Le modèle d’un JTree propose un ensemble de fonction- nalités pour manipuler les nœuds de l’arbre Le point de départ du modèle est le nœud « root ». En effet un modèle pour un JTree est construit avec le nœud racine L’interface TreeModel s’occupe de décrire le modèle de l’arbre. DefaultTreeModel est une implémentation par défaut DefaultTreeModel(TreeNode p) : modèle avec un nœud racine Object getChild(Object parent, int index) : retourne l’enfant de l’indice index du parent parent int getchildCount(Object parent) : nombre d’enfants de parentkeulkeul.blogspot.com Object getRoot() : retourne le nœud racine de l’arbre boolean isLeaf(Object node) : détermine node est une feuille Les objets en paramètre et en retour ne sont pas des MutableTreeNode. Vous pouvez proposez votre structure en implémentant votre propre modèle (TreeModel) Java Visu - M. Baron - Page 34
  35. 35. JTree : création du modèle Les méthodes du modèle sont utilisées de la même manière que celles du modèle de la JTable Principe de fonctionnement la méthode getChildCount(…) détermine le nombre d’enfant du nœud la méthode getChild(…) pour le même parent sera appelée autant de fois que la valeur retournée par getChildCount(…) En plus des méthodes d’interrogation des nœuds il est possible d’écouter les modifications du modèle addTreeModelListener(TreeModelListener l) : ajouter un écouteur treeNodesChanged(TreeNodeEvent) : un nœud a été changé (le contenu)keulkeul.blogspot.com treeStructureChanged(TreeNodeEvent) : un nœud a été déplacé … Les méthodes d’ajout et de suppression seront vues plus loin Java Visu - M. Baron - Page 35
  36. 36. JTree : création du modèle Exemple : ne montrer que les enfants du nœud racine public MyTreeModel extends DefaultTreeModel { public MyTreeModel(MutableTreeNode p) { Ne pas oublier de donner le super(p); nœud racine au modèle } public Object getChild(Object arg0, int arg1) { return ((DefaultMutableTreeNode) arg0).getChildAt(arg1); } public int getChildCount(Object arg0) { Pour chaque nœud on if (arg0 != root) compte le nombre return 0; d’enfants DefaultMutableTreeNode myTreeNode = (DefaultMutableTreeNode) arg0; return myTreeNode.getChildCount(); } public boolean isLeaf(Object arg0) { if (arg0 == root) return false;keulkeul.blogspot.com } return true; Détermine si le nœud } est une feuille ou pas } JTree myTree = new JTree(new MyTreeModel(root)); JScrollPane myScrollPane = new JScrollPane(myTable); ... Java Visu - M. Baron - Page 36
  37. 37. JTree : Editors et Renderers Un JTree dispose de classes spécifiques pour effectuer Un rendu des noeuds appelée classe Renderer Une édition des données des noeuds appelée classe Editor Un objet Editor est appelé quand l’utilisateur effectue une action d’édition sur le noeud (sous condition que le nœud soit éditable) Un objet Renderer est une vue sans réaction directe qui retourne une visualisation du nœud (objet utilisateur)keulkeul.blogspot.com L’objet Renderer L’objet Editor utilisé utilisé par défaut est par défaut est un un JLabel JTextField Java Visu - M. Baron - Page 37
  38. 38. JTree : Editors et Renderers Principe d’appel des objets Editor et Renderer Utilisateur déplace la fenêtre Utilisateur clique sur un et sélectionne un noeud noeud éditable 1 L’objet Editor est appelé. La Le Renderer affiche les données valeur courante du noeud est de chaque MutableTreeNode retournée à l’objet Editor. 2 Utilisateur termine l’édition L’objet Editor retourne 3keulkeul.blogspot.com la nouvelle valeur qui est transmise au MutableTreeNode éditée Java Visu - M. Baron - Page 38
  39. 39. JTree : Editors et Renderers Le composant JTree ne manipule pas de ligne ni de colonne comme un composant JTable A la différence du composant JTable les objets Renderer et Editor sont applicables à tous les nœuds de l’arbre JTree#setCellRenderer(TreeCellRenderer) : modifie un objet Renderer JTree#setCellEditor(TreeCellEditor) : modifie un objet Editor Modification du Renderer de public class JTreeExample3 extends JFrame { l’objet myTree public MyJTree() { ... JTree myTree = new JTree(new MyDefaultTreeModel()); JScrollPane myScrollPane = new JScrollPane(myTree);keulkeul.blogspot.com myTree.setCellRenderer(new MyTreeCellRenderer()); myTree.setCellEditor(new MyTreeCellEditor()); ... } } Modification de l’Editor de l’objet myTree Java Visu - M. Baron - Page 39
  40. 40. JTree : Renderers Un Renderer doit implémenter l’interface TreeCellRenderer Cette interface possède une méthode unique qui retourne le composant à afficher dans la cellule Component getTreeCellRendererComponent(JTree tree, Object v, boolean isSel, boolean exp, boolean leaf, int row, boolean hFocus) JTree tree : référence de la JTree associé au Renderer Object v : le nœud en cours de rendu boolean isSel : le nœud est-il sélectionné ? Le composant de boolean exp : le nœud est-il déplié ? retour n’a pas de « réaction » il est boolean leaf : le nœud est-il une feuille utilisé pour effectuerkeulkeul.blogspot.com un rendu = image int row : le numéro d’indice de l’enfant boolean hFocus : le composant à la focus Il faut donc retourner un objet graphique Component qui sera utilisé pour effectuer le rendu du noeud Java Visu - M. Baron - Page 40
  41. 41. JTree : Renderers Exemple : un Renderer personnalisé public class MyDefaultTreeCellRenderer implements TreeCellRenderer { public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { JLabel myLabel = new JLabel(); L’objet envoyé au Renderer est un JLabel labelExpanded = new JLabel(); objet de type MutableTreeNode if (value instanceof DefaultMutableTreeNode) { DefaultMutableTreeNode myNode = (DefaultMutableTreeNode)value; String infoText = "- "; if (selected) infoText += "S "; if (leaf) myLabel.setIcon(new ImageIcon("middle.gif")); else myLabel.setIcon(new ImageIcon("pig.gif")); if (expanded) labelExpanded.setIcon(new ImageIcon("exp.gif")); else labelExpanded.setIcon(new ImageIcon("nexp.gif"));keulkeul.blogspot.com infoText += " L :" + row + " - "; infoText += (String)myNode.getUserObject(); myLabel.setText(infoText); } Nous retournons ici un JPanel myPanel = new JPanel(new BorderLayout()); composant JPanel (par défaut il myPanel.add(BorderLayout.WEST,labelExpanded); s’agit d’un composant JLabel) myPanel.add(BorderLayout.CENTER,myLabel); return myPanel; } Java Visu - M. Baron - Page 41
  42. 42. JTree : Editors Un Editor doit implémenter l’interface TreeCellEditor qui hérite également de l’interface CellEditor Cette interface possède entre autre une méthode qui retourne le composant à afficher pour l’édition Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row) JTree tree : référence de la JTree associé à l’Editor Object value : objet MutableTreeNode en cours d’édition boolean isSelected : le noeud est-il sélectionné ? boolean expanded : le nœud est-il déplié ? boolean leaf : le nœud est-il une feuille ?keulkeul.blogspot.com int row : le numéro d’indice de l’enfant Pour éviter d’implémenter toutes les méthodes de l’interface CellEditor vous pouvez utiliser la classe AbstractCellEditor Java Visu - M. Baron - Page 42
  43. 43. JTree : Editors Si la classe AbstractCellEditor est utilisée en place de CellEditor certaines méthodes ont un comportement prédéfini stopCellEditing() : déclenche l’arrêt de l’Editor cancelCellEditing() : déclenche l’annulation de l’Editor addCellEditorListener(CellEditorListener) : ajoute un écouteur d’édition … Cependant vous devrez fournir obligatoirement une implémen- tation de la méthode Object getCellEditorValue() : retourne la valeur que l’utilisateur vient de saisir (la méthode setUserObject(…) du nœud est alors appelée)keulkeul.blogspot.com Principe de codage Implémentez getTreeCellEditorComponent(…) pour retourner le composant d’édition La validation du composant d’édition doit appeler stopCellEditing() Implémentez getCellEditorValue() Java Visu - M. Baron - Page 43
  44. 44. JTree : Editors Exemple : un Editor personnalisé public class MyDefaultTreeCellEditor extends AbstractCellEditor implements TreeCellEditor, ActionListener { private JPanel myPanel; private JTextField myText; public MyDefaultTreeCellEditor() { myPanel = new JPanel(); JLabel myLabel = new JLabel("Edition :"); myText = new JTextField(10); myText.addActionListener(this); myPanel.setLayout(new BorderLayout()); myPanel.add(BorderLayout.WEST, myLabel); myPanel.add(BorderLayout.CENTER, myText); } public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row) { La valeur éditée if (value instanceof DefaultMutableTreeNode) { DefaultMutableTreeNode ob = (DefaultMutableTreeNode)value; est celle de myText.setText((String)ob.getUserObject()); l’objet utilisateur } La méthode qui renvoie lakeulkeul.blogspot.com return myPanel; } nouvelle valeur de public Object getCellEditorValue() { return myText.getText(); l’utilisateur au nœud édité } setUserObject(…) public void actionPerformed(ActionEvent arg0) { this.stopCellEditing(); } } Java Visu - M. Baron - Page 44
  45. 45. JTree : modèle de sélection Le modèle de sélection permet de gérer les aspects liés à la sélection de nœuds (un ou plusieurs) Un modèle de sélection doit implémenter l’interface appelée TreeSelectionModel Possibilité de modifier ou de récupérer un modèle de sélection d’un composant JTree setSelectionModel(TreeSelectionModel) : modifie le modèle de sélection TreeSelectionModel getSelectionModel() : récupère le modèle de sélectionkeulkeul.blogspot.com Pour écouter le changement de sélection de nœuds ajoutez un écouteur sur le modèle de sélection addTreeSelectionListener(TreeSelectionListener) : ajoute un écouteur de sélection Java Visu - M. Baron - Page 45
  46. 46. JTree : modèle de sélection La modification du modèle de sélection n’est utile que si vous effectuer des traitements pointus sur les sélections Curieusement certaines méthodes proposées directement par la classe JTable ne se retrouvent pas dans la classe JTree setSelectionMode(int) : choix du modèle de sélection SINGLE_TREE_SELECTION : un seul noeud sélectionné CONTIGUOUS_TREE_SELECTION : plusieurs noeuds sélectionnés directement liés (lien de voisinage) DISCONTIGUOUS_TREE_SELECTION : plusieurs nœuds sélection- nés indirectement liéskeulkeul.blogspot.com TreePath getSelectionPath() : retourne le chemin du nœud sélectionné TreePath[] getSelectionPaths() : retourne les chemins des nœuds sélectionnés Méthodes disponibles à la fois dans la classe JTree et TreeSelectionModel Java Visu - M. Baron - Page 46
  47. 47. JTree : modèle de sélection Trois différents modes de sélection Mode de sélection à SINGLE_TREE_SELECTIONkeulkeul.blogspot.com Mode de sélection à Mode de sélection à CONTIGUOUS_TREE_SELECTION DISCONTIGOUS_TREE_SELECTION Java Visu - M. Baron - Page 47
  48. 48. JTree : modèle de sélection Les méthodes qui permettent de récupérer le ou les nœuds sélectionné(s) retournent un objet TreePath Un objet TreePath est une sorte de chemin des objets de la racine jusqu’aux objets du nœud sélectionné Les objets sont normalement des MutableTreeNode Exemples : « Père de tous », « Enfant Leon » et « Petit Leon » Nœud racine à l’indice 0 Nœud père à l’indice 1keulkeul.blogspot.com Nœud feuille à l’indice 2 Java Visu - M. Baron - Page 48
  49. 49. JTree : modèle de sélection La classe TreePath possède des méthodes qui permettent d’extraire du ou des chemins sélectionné(s) les nœuds intéressants Object getLastPathComponent() : objet correspondant au dernier nœud sélectionné (normalement de type MutableTreeNode) Object getPathComponent(int elem) : objet du nœud à l’indice elem. La tête du chemin correspond à l’indice zéro TreePath getParentPath() : nouveau chemin excepter le dernier nœud int getPathCount() : nombre de nœuds inclus dans ce cheminkeulkeul.blogspot.com … Les objets récupérés peuvent être « castés » en une classe de type MutableTreeNode Java Visu - M. Baron - Page 49
  50. 50. JTree : modèle de sélection Exemple : accès aux informations de la sélection courante ... myJTree.addTreeSelectionListener(new TreeSelectionListener(){ public void valueChanged(TreeSelectionEvent tse) { TreePath myPath = myJTree.getSelectionPath(); DefaultMutableTreeNode myMutable = (DefaultMutableTreeNode)myPath.getPathComponent(0); System.out.println("Racine" + myMutable); System.out.println("Sélection" + (DefaultMutableTreeNode)myPath.getLastPathComponent()); } }); ...keulkeul.blogspot.com Java Visu - M. Baron - Page 50
  51. 51. JTree : ajout et suppression dynamique Pour ajouter ou supprimer des nœuds dans un JTree, il suffit de manipuler les nœuds parents en ajoutant ou supprimant des nœuds enfants (par défaut la structure est de type MutableTreeNode) add(MutableTreeNode child) : ajoute le nœud child en dernière position insert(MutableTreeNode child, int childIndex) : ajoute le nœud child à la position childIndex remove(int child) : supprime le nœud à l’indice child remove(MutableTreeNode child) : supprime le nœud child La classe DefaultTreeModel propose des méthodes qui réalisekeulkeul.blogspot.com la même chose insertNodeInto(MutableTreeNode child, MutableTreeNode par, int ind) : ajoute le nœud child à l’indice ind au nœud par removeNodeFromParent(MutableTreeNode c) : supprime le nœud c Java Visu - M. Baron - Page 51
  52. 52. JTree : ajout et suppression dynamique Etapes pour ajouter ou supprimer un nœud Connaître le nœud parent dans lequel ce nœud va être ajouté (sélec- tion ou au début/fin d’un nœud particulier) Extraction de l’objet TreePath le futur nœud parent Ajouter ou supprimer au futur nœud parent le nouveau sous nœud Mettre à jour le modèle pour qu’il puisse notifier la ou les vues des changements effectués Déplier complètement l’arborescence du nouveau noeud (par défaut les nouveaux nœuds ne sont pas dépliés) JTree#scrollPathToVisible(TreePath p) : déplier un cheminkeulkeul.blogspot.com Avertir le modèle d’un éventuel changement (ajout, suppression, modification d’objet, …) DefaultTreeModel#reload() : recharge le modèle DefaultTreeModel#reload(TreeNode node) : recharge le modèle par le dessous du nœud node Java Visu - M. Baron - Page 52
  53. 53. JTree : ajout et suppression dynamique Exemple : ajouter, supprimer et tout supprimer … ... JButton add = new JButton("Ajouter"); add.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { TreePath myPath = myJTree.getSelectionPath(); DefaultMutableTreeNode myParent = (DefaultMutableTreeNode)myPath.getLastPathComponent(); DefaultMutableTreeNode mySon = new DefaultMutableTreeNode("Coucou"); myParent.add(mySon); myJTree.scrollPathToVisible(new TreePath(mySon.getPath())); ((DefaultTreeModel)myJTree.getModel()).reload(myParent); } }); JButton remove = new JButton("Supprimer"); remove.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { TreePath myPath = myJTree.getSelectionPath();keulkeul.blogspot.com DefaultMutableTreeNode myParent= (DefaultMutableTreeNode)(myPath.getParentPath().getLastPathComponent()); DefaultMutableTreeNode mySon= (DefaultMutableTreeNode)myPath.getLastPathComponent(); myParent.remove(mySon); ((DefaultTreeModel)myJTree.getModel()).reload(myParent); } }); Java Visu - M. Baron - Page 53
  54. 54. JTree : ajout et suppression dynamique Exemple (suite) : ajouter, supprimer et tout supprimer … ... JButton removeAll = new JButton("Tout supprimer"); removeAll.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ((DefaultMutableTreeNode)myJTree.getModel().getRoot()).removeAllChildren(); ((DefaultTreeModel)myJTree.getModel()).reload(); } }); Mise à jour du modèle après modification Tous les enfants ont été supprimés du nœud racinekeulkeul.blogspot.com Java Visu - M. Baron - Page 54
  55. 55. JTree : bilan Un composant JTree est une vue paramétrable qui permet d’afficher et modifier des données d’un arbre JTree Modification des Données du Sélection des données composant données 1 1 1 1 TreeCellRenderer TreeCellEditor TreeModel TreeSelectionModel 0..n 0..n Paramétrage de CellEditorListener TreeModelListener l’affichage des 0..n donnéeskeulkeul.blogspot.com Ecouteur pour avertir que Ecouteur pour TreeSelectionListener l’édition est annulée ou validée avertir que le modèle a changé Ecouteur pour avertir Grâce au pattern MVC de Java il est possible de que la sélection a brancher un modèle existant à une autre vue changé (voir le composant JGraph pour un exemple) Java Visu - M. Baron - Page 55
  56. 56. JGraph : présentation générale Un graphe est un cas particulier d’arbre où les nœuds peuvent posséder plusieurs parents disjoints ou pas L’API Swing ne propose pas par défaut de composant permettant de représenter des graphes Utilisation de l’API externe JGraph Site : www.jgraph.com Elle fonctionne suivant un principe commun aux composants JTable et JTree dans le sens où elle se fonde sur l’architecture MVC De nombreux outils utilisent cette bibliothèque et dont lakeulkeul.blogspot.com licence est libre d’utilisation sous condition de fournir les sources Documentation (Tutorial) payante mais JavaDoc ainsi qu’un Forum sont disponibles gratuitement Java Visu - M. Baron - Page 56
  57. 57. keulkeul.blogspot.com JGraph : présentation générale Java Visu - M. Baron - Page 57
  58. 58. keulkeul.blogspot.com JGraph : présentation générale Java Visu - M. Baron - Page 58
  59. 59. JGraph : présentation générale Avec le composant JGraph vous pouvez afficher les données sous forme de graphe Un lien « edge » avec du texte Démonstration : www.jgraph.com Un lien « edge » sans texte Un port « port » de connexion pour le lien ou point d’attachekeulkeul.blogspot.com Un groupe « group » Une cellule « cell » qui regroupe 2 avec un couleur et cellules et un lien du texte Java Visu - M. Baron - Page 59
  60. 60. JGraph : présentation générale L’API de JGraph propose de nombreuses caractéristiques Déplacement, re-dimensionnement et sélection des objets Agrandissement/Réduction de la vue du graphe Grille avec modification du pas Courbe de Bezier et Spline pour les liens, … Des caractéristiques sont manquantes (présentées dans ce cours) Aperçu avec positionnement manuel sur le graphe Impression évoluée avec plusieurs pages Un composant JGraph doit être ajouté à un container JScollPane et non à un simple JPanelkeulkeul.blogspot.com JGraph myGraph = new JGraph(); Affiche le JScrollPane myScrollPane = new JScrollPane(myGraph); JGraph avec JScrollPane myScrollPane = new JScrollPane(); des ascenseurs myScrollPane.add(myGraph); si besoin Le JGraph n’est pas visible dans ce cas là Java Visu - M. Baron - Page 60
  61. 61. JGraph : gestion des cellules Tout composant dans un JGraph est considéré comme un objet de type GraphCell Nous distinguons trois types d’objets Cellule ou groupe (la donnée à afficher ou les objets à regrouper) Lien (objet graphique qui relie deux cellules) Port (objet graphique qui sert d’ancre entre une cellule à un lien)keulkeul.blogspot.com Java Visu - M. Baron - Page 61
  62. 62. JGraph : gestion des cellules Un objet de type GraphCell a également le comportement d’un objet MutableTreeNode et plus spécifiquement de type DefaultMutableTreeNode (utilisé dans JTree) Utilisation des fonctionnalités de la classe MutableTreeNode Une cellule peut contenir un sous ensemble de point d’attache (Port) et peut-être un enfant d’un groupe Un groupe peut avoir comme enfants des cellules, des liens (Edge) et/ou des sous-groupes. Un groupe peut donc être un enfant d’un groupe Un lien peut-être un enfant d’un groupe Un point d’attache peut-être un enfant d’une cellule (petit fils d’unkeulkeul.blogspot.com groupe) Les aspects liés aux connexions des liens (quels sont les ports connectés) ne sont pas modélisés par les MutableTreeNode Java Visu - M. Baron - Page 62
  63. 63. JGraph : gestion des cellules Relation entre un lien et les cellules A et B Une cellule A qui Une cellule B qui contient un point contient un point d’ancrage a d’ancrage b Un lien entre la cellule A et B Une cellule a accès à La racine est l’ensemble de ses sous obligatoirement Un lien a un accès au référence enfants (port) un groupe du port a et du port b MutableTreeNode Un port contient une référence à son parentkeulkeul.blogspot.com (cellule) MutableTreeNode Un port contient également une référence à l’ensemble de liens connectés à ce port HashSet Java Visu - M. Baron - Page 63
  64. 64. JGraph : gestion des cellules La structure proposée par JGraph permet un accès directe aux objets d’un graphe L’accès à une cellule, un groupe, un lien ou un port donne la possibilité d’extraire n’importe quelle référence d’un objet du graphe Différentes possibilités d’extraction de référence Lien : accès aux références du port source et cible et éventuellement du groupekeulkeul.blogspot.com Port : accès à la référence de la cellule et de l’ensemble des liens Cellule : accès aux références des ports et éventuellement du groupe Groupe : accès aux références des cellules et des Visu - M. Baron - Page Java liens 64
  65. 65. JGraph : gestion des cellules Un groupe ou une cellule doivent être construits à partir d’un objet de type DefaultGraphCell Outre les méthodes fournies par DefautMutableTreeNode la classe DefaultGraphCell propose uniquement des méthodes pour modifier des attributs des objets (cellule, port et lien) AttributeMap getAttributes() : retourne les propriétés d’une cellule setAttributes(AttributeMap attributes) : modifie les attributskeulkeul.blogspot.com La modification et l’interrogation des attributs propre à JGraph se font différents des autres composants Swing Java Visu - M. Baron - Page 65
  66. 66. JGraph : gestion des cellules Tous les attributs sont stockés dans un objet de type AttributeMap qui est une table de hachage HashTable Rappelons que pour accéder à une valeur d’une HashTable il faut y accéder à l’aide d’une clé Clé key1 pour accéder à la valeur val1keulkeul.blogspot.com L’ensemble des clés des attributs des objets JGraph sont définies dans la classe GraphConstants Pour chaque clé un accesseur et un modifieur ont été définies dans la classe GraphConstants Java Visu - M. Baron - Page 66
  67. 67. JGraph : gestion des cellules Création d’une nouvelle cellule avec association d’un attribut // Création d’une cellule DefaultGraphCell myCell = new DefaultGraphCell(); // Création d’une HashTable pour contenir les attributs. Map myHashTable = new HastTable(); // Modification de l’attribut position et taille myHashTable.put(GraphConstants.BOUNDS, new Rectangle2D.Double(120, 25, 25, 25)); // Même chose en passant par le modifieur GraphConstants.setBounds(map, new Rectangle2D.Double(120, 25, 25, 25));keulkeul.blogspot.com // Associer les nouveaux attributs (pour l’instant un seul) à la cellule myCell.setAttributes(new AttributeMap(myHashTable)); Préférez l’utilisation des modifieurs et des accesseurs puisqu’elles typent les paramètres et les valeurs de retour Java Visu - M. Baron - Page 67
  68. 68. JGraph : gestion des cellules Modification d’un attribut d’une cellule // Création d’une HashTable pour contenir les attributs. Map myHashTable = myCell.getAttributes(); // Modification de l’attribut Bounds en passant par le modifieur GraphConstants.setBounds(map, new Rectangle2D.Double(120, 25,25,25)); // Associer les nouveaux attributs (pour l’instant un seul) à la cellule myCell.setAttributes(new AttributeMap(myHashTable)); Interrogation d’un attribut d’une cellule // Création d’une HashTable pour contenir les attributs. Map myHashTable = myCell.getAttributes(); // Même chose en passant le modifieur Rectangle2D myRectangle = GraphConstants.getBounds(map);keulkeul.blogspot.com // Afficher les informations System.out.println(myRectangle.getX()); System.out.println(myRectangle.getY()); System.out.println(myRectangle.getWidth()); System.out.println(myRectangle.getHeight()); Java Visu - M. Baron - Page 68
  69. 69. JGraph : DefaultPort La gestion des points d’ancrage est réalisé par un objet de type DefaultPort Un objet DefaultPort, s’il est associé à une cellule, permet de connaître son objet parent : une cellule Un objet DefaultPort, s’il est relié à un ou des liens, permet d’accéder aux différents liens La classe DefaultPort possède plusieurs méthodeskeulkeul.blogspot.com Set getEdges() : retourne les liens associés à ce point d’ancrage addEdge(Object edge) : curieusement cette méthode ne donne pas l’effet désiré (voir plus loin pour l’ajout de lien) Java Visu - M. Baron - Page 69
  70. 70. JGraph : DefaultPort Exemple : ajout de deux points d’ancrage à une cellule // Création de la cellule DefaultGraphCell myCell = new DefaultGraphCell("Coucou"); // Création des deux ports ou points d’ancrage DefaultPort myFirstPort = new DefaultPort(); DefaultPort mySecondPort = new DefaultPort(); // Ajout des points d’ancrage à la cellule myCell.add(myFirstPort); myCell.add(mySecondPort);keulkeul.blogspot.com L’aspect graphique sera vu dans la suite. On pourra définir la forme et l’emplacement des points d’ancrage Java Visu - M. Baron - Page 70
  71. 71. JGraph : DefaultEdge Les liens entre des cellules sont réalisés par l’intermédiaire d’un objet de type DefaultEdge Un lien est connecté aux cellules par l’intermédiaire de leur point d’ancrage L’API de la classe DefaultEdge permet Object getSource() : le point d’ancrage source Object getTarget() : le point d’ancrage cible Il est possible de modifier les caractéristiques d’un lien enkeulkeul.blogspot.com modifiant par exemple la forme du trait de liaison La classe GraphConstants fournit des clés pour modifier la forme du point de départ et d’arrivée Java Visu - M. Baron - Page 71
  72. 72. JGraph : DefaultEdge Exemple : connexion d’un lien à deux cellules // Création de la cellule DefaultGraphCell myCell = new DefaultGraphCell("Coucou"); // Création des deux ports ou points d’ancrage DefaultPort myFirstPort = new DefaultPort(); DefaultPort mySecondPort = new DefaultPort(); // Ajout des points d’ancrage à la cellule myCell.add(myFirstPort); Création d’un lien entre les myCell.add(mySecondPort); points d’ancrage myFirstPort et mySecondPort // Création d’un objet lien DefaultEdge myEdge = new DefaultEdge();keulkeul.blogspot.com // Associer lien aux points d’ancrage myGraph.getGraphLayoutCache().insertEdge(myEdge, myFirstPort, mySecondPort); Sera vu plus tard dans la partie des vues Java Visu - M. Baron - Page 72
  73. 73. JGraph : DefaultEdge Exemple : modification des attributs d’un lien ... // Création d’un objet lien DefaultEdge myEdge = new DefaultEdge(); Le début et la fin du lien ont été modifié // Modification des attributs du lien myHashTable = myEdge.getAttributes(); GraphConstants.setLineBegin(myHashTable, GraphConstants.ARROW_CIRCLE); GraphConstants.setLineEnd(myHashTable, GraphConstants.ARROW_DIAMOND); myEdge.setAttributes(new AttributeMap(myHashTable)); // Ajout du noeud myGraph.getGraphLayoutCache().insertEdge(myEdge, myFirstPort, mySecondPort);keulkeul.blogspot.com L’apparence du lien a La cellule contient un été modifiée port qui est centré Java Visu - M. Baron - Page 73

×