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 :

Redirection dans un JTree


Sujet :

Composants Java

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2015
    Messages : 39
    Points : 50
    Points
    50
    Par défaut Redirection dans un JTree
    Bonjour,
    J'ai décidé de poster sur le forum, car après de nombreuses recherche je n'ai toujours pas trouver sur internet.
    Je possède un JTree avec des choses dedans classé par ordre alphabétique. Je souhaiterais que lorsque je suis sur mon arbre et qu'avec mon clavier je tape sur la lettre "S" l'arbre me rapproche des premiers objets comprenant un "S".

    J'espère avoir été assez claire sinon n'hésitez pas à me le faire remarquez.
    Merci d'avance !

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Salut Kewty,

    tu devrais regarder du coté des entrées clavier.

    Tu récupères la touche "pressée" et tu fais une recherche sur les noms des nœuds de ton arbre en fonction de cette lettre.

    J'ai pas le nom des interfaces et compagnie en tête, mais tu devrais trouver assez facilement.

    bien à toi.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2015
    Messages : 39
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par ardard Voir le message
    Salut Kewty,

    tu devrais regarder du coté des entrées clavier.

    Tu récupères la touche "pressée" et tu fais une recherche sur les noms des nœuds de ton arbre en fonction de cette lettre.

    J'ai pas le nom des interfaces et compagnie en tête, mais tu devrais trouver assez facilement.

    bien à toi.
    Merci de ta réponse, je vais regarder et poster ma réponse si j'arrive à le faire

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2015
    Messages : 39
    Points : 50
    Points
    50
    Par défaut
    De retour !
    J'arrive à recupérer mon noeud en appuyant sur une touche du clavier comme ceci :
    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
                public void keyPressed(KeyEvent e) {
                    String pressKeyboard = String.valueOf(e.getKeyChar());
                    String myWord = null;
                    ITreeNode myNode = null;
                    try {
                        List<String> sourceList = deviceSource.getSourceList();
                        for (String source : sourceList) {
                            if (source.startsWith(pressKeyboard)) {
                                String[] split = source.split(ISourceDevice.DEFAULT_SEPARATOR);
                                myWord = split[0];
                                break;
                            }
                        }
                        if (myWord != null) {
                            ITreeNode rootNode = deviceTree.getRootNode();
                            if (rootNode != null) {
                                List<ITreeNode> children = rootNode.getChildren();
                                for (ITreeNode node : children) {
                                    if (node.getName().equals(myWord)) {
                                        myNode = node;
                                        break;
                                    }
                                }
    			System.out.println("myNode = " + myNode); 
                            }
                        }
                    } catch (SourceDeviceException e1) {
                        e1.printStackTrace();
                    }
                }
    Cependant maintenant que j'ai le ITreeNode, je vois pas comment faire pour rediriger et sélectionner automatiquement ce noeud. J'ai essayé avec la methode suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TreePath path = new TreePath(myNode);
    tree.setSelectionPath(path );
    tree.scrollPathToVisible(path );
    Mais ça fonctionne pas... Une idée ? Merci d'avance.

  5. #5
    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,

    Il y a plusieurs choses à prendre en compte :

    1. le TreePath doit "lister" tous les nœuds du chemin, pas seulement la feuille (il pourrait y avoir plusieurs branches avec la "même" feuille)
    2. il y a déjà un comportement par défaut similaire à ce que tu as implémenté, seulement il ne descend pas dans les nœuds non ouverts. Il faut supprimer ce comportement sinon il va interférer.
    3. Attention à toujours chercher après le "suivant" actuellement sélectionné, sinon on trouve forcément le courant s'il commence par la même lettre. A moins que tu ne veuilles chercher qu'à partir du "premier" (donc à partir de la racine).
    4. penser à la casse (en général, on appuie sur une touche en minuscule, alors que la première lettre des textes de l'arbre est peut-être en majuscule



    Exemple :
    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    public class JTreeSelectionExample {
     
    	public static void main(String[] args) throws IOException {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JTree tree = new JTree(createTree());
    		tree.setScrollsOnExpand(true);
    		tree.setRootVisible(false);
    		tree.setShowsRootHandles(true);
     
    		for(KeyListener keyListener : tree.getKeyListeners()) {
    			tree.removeKeyListener(keyListener);
    		}
    		tree.addKeyListener(createKeyListener(tree));
     
    		frame.add(new JScrollPane(tree));
     
    		frame.setSize(600, 400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	private static KeyListener createKeyListener(JTree tree) {
    		return new KeyAdapter() {
     
    			@Override
    			public void keyPressed(KeyEvent e) {
     
    				char c = e.getKeyChar();
     
    				TreeNode node;
    				TreePath current = tree.getSelectionPath();
    				if( current==null ) {
    					node = (TreeNode) tree.getModel().getRoot();
    				}
    				else {
    					node = getNextSibling((TreeNode) current.getLastPathComponent());
    					if ( node==null ) {
    						node = (TreeNode) tree.getModel().getRoot();
    					}
    				}
     
    				TreeNode nextNode = getNextNode(node, c);
    				if( nextNode==null ) {
    					nextNode = getNextNode((TreeNode)tree.getModel().getRoot(), c);
    				}
    				if( nextNode==null ) {
    					return;
    				}
     
    				TreePath path = createTreePath(nextNode);
    				tree.setSelectionPath(path);
    				tree.scrollPathToVisible(path);
     
    			}
     
    			private TreePath createTreePath(TreeNode node) {
    				Deque<TreeNode> stack = new ArrayDeque<>();
    				while(node!=null) {
    					stack.push(node);
    					node=node.getParent();
    				}
    				return new TreePath(stack.toArray());
    			}
     
    			private TreeNode getNextSibling(TreeNode node) {
    				TreeNode parent = node.getParent();
    				while ( parent!=null ) {
    					int index = parent.getIndex(node)+1;
    					if ( index<parent.getChildCount() ) {
    						return parent.getChildAt(index);
    					}
    					node = parent;
    					parent = node.getParent();
    				}
    				return null;
    			}
     
    			private TreeNode getNextNode(TreeNode node, char c) {
    				return getNextNode(node, c, true);
    			}
     
    			private TreeNode getNextNode(TreeNode node, char c, boolean nextSibling) {
     
    				if ( match(node,c) ) {
    					return node;
    				}
    				for(int i=0; i<node.getChildCount(); i++) {
    					TreeNode child =  getNextNode(node.getChildAt(i), c, false);
    					if (  child!=null ) {
    						return child;
    					}
    				}
     
    				if (nextSibling) {
    					TreeNode parent = node.getParent();
    					while ( parent!=null ) {
    						int index = parent.getIndex(node)+1;
    						for(int i=index; i<parent.getChildCount(); i++) {
    							TreeNode child =  getNextNode(parent.getChildAt(i), c, false);
    							if (  child!=null ) {
    								return child;
    							}
    						}
    						node = parent;
    						parent = node.getParent();
    					}
    				}
     
    				return null;
     
    			}
     
    			private boolean match(TreeNode node, char c) {
    				String s = node.toString();
    				return !s.isEmpty() && Character.toLowerCase(s.charAt(0))==Character.toLowerCase(c);
    			}
     
    		};
    	}
     
    	private static MutableTreeNode createTree() throws IOException {
     
    		DefaultMutableTreeNode root = new DefaultMutableTreeNode("");
    		createTree(root,FileSystemView.getFileSystemView().getHomeDirectory().toPath(),2);
    		return root;
     
    	}
     
    	private static void createTree(DefaultMutableTreeNode parent, Path dir, int depth) throws IOException {
    		StreamSupport.stream(Files.newDirectoryStream(dir).spliterator(),false)
    				             .map(path-> createNode(path, depth))
    				             .forEach(parent::add);
    	}
     
    	private static MutableTreeNode createNode(Path path, int depth) {
    		FileNode node = new FileNode(path);
    		if( depth>0 && Files.isDirectory(path) ) {
    			try {
    				createTree(node, path, depth-1);
    			} catch (IOException e) {
    				// ignore
    			}
    		}
    		return node;
    	}
     
     
    	private static class FileNode extends DefaultMutableTreeNode {
     
    		public FileNode(Path path) {
    			super(path.getFileName());
    		}
     
    	}
     
    }
    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.

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2015
    Messages : 39
    Points : 50
    Points
    50
    Par défaut
    Parfait merci de m'avoir aider je m'en suis presque sortie ça devrais le faire

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

Discussions similaires

  1. Redirection dans un fichier
    Par radium dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 09/08/2005, 14h45
  2. [JTree] Problème d'ouverture de chemin dans un JTree
    Par antares24 dans le forum Composants
    Réponses: 2
    Dernier message: 11/03/2005, 08h18
  3. Surligner une branche dans un JTree
    Par djangers dans le forum Composants
    Réponses: 3
    Dernier message: 22/06/2004, 14h46
  4. Trouver les redirections dans des traces
    Par severine dans le forum Développement
    Réponses: 3
    Dernier message: 21/04/2004, 18h51
  5. [JTree]noeud parent dans un jtree
    Par wassimb dans le forum Composants
    Réponses: 5
    Dernier message: 22/03/2004, 14h06

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