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 :

JTree et TreeSelectionListener


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut JTree et TreeSelectionListener
    Bonjour à tous,

    J'ai un JTree qui va me servir de menu et je voudrai ajouter un écouteur sur chaque noeud qui ouvrira une InternalFrame dans ma frame principal. J'ai trouvé la méthode TreeSelectionListener et j'arrive bien à affecter une action à chacun des élements mais je trouve mon code un peu "sale" dans la mesure où j'identifie le nooeud selectionnée par rapport à son contenu (beurk). Je voudrai si on peut affecter une action ou un objet dès la création de l'arbre. Je débute en java alors j'ai encore un peu de mal à être vraiment efficace dans mon développement.

    Un petit bout de code pour illustrer :

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    public class tree extends JPanel{
     
     	JTree arbre;
    	JPanel panel_menu=new JPanel();
    	//public static InternalFramePays Pays=new InternalFramePays();
     
     
    	//Constructeur
    	public tree(){
     
    	DefaultMutableTreeNode rootNode=new DefaultMutableTreeNode("MaRacine");	
    	//Partie administration
    	DefaultMutableTreeNode childNode=new DefaultMutableTreeNode("Administration");	
    	rootNode.add(childNode);
    	DefaultMutableTreeNode childNode2=new DefaultMutableTreeNode("Pays/Entités");
    	childNode.add(childNode2);
    	//childNode2.setUserObject(new JInternalFrame(Pays) );
    	childNode2=new DefaultMutableTreeNode("Piste d'audit");
    	childNode.add(childNode2);
    	childNode2=new DefaultMutableTreeNode("Sécurités");
    	childNode.add(childNode2);	
     
                //Etc...
     
     
    	arbre=new JTree(rootNode);
     
    	//expension en 1 click
    	arbre.setToggleClickCount(1);
    	arbre.setVisible(true);
    	//On masque le noeud racine (inutile)
    	arbre.setRootVisible(false);
     
     
    	arbre.addTreeSelectionListener(new TreeSelectionListener(){
    		public void valueChanged(TreeSelectionEvent t){
    		    TreePath chemin=arbre.getSelectionPath();
    		    String menu=""+chemin;
    		     String selectedNode=""+(DefaultMutableTreeNode)chemin.getLastPathComponent();
     
                                          //C'est la que c'est moche!!!!!!!!!!
    			if (selectedNode.equals("Pays/Entités")){
    				InternalFramePays();
    			}
    			if (selectedNode.equals("Piste d'audit")){
    				InternalFrameAudit();
    			}
    			//Idem pour chaque autre noeud				       }
    		});
     
    		panel_menu.setBackground(Color.white);
    		panel_menu.add(arbre);
    		panel_menu.setBounds(new Rectangle(0,0,30,200));		
    		this.add(panel_menu);
     
    	}
     
     
    	//Ouvre les InternalFrame dans le DesktopPane de la frame principal
    	void InternalFramePays(){
    		InternalFramePays I=new InternalFramePays (); 
     
    		//On les ajoute au desktopPane
    		test_menu.dp.add(I);	
    	}
     
    	void InternalFrameAudit(){
    		JInternalFrame internalFrame = new JInternalFrame() ;
    		internalFrame.setTitle("Piste d'audit");
    		internalFrame.setSize(new Dimension(200,200)) ; 
    		internalFrame.setVisible(true) ;	
    		internalFrame.setClosable(true);
    		internalFrame.setMaximizable(true);
    		internalFrame.setIconifiable(true);
    		internalFrame.setResizable(true); 
     
    		//On les ajoute au desktopPane
    		test_menu.dp.add(internalFrame);
    	}
     
     
    	//Etc.....
    }

    Voila j'espere avoir été clair dans mon explication. Autrement dit je voudrai dès la création de mon arbre dire :" Pour le noeud pays j'affecte telle fonction ou tel object que je récupere lors du clic, etc...", un genre de champ caché en fait.

    Ma question est de savoir aussi si le jeux en vaut vraiment la chandelle, si c'est pour passer une semaine de dev sur la propreté du code...

    Si vous avez des remarques , des suggestion, je suis tout ouie!
    Merci d'avance

  2. #2
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Tu peux attacher autre chose qu'une String lors de la création d'un DefaultMutableTreeNode, par exemple une classe NodeInfo et définir les actions à entreprendre au sein de cette classe et de ses sous-classes.
    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
    abstract class NodeInfo {
     
      String label;
      NodeInfo(String label) {
        this.label = label;
      }
     
      public String getLabel() {
        return label;
      }
      ...
     
      public abstract selectionPerformed(TreeSelectionEvent tse);
      public abstract mouseActionPerformed(MouseEvent me);
      ...
    }
     
    DefaultMutableTreeNode rootNode=new DefaultMutableTreeNode(new NodeInfo("MaRacine") {
      public selectionPerformed(TreeSelectionEvent tse) {
       ...
      }
      public mouseActionPerformed(MouseEvent me) {
       ...
      }
    });
     
    DefaultMutableTreeNode childNode=new DefaultMutableTreeNode(new NodeInfo("Administration") {
      public selectionPerformed(TreeSelectionEvent tse) {
       ...
      }
      public mouseActionPerformed(MouseEvent me) {
       ...
      }
    });
     
    DefaultMutableTreeNode childNode=new DefaultMutableTreeNode(new NodeInfo("Pays/Entités") {
      public selectionPerformed(TreeSelectionEvent tse) {
       InternalFramePays();
      }
      public mouseActionPerformed(MouseEvent me) {
       ...
      }
    });
     
    arbre.addTreeSelectionListener(new TreeSelectionListener() {
      public void valueChanged(TreeSelectionEvent tse) {
        TreePath chemin = arbre.getSelectionPath();
        DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)chemin.getLastPathComponent();
        NodeInfo userObject = (NodeInfo) selectedNode.getUserObject();
        userObject.selectionPerformed(tse);
      }
    });

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut
    Génial!
    Réponse simple et efficace, merci beaucoup Hervé!

    @ bientôt.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut
    Tout marche bien. Mais j'ai encore une petite question à poser.
    Pour chaque noeuds j'ai suivi ce que tu avais dit, le souci c'est que à l'affichage ce n'est pas le nom du noeud qui apparait, c'est un truc du genre "tree$ 1 @1564" à la place du nom donné, par exemple "pays".

    Comment utiliser l'accesseur String Label dans ce cas de figure?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    //A l'affichage on ne verra pas "Test" mais tout un tas de caractères
    childNode2=new DefaultMutableTreeNode(new NodeInfo("Test"){
    	public void selectionPerformed(TreeSelectionEvent tse){
    		InternalFramePays(); 
    	   }
     
    	});

  5. #5
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    En redéfinissant la méthode toString() de la classe NodeInfo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    abstract class NodeInfo {
    ..
      public String toString() {
        return label;
      }
    }

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut
    Alors voila ce que j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    childNode2=new DefaultMutableTreeNode(new NodeInfo("Pays").getLabel(){
        public void selectionPerformed(TreeSelectionEvent tse){
        InternalFramePays(); 
    	}	
     });

    La methode getLabel me retourne (normalement) le nom. Mais j'ai un message d'erreur ')' expected juste apres le getLabel() . Or je ne peux pas fermer la parenthèse a ce moment...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JTree] rafraichissement
    Par nurn dans le forum Composants
    Réponses: 12
    Dernier message: 29/07/2005, 14h41
  2. Réponses: 3
    Dernier message: 17/05/2005, 11h16
  3. [JTree]problème de rafraichissement
    Par peppena dans le forum Composants
    Réponses: 9
    Dernier message: 20/01/2004, 14h06
  4. [JTree]redimensionnement d'un noeud
    Par grishka dans le forum Composants
    Réponses: 4
    Dernier message: 10/04/2003, 14h33
  5. [JTree] Ouvrir/Fermer l'ensemble des noeuds
    Par Math_Caen dans le forum Composants
    Réponses: 3
    Dernier message: 07/04/2003, 14h01

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