Faire des categories avec un JTree

Faire des categories avec un JTree - Java - Programmation

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 :love: ), 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

Reply

Marsh Posté le 24-05-2004 à 14:32:21   

Reply

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?

Reply

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.


Message édité par pascal34 le 24-05-2004 à 16:49:55
Reply

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)

Reply

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...
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)


 
Tu mélange un peux tout.

  • TreeModel, c'est l'interface par laquelle un JTree communique avec un modèle pour savoir comment se construire (noeuds, sous-noeuds, etc., neouds feuilles). TreeModel représente l'arbre au niveau global.
  • TreeNode, c'est une interface qui représente un noeud dans l'arbre (noeud simple ou noeud feuille). TreeNode représente l'arbre à un niveau local restreint à lui-même et ses noeuds enfants s'il en a.


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.

Reply

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 :
  1. public class Category extends TreeNode
  2. private String name;
  3. private ArrayList subcategories=new ArrayList();
  4. public Category(name)
  5. {
  6. this.name=name;
  7. }
  8. public addSubCat(String name)
  9. {
  10. this.subcategories.add(new Category(name))
  11. }


 
C'est barbare, ou ca pourrait etre la bonne voie?
 

Reply

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.


Message édité par pascal34 le 24-05-2004 à 21:38:05
Reply

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  :D  
 
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 :hello:  
 

Reply

Marsh Posté le 24-05-2004 à 22:14:43    

je te préviens tout de suite : tu ne m'enculeras pas !


---------------
trainoo.com, c'est fini
Reply

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 :sweat:

Reply

Marsh Posté le 24-05-2004 à 22:21:43   

Reply

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... :lol:  
 
C'etait une marque d'affection  ;)  
 
ok j'arrete  :whistle:

Reply

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  :pt1cable:  
 
 
Comme on dit , la nuit porte conseil  :jap:

Reply

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 ?

Reply

Marsh Posté le 25-05-2004 à 08:49:36    

oui, c'est ca.
 
Ca pose problème?

Reply

Marsh Posté le 25-05-2004 à 09:47:09    

spitagor a écrit :

oui, c'est ca.
 
Ca pose problème?


 
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.

Reply

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
 
 :)

Reply

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  :lol:  
 
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.


Message édité par pascal34 le 25-05-2004 à 14:25:42
Reply

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 :D  
 
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...

Reply

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 ?

Reply

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...
 

Reply

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

Reply

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 :pt1cable: , 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?

Reply

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 :pt1cable: , 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?


 
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.

Reply

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 :??:

Reply

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 :
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <categories>
  3. <category id="0" name="Capteurs">
  4.  <category id="10" name="Capteurs de températures">
  5.   <category id="100" name="Capteurs de températures en degrés celcius">
  6.    <object id="1000" name="MonCapteurEnDegré1" file="c:\apps\sensors\degree1.ser"/>
  7.    <object id="1001" name="MonCapteurEnDegré2" file="c:\apps\sensors\degree2.ser"/>
  8.   </category>
  9.   <category id="101" name="Capteurs de températures en degrés Farenheit">
  10.    ...
  11.   </category>
  12.  </category>
  13.  <category id="11" name="Autres Capteurs">
  14.   ...
  15.  </category>
  16. </category>
  17. </categories>


 
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)

Reply

Marsh Posté le 26-05-2004 à 18:34:07    

ok :pt1cable:  
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...

Reply

Marsh Posté le 27-05-2004 à 09:02:33    

spitagor a écrit :

ok :pt1cable:  
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...


 
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.  :jap:


Message édité par pascal34 le 27-05-2004 à 09:06:03
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed