Faire des categories avec un JTree - Java - Programmation
Marsh Posté le 24-05-2004 à 16:23:24
hem, pour poser une question plus précise, j'ai commencé par faire des classes Catégories et SousCategorie() pour les mettre dans l'arbre, est ce une bonne solution?
Marsh Posté le 24-05-2004 à 16:49:05
Si tu es dérouté par le nombre de méthodes dans DefaultTreeModel, regarde l'interface de base : TreeModel.
Ensuite que tu fasses ou non des classes Category et SousCategories dépend de ton architecture, pas du fait que tu vas utilser un JTree. Tu peux très bien afficher sous forme d'arbre des données qui n'ont rien d'arborescent.
De plus tu n'es pas obligé de dériver de DefaultTreeModel pour faire ton modèle, tu peux créer ta propre classe qui implémente TreeModel.
Marsh Posté le 24-05-2004 à 17:31:15
oui, mais en fait j'ai du mal a choisir entre faire mon JTree a partir d'un TreeNode, ou a partir d'un TreeModel...
Et le probleme, c'est que je veux que seules les feuilles d emon arbre contiennent des Objets Custom, et non pas les branches (qui seront de categories /sous categories)
Marsh Posté le 24-05-2004 à 18:59:40
spitagor a écrit : oui, mais en fait j'ai du mal a choisir entre faire mon JTree a partir d'un TreeNode, ou a partir d'un TreeModel... |
Tu mélange un peux tout.
Si tu remarques bien, Les méthodes d'un TreeModel travaillent avec des TreeNode.
Pour revenir à ton problème, tes catégories, sous-catégories et éléments terminaux, correspondent chacun à un TreeNode (Les classes correspondanes peuvent implémenter TreeNode). Tu devra avoir en plus une classe modèle qui implémente l'interface TreeModel pour renseigner le JTree de sa structure globale.
Marsh Posté le 24-05-2004 à 20:51:36
Ok, je commence a apprehender un peu mieux la question...
Donc dans tous les cas j'aurais des treenode dans mon tree (logique )
Mais je me pose une question : A chaque lancement de mon application, je vais chercher les feuilles de l'arbre (mes objets, en gros). Ces objets possèdent une catégorie (cette catégorie apparait obligatoirement dans l'arbre, puisque l'ajout/suppression de catégories se fait directement sur l'arbre). Seulement, chaque catégorie peut etre une sous catégorie d'une autre, et cela à l'infini...
Dans ce cas la, au moment de la création de mon arbre (puisque je vais le créer a chaque lancement de mon appli), comment "insérer" les Objets dans les bonnes categories?
Car, au pire, je peux prendre une Hashmap pour mapper les objets vers les catégories, mais comme je ne connais pas les "super-catégories", j'ai du mal a voir comment je vais pouvoir définir le "TreePath" jusqu'a mon objet...
La, je suis un peu bloqué sur ce problème, et j'ai du mal a voir comment m'en sortir, mais ca doit etre possible !!!
Merci pour vos reponses !
PS : je viens de penser a un truc : si je fais ca :
Code :
|
C'est barbare, ou ca pourrait etre la bonne voie?
Marsh Posté le 24-05-2004 à 21:37:26
Quand on considère une 'feuille' de ton arbre, tu dois bien savoir combien de catégories il y a au-dessus jusqu'à la racine avant d'afficher l'arbre. Sinon tu ne peux pas construire ton modèle !!!
Pour ce qui est des modifications, il faut toujours les faire sur le modèle. Tu peux mettre un menu contextuel sur les noeuds de l'arbre pour ajouter ou supprimer une catégorie Mais la modification induite par la selection d'un item du menu doit se faire sur le modèle et après faire un rafraichissement de l'arbre. Les modèles, que se soit pour un JTree ou un JList ou autre, servent à ça.
Marsh Posté le 24-05-2004 à 22:10:28
Citation : Quand on considère une 'feuille' de ton arbre, tu dois bien savoir combien de catégories il y a au-dessus jusqu'à la racine avant d'afficher l'arbre. Sinon tu ne peux pas construire ton modèle !!! |
Pas con
peut etre que le probleme se situe la effectivement...
Quand je crée mon objet, je lui donne une catégorie. Point...
Bon, je vais réflechir, merci bien
Marsh Posté le 24-05-2004 à 22:14:43
spitagor a écrit : nraynaud |
je te préviens tout de suite : tu ne m'enculeras pas !
Marsh Posté le 24-05-2004 à 22:21:43
Ben, non, vu que je crée mes catégories a partir de l'arbre...
ensuite, pour définir une catégorie, je choisis parmi toutes les catégories de l'arbre
Marsh Posté le 24-05-2004 à 22:25:53
nraynaud a écrit : je te préviens tout de suite : tu ne m'enculeras pas ! |
Tout de suite...
C'etait une marque d'affection
ok j'arrete
Marsh Posté le 24-05-2004 à 22:51:38
Bon, apres avoir réflechi, voila mon vrai problème il me semble :
J'ai des Objets avec des catégories
comment spécifier qu'un catégorie est la sous catégorie d'une autre
OU alors je suis en train de m'embrouiller
Comme on dit , la nuit porte conseil
Marsh Posté le 25-05-2004 à 08:27:17
Tu veux dire que les infos sur les catégories sont dans les objets sérialisés ?
Marsh Posté le 25-05-2004 à 09:47:09
spitagor a écrit : oui, c'est ca. |
Ben pas vraiment.
Sauf que pour pouvoir placer un objet dans ton arbre, il faut que tous les noeuds des catégories au dessus soient placées d'abord.
En terme de JTree/Modèle, le JTree commence à se construire depuis la racine vers les feuilles.
Ca implique donc que tu lises tous les objets sérialisés pour en extraire toutes les catégories, les hiérarchiser, et les fournir au JTree par l'intermédiaire du modèle.
Le JTree appelle getRoot() sur le modèle en premier, puis demande au modèle le nombre de noeud sous la racine, puis demande au modèle chaque noeud qu'il doit placer et recommence ainsi sur chaque noeud sous la racine qu'il vient de placer. Il arête de construire une branche quand isLeaf() renvoie true (c'est un noeud feuille donc sans enfant).
Cependant, je crois que le JTree ne charge pas toutes les noeuds du modèle en une seule fois (consommation mémoire). Il demande seulement les noeuds dont il a besoin pour s'afficher correctement la première fois. Ensuite c'est quand tu déploie un sous-niveau qui n'a jamais été chargé qu'il interroge le modèle pour avoir les noeuds de cette branche.
Maintenant, tu peux intercepter les évènements d'expansion et de repliement de branche pour gérer les objets en mémoire.
Marsh Posté le 25-05-2004 à 09:56:29
ok, ok...
mais le problème est que je ne sais pas trop comment faire pour hierarchiser ces catégories, sacahtn qu'il peut y en avoir une infinité...
Merci en tout cas, je vais enccore réflechir
Marsh Posté le 25-05-2004 à 14:25:31
spitagor a écrit : ... qu'il peut y en avoir une infinité... |
T'es pas un peu marseillé toi, peuchère
Si tes objets contiennent les infos de catégorie mais que tu ne sais pas laquelle va aller sous quelle autre, c'est un problème de spécification et pas d'architecture ou de codage.
Marsh Posté le 25-05-2004 à 14:35:00
effectivement, je suis du Sud
quand je dis une infinité, ca veut dire 4 ou 5 niveaux maximum en fait
en fait, il me faudrait tout simplement une structure de données extensible pour stocker les categories... je vais voir du coté des listes chainées...
Marsh Posté le 25-05-2004 à 15:10:41
Un objet sérialisé contient-il seulement le nom de la catégorie à laquelle il est rattaché ou toute la liste jusqu'à la racine de l'arbo ?
Marsh Posté le 25-05-2004 à 15:29:22
ca m'arrangerai si il connaissait la list, mais malheureusement, lorsque je definis la categorie d'un composant, je donne juste son nom, et pas la liste des categories...
Marsh Posté le 25-05-2004 à 16:39:19
spitagor a écrit : ca m'arrangerai si il connaissait la list, mais malheureusement, lorsque je definis la categorie d'un composant, je donne juste son nom, et pas la liste des categories... |
Alors tu peux définir la hiérarchie des catégories dans une structure externe comme un fichier XML et t'en servir pour construire l'arbre
Marsh Posté le 25-05-2004 à 19:31:22
ok, mais is je prends un fichier XML , il faut bien pouvoir le construire /le modifier, donc je pense pour voir le faire avec un JTree , mais plus raisonnablement avec une JList de toutes les catégories, avec un bouton "ajouter une sous catégorie a cette catégorie"
ca me parait possible comme ca, tu as une autre idée?
Marsh Posté le 25-05-2004 à 19:44:59
spitagor a écrit : ok, mais is je prends un fichier XML , il faut bien pouvoir le construire /le modifier, donc je pense pour voir le faire avec un JTree , mais plus raisonnablement avec une JList de toutes les catégories, avec un bouton "ajouter une sous catégorie a cette catégorie" |
Je pense que je manque d'info pour réellement cerner ton problème.
A mon avis, ton principal problème est que tu ignores quasiment tout de la façon de ranger tes objets dans la hiérarchie de catégories car tu ignores combien tu en as et comment elle se rangent les unes par rapport aux autres.
Commence par résoudre ce problème en essayant de figer un peu la structure des catégories sinon tu t'en sortiras pas.
Marsh Posté le 25-05-2004 à 22:30:48
ok :
je pense que mon probleme peut etre pris a part pourtant :
Je voudrais simplement créer des categories dans mon JTree, c'est ca qui va définir mon architecture :
concretement j'aurais :
capteurs
|
|-capteurs de temperature
||
||-capteurs de temperature en degres Celsius
|||-moncapteurdetemperatureendegresC
|||-mon2emecapteurdetemperatureendegresC
||-capteurs de temperature en degres Farenheit
|||-moncapteurdetemperatureendegresF
||
etc...
Quand je lis mon dossier d'Objets sérialisés, je veux que ces Objets se placent au bon endroit dans l'arbre
d'ou la solution de xml pour sauvegarder cette architecture de catgories qui me parait pas mal, mais un peu lourde
Marsh Posté le 26-05-2004 à 10:54:05
Voilà !!!
C'est plus précis.
Dans le fichier XML tu fais qqch comme ça :
Code :
|
id= 0 correspond à la racine.
les id entre 10 et 99 correspondent aux éléments de niveau 2
les id entre 100 et 999 correspondent aux éléments de niveau 3
etc.
Les ids doivent être unique dans tou le xml.
Les attributs 'name' permettent d'avoir qqch à afficher pour les noeuds de l'arbre (voir DefaultTreeCellRenderer)
Marsh Posté le 26-05-2004 à 18:34:07
ok
Donc en fait, la mise a jour de l'arbre mettra a jour le fichier xml , qui sert lui meme a construire l'arbre au lancement de l'application si j'ai bien tout compris...
Marsh Posté le 27-05-2004 à 09:02:33
spitagor a écrit : ok |
Oui, enfin pas tout à fait.
Il te faut lire le fichier XML au démarrage avec JDom (c'est très bien foutu et plus simple que DOM ou SAX à utiliser), tu fais un TreeModel qui s'appuie sur l'arborescence de ton fichier XML.
Les ajouts ou suppression se font dans ton TreeModel qui répercute sur l'arborescence JDom de ton XML. Quand ton appli se termine, tu réécris le fichier XML à partir de l'arborescence XML de JDom.
Tu doit quand même gérer tes objets sérialisés hors du XML (le fichier XML ne fait que référence au chamin du fichier de l'objet sérialisé). Si tu supprimes un objet sérialisé, faut mettre à jour le fichier XML, etc.
Ca se fait pas tout seul quand même.
Marsh Posté le 24-05-2004 à 14:32:21
Bonjour
Mon but est de créer une librairie de composants. Ces composants sont stockés sur disque en tant que fichiers serialisés.
Je voudrais pouvoir classer ces composants dans des catégories, et je dois pouvoir rajouter/enlever des composants...
J'aurais des catégories par défaut. Mon problème est en fait d'insérer les comoposants en tant que noeuds dans l'arbre. exemple : j'ai un composant "capteur de temperature en degres", qui fait partie de la sous catégorie "capteur de temperature" , elle meme faisant partie de la catégorie "capteur".
J'ai lu le tutorial, mais cela reste encore obscur pour moi, alors si vou pouviez m'eclairer (nraynaud ), ca serait bien cool
Je sais qu'il va falloir faire un model (hérité de DefaultTreeModel), mais il y a d'autres interfaces qui permettent de savoir les "requirement" pour qu'un objet soit un noeud de l'arbre, et ca ca m'embrouille grave, je sais plus torp quoi utiliser...
Merci beaucoup