Java AWT Arbres o Un premier exemple o

Java AWT Arbres o Un premier exemple o Contenu o Rendu o Ecouteurs o Parcours o Un deuxième exemple Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 1

JTree n Description hiérarchique de données n Sept autre classes utilisées l l l l Java AWT Tree. Model : contient les données figurant dans l’arbre Tree. Node : implémentation des noeuds et de la structure d’arbre Tree. Selection. Model : contient le ou les noeuds sélectionnés Tree. Path : un tel objet contient un chemin (de la racine vers le sommet sélectionné par exemple) Tree. Cell. Renderer : est appelé pour dessiner un noeud Tree. Cell. Editor : l’éditeur pour un noeud est éditable Tree. UI : look-and-feel Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 2

JTree n Un arbre est créé à partir d’un Tree. Model n Il existe plusieurs modèles de sélection l l l Java AWT sélection d’un seul élément sélection de plusieurs éléments contigus sélection de plusieurs éléments disparates n On peut indiquer un Cell. Renderer pour afficher une cellule de façon particulière. n On peut indiquer un Cell. Editor pour changer la valeur d’une cellule interface Tree. Model {. . . public Object get. Child(Object parent, int index); public Object get. Root(); public boolean is. Leaf(Object node); . . . } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 3

Java AWT Arbres n JTree fournit une vue du modèle n Le modèle d’arbre est en deux étapes: interface Tree. Model class Default. Tree. Model implements Tree. Model n Le modèle des noeuds est en trois étages: interface Tree. Node interface Mutable. Tree. Node extends Tree. Node class Default. Mutable. Tree. Node implements Mutable. Tree. Node n Constructeurs l une feuille u peut recevoir des fils ? u reste sans fils ? JTree() JTree(Tree. Node racine, boolean enfants. Permis) JTree(Tree. Model modele, boolean enfants. Permis) Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 4

Exemple Java AWT class Arbre extends JPanel { JTree tree; public Arbre() { Default. Mutable. Tree. Node top, noeud, fils, n; top = new Default. Mutable. Tree. Node("Top"); tree = new JTree(top); noeud = new Default. Mutable. Tree. Node("Repertoire 1"); top. add(noeud); n = new Default. Mutable. Tree. Node("1 a"); noeud. add(n); n = new Default. Mutable. Tree. Node("1 b"); noeud. add(n); . . . noeud = new Default. Mutable. Tree. Node("Repertoire 2"); top. add(noeud); n = new Default. Mutable. Tree. Node("2 a"); noeud. add(n); . . fils = new Default. Mutable. Tree. Node("2 d"); noeud. add(fils); n = new Default. Mutable. Tree. Node("3 a"); fils. add(n); }. . . Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 5

Contenu n Le contenu d’un noeud est appelé user object n C’est un objet n A l’affichage, la méthode to. String() d’un noeud délègue à la méthode to. String() du contenu. Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée Java AWT 6

Rendu n Java AWT Un Default. Tree. Cell. Renderer s’occupe du rendu. Il peut être modifié par l l des fonctions utilitaires par une redéfinition Default. Tree. Cell. Renderer rendu ; rendu = (Default. Tree. Cell. Renderer) tree. get. Cell. Renderer(); rendu. set. Open. Icon(new Image. Icon("Opened. gif")); rendu. set. Leaf. Icon(new Image. Icon("Leaf. gif")); Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 7

Sélection n Un Tree. Selection. Listener rapporte tous les changements dans les sélections n De nombreuses fonctions utilitaires Java AWT tree. add. Tree. Selection. Listener(new Selecteur()); class Selecteur implements Tree. Selection. Listener { public void value. Changed( Tree. Selection. Event e ) { message. set. Text( "Nouveau : " + e. get. New. Lead. Selection. Path() ); } } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 8

Parcours n On parcourt un arbre par une énumération n Il en existe trois l l l Java AWT breadth. First. Enumeration depth. First. Enumeration postorder. Enumeration preorder. Enumeration public void action. Performed(Action. Event ev) { Default. Mutable. Tree. Node n, top; Enumeration e; top = (Default. Mutable. Tree. Node)tree. get. Model(). get. Root(); System. out. println("n En largeur"); e = (top). breadth. First. Enumeration(); while (e. has. More. Elements()) { n = (Default. Mutable. Tree. Node) e. next. Element(); System. out. println(n. get. User. Object()+" "); } } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 9

Exemple : un arbre de classes n Dans cette application, on entre un nom de classe dans la zone de texte, et la classe s’insère dans la hiérarchie des classes. n La classe Class permet de connaître la classe mère. n On n’insère une classe que si elle n’est pas déjà dans l’arbre. Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée Java AWT 10

Constructeur de l’arbre Java AWT class Class. Tree. Frame extends JFrame implements Action. Listener { private Default. Mutable. Tree. Node root; private Default. Tree. Model model; private JTree tree; private JText. Field text. Field; public Class. Tree. Frame() { set. Title("Class. Tree"); root = new Default. Mutable. Tree. Node(Object. class); model = new Default. Tree. Model(root); tree = new JTree(model); add. Class(get. Class()); get. Content. Pane(). add(new JScroll. Pane(tree), "Center"); text. Field = new JText. Field(); text. Field. add. Action. Listener(this); get. Content. Pane(). add(text. Field, "South"); }. . . } n C’est add. Class(Class c) qui fait l’insertion Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 11

Java AWT Ajouter une classe public Default. Mutable. Tree. Node add. Class(Class c) { if (c. is. Interface() || c. is. Primitive()) return null; pas les interfaces find. User. Object(c) cherche c dans tree Default. Mutable. Tree. Node node = find. User. Object(c); if (node != null) return node; Class s = c. get. Superclass(); classe mère Default. Mutable. Tree. Node parent = add. Class(s); appel récursif Default. Mutable. Tree. Node new. Node = new Default. Mutable. Tree. Node(c); model. insert. Node. Into(new. Node, parent. get. Child. Count()); à la fin développe l’arbre pour que le noeud soit visible Tree. Path path = new Tree. Path(model. get. Path. To. Root(new. Node)); tree. make. Visible(path); return new. Node; } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 12

Trouver un noeud dans un arbre n Un simple parcours, en largeur par exemple Java AWT public Default. Mutable. Tree. Node find. User. Object(Object obj) { Enumeration e = root. breadth. First. Enumeration(); while (e. has. More. Elements()) { Default. Mutable. Tree. Node node = (Default. Mutable. Tree. Node) e. next. Element(); if (node. get. User. Object(). equals(obj)) return node; } return null; } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 13

Lire le nom de la classe n Java AWT On fait confiance à Java. . . public void action. Performed(Action. Event event) { String text = text. Field. get. Text(); try { Class c = Class. for. Name(text); essayons add. Class(c); text. Field. set. Text(""); } catch (Class. Not. Found. Exception e) { Toolkit. get. Default. Toolkit(). beep(); si la classe n’existe pas } } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 14
- Slides: 14