IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

Problème sur la insertNodeInto


Sujet :

Composants Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 16
    Points : 6
    Points
    6
    Par défaut Problème sur la insertNodeInto
    Bonjour à tous et à toutes.

    J'ai un souci sur mon JTree.

    J'appelle le insertNodeInto du DefaulTreeModel et mon noeud est bien ajouté à l'arbre mais il se place à la fin et non à l'indice indiqué.
    Pourtant le getIndexOfChild me renvoie bien la bonne valeur, je suis un peu perdu.

    D'avance merci ^^

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Donne-nous tout le code d'insertion, avec en particulier la valeur d'index et comment tu la détermine, sans quoi difficile de te réponde.

    Voici un POC qui fonctionne, si ça peut t'aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    public class JTreeDemo {
     
    	private final static AtomicInteger IDFACTORY = new AtomicInteger();
     
    	public static void main(String[] args) {
     
    		final JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		final DefaultMutableTreeNode root = new DefaultMutableTreeNode("ROOT");
    		final DefaultTreeModel model = new DefaultTreeModel(root);
    		final JTree jtree = new JTree(model);
     
    		final JButton buttonAdd = new JButton("Add");
    		final JButton buttonInsert = new JButton("Insert");
     
    		frame.add( jtree );
    		frame.add( buttonAdd, BorderLayout.NORTH);
    		frame.add( buttonInsert, BorderLayout.SOUTH);
     
    		buttonAdd.addActionListener(e-> add(jtree, model));
    		buttonInsert.addActionListener(e-> insert(jtree, model));
     
    		jtree.setSelectionPath(new TreePath(root));
     
    		frame.setSize(300, 300);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
     
    	}
     
    	private static void add(JTree jtree, DefaultTreeModel model) {
    		final TreePath selectedPath = jtree.getSelectionPath();
    		final DefaultMutableTreeNode node = (DefaultMutableTreeNode)selectedPath.getLastPathComponent();
    		final DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("NODE " + IDFACTORY.getAndIncrement());
    		model.insertNodeInto(newNode, node, node.getChildCount());
    		jtree.expandPath(new TreePath(node.getPath())); 
    	}
     
    	private static void insert(JTree jtree, DefaultTreeModel model) {
    		final TreePath selectedPath = jtree.getSelectionPath();
    		final DefaultMutableTreeNode node = (DefaultMutableTreeNode)selectedPath.getLastPathComponent();
    		final DefaultMutableTreeNode parent = (DefaultMutableTreeNode)node.getParent();
    		final DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("NODE " + IDFACTORY.getAndIncrement());
    		if ( node.getParent()!=null ) {
    			model.insertNodeInto(newNode, parent, parent.getIndex(node));
    		}
    		else {
    			JOptionPane.showMessageDialog(jtree, "Impossible d'insérer ici");
    		}
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Oula ça va pas être simple vu la tête de la classe le code utile est pas super centralisé :/

    En gros, dans mon test j'ai un arbre avec une racine qui s'appelle "écrans" et dedans 5 feuilles.

    Je fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_TreeModel.insertNodeInto(newNode, parent, index);
    m_TreeModel c'est bien le modèle de mon JTree, parent c'est bien le noeud "écrans", new Node c'est le noeud à ajouter qui est créé précédemment (je ne met pas le code parce-que c'est que des sous classes à nous) et index vaut 3.

    si suite à cette appel je fais genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(m_TreeModel.getIndexOfChild(parent,newNode));
    ça me renvoie bien 3, mais mon noeud est en dernière position quand même.
    Au début je pensais que c'était du à un code ultérieur, mais en mettant un breakpoint, j'ai bien vu que non, dès le insertNodeInto, c'est mal placé.
    ça pourrait venir de l'instanciation de NewNode ?

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par jctransler Voir le message
    ça pourrait venir de l'instanciation de NewNode ?
    Non, je ne pense pas, mais ça peut venir de l'implémentation de TreeNode. C'est une implémentation custom ou standard (genre DefaultMutableTreeNode) ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    C'est du Custom qui hérite de DefaulMutableTreeNode.
    Par contre ça implémente Comparable, ça peut venir de là, mais ça me parait bizarre quand même, spécifier explicitement un indice devrait suffire à outrepasser l'ordre du comparable non ?

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Et dans cette implémentation custom, insert() a été redéfinie ? On peut voir le code ? En quoi intervient le Comparable ? Si ça impose un ordre de tri des nodes dans leur parent, c'est normal que l'insertion à un index particulier n'a pas l'effet forcément d'insérer à cet endroit.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Nom pas de redéfinition d'insert()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    @SuppressWarnings("serial")
    public class DMTNOrdered extends DefaultMutableTreeNode implements Comparable<DMTNOrdered>{
     
    	public DMTNOrdered(Object user) {
    		super(user);
    	}
     
    	protected Integer prefix = new Integer(-1);
     
    	public Integer getPrefix() {
    		return prefix;
    	}
     
    	public void setPrefix(int pP) {
    		prefix = pP;
    	}
     
    	public static DMTNOrdered sort(DMTNOrdered node, boolean isRecursive) {
    		//System.out.println("TRIE SUR LE NODE : " + node.getUserObject());
     
    		ArrayList<DMTNOrdered> children = new ArrayList<DMTNOrdered>();
    		//On parcours les enfants du node, avec recursivité
    		//On ajoute les enfant à la List
    		for(int i=0,c=node.getChildCount();i<c;i++) {
    			DMTNOrdered child = (DMTNOrdered)node.getChildAt(i);
    			if(child.getChildCount() > 0 && isRecursive) {
    	            sort(child, true);
    	        }
     
    			children.add(child);
    		}
     
    		//Tri de la liste (utilisant le compareTo)
    		Collections.sort(children);
     
    		//On ajoute au node ses enfants
    		for(int i=0,c=children.size();i<c;i++) {
    			node.add(children.get(i));
    		}
     
    		return node;
    	}
     
    	@Override
    	public int compareTo(DMTNOrdered o) {
    		return getPrefix().compareTo(o.getPrefix());
    	}
    }
    En gros on utilise un numéro caché (prefix) pour définir l'ordre ça vient surement de là sur coup. J'aurai pensé que le tri devait être explicitement appelé pour que ça ait une influence

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Normalement, il n'y a pas de tri implicite : tu es sûr que la méthode sort() n'est pas appelée quelque part (de manière évènementielle par exemple). Si tu décommentes la trace qu'il y a au début, on la voit ou pas lors de l'insertion...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Non on ne la vois pas

  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Et le modèle ? Custom ou DefaultTreeModel ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    DefaultTreeModel

  12. #12
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Pas d'autres idées...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Pas grave, merci quand même, j'ai gagné en compréhension ^^

Discussions similaires

  1. Problème sur la recherche fulltext en v4 !
    Par poppa dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/05/2004, 23h06
  2. Problème sur fiche MDIchild
    Par nivet dans le forum Composants VCL
    Réponses: 6
    Dernier message: 23/01/2004, 08h07
  3. Problème sur GetPrivateProfileString ???
    Par Bordelique dans le forum Langage
    Réponses: 7
    Dernier message: 25/06/2003, 22h15
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo