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] Problème d'ouverture de chemin dans un JTree


Sujet :

Composants Java

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 14
    Points : 11
    Points
    11
    Par défaut [JTree] Problème d'ouverture de chemin dans un JTree
    Bonjour,

    Je viens de créer un JDialog contenant l'arborscence de windows. Ce JDialog n'affiche que les répertoires. Ce qui me permet dans d'autres applications, de lancer ce JDialog, et de récupérer le répertoire choisi par l'utilisateur.

    Le listing des sous-répertoires ne se fait qu'à l'ouverture du répertoire sélectionné ( treeExpanded() ), ce qui permet d'accélérer l'affichage des sous dossiers.

    Le problème est que je veux pouvoir lors de l'initialisation de cette arbre, lui faire ouvrir un chemin particulier : par exemple le dernier chemin que l'utilisateur a choisi.

    voici mon code :
    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
    public final class DirectoryChooser	extends JDialog	implements TreeExpansionListener, ActionListener {
     
    	public static final int WIDTH = 400;
    	public static final int HEIGHT = 340;
    	private DefaultMutableTreeNode iRoot;
    	private JTree iDirectoryTree;
    	private String iSelectedDirectory;
    	private JButton okButton;
     
    	/**
             * Il faut d'abord créer une instance de DirectoryChooser.
             * Ensuite appliquer la méthode show() à cette instance.
             * Et enfin, appliquer la méthode getSelectedDirectory().
             * 
             * @param Frame owner
             * @param boolean allowCreate
             */
    	public DirectoryChooser(Frame owner) {
    		super(owner, "Directory Chooser", true);
    		try {
    			UIManager.setLookAndFeel(
    				"com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		} catch (InstantiationException e) {
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			e.printStackTrace();
    		} catch (UnsupportedLookAndFeelException e) {
    			e.printStackTrace();
    		}
    		SwingUtilities.updateComponentTreeUI(this);
     
    		iRoot = new DefaultMutableTreeNode("Directory");
    		iDirectoryTree = new JTree(iRoot);
    		iDirectoryTree.setExpandsSelectedPaths(true);
    		Container container = getContentPane();
    		container.setLayout(new BorderLayout());
    		JLabel label = new JLabel("Sélectionner un répertoire SVP.");
    		label.setPreferredSize(new Dimension(110, 20));
    		okButton = new JButton("ok");
    		JPanel buttonPanel = new JPanel();
    		okButton.addActionListener(this);
    		buttonPanel.add(okButton);
    		iDirectoryTree.setCellRenderer(new treeCellRenderer());
    		iDirectoryTree.addTreeExpansionListener(this);
    		constructTree();
    		container.add(label, "North");
    		container.add(new JScrollPane(iDirectoryTree), "Center");
    		container.add(buttonPanel, "South");
    		setSize(400, 340);
    		setLocation(200, 200);
    	}
     
    	/**
             * Permet de construire l'arbre des différents lecteurs
             */
    	private void constructTree() {
    		File directoryRoot[] = File.listRoots();
    		// J'ai supprimer le parcours du 1er lecteur (A:)
    		for (int i = 1; i < directoryRoot.length; i++) {
    			DefaultMutableTreeNode tempNode =
    				new DefaultMutableTreeNode(directoryRoot[i]);
    			foundSubDirectory(tempNode, directoryRoot[i]);
    			iRoot.add(tempNode);
    		}
     
    		iDirectoryTree.setModel(new DefaultTreeModel(iRoot));
    		SwingUtilities.updateComponentTreeUI(iDirectoryTree);
    	}
     
    	/**
             * Ajoute au noeud courrant les sous noeuds qu'il possède (ne va pas jusqu'au bout de la branche, mais
             * seulement au niveau N-1).
             * @param currentNode
             * @param directory
             */
    	private void foundSubDirectory(
    		DefaultMutableTreeNode currentNode,
    		File directory) {
    		File fileList[] = directory.listFiles();
    		if (fileList == null)
    			return;
    		for (int i = 0; i < fileList.length; i++)
    			if (fileList[i].isDirectory())
    				currentNode.add(new DefaultMutableTreeNode(fileList[i]) {
     
    				public String toString() {
    					return ((File) getUserObject()).getName();
    				}
     
    			});
     
    	}
     
    	public void treeCollapsed(TreeExpansionEvent treeexpansionevent) {}
     
    	public void treeExpanded(TreeExpansionEvent event) {
    		setCursor(new Cursor(3));
    		DefaultMutableTreeNode selectedNode =
    			(DefaultMutableTreeNode) event.getPath().getLastPathComponent();
    		for (int i = 0; i < selectedNode.getChildCount(); i++) {
    			DefaultMutableTreeNode childNode =
    				(DefaultMutableTreeNode) selectedNode.getChildAt(i);
    			if (childNode.isLeaf())
    				foundSubDirectory(childNode, (File) childNode.getUserObject());
    		}
     
    		setCursor(new Cursor(0));
    	}
     
    	public void actionPerformed(ActionEvent e) {
    		if (e.getSource() == okButton) {
    			Object selectedDirectory =
    				iDirectoryTree.getLastSelectedPathComponent();
    			if (selectedDirectory == null)
    				return;
    			this.iSelectedDirectory =
    				((File) ((DefaultMutableTreeNode) selectedDirectory)
    					.getUserObject())
    					.getAbsolutePath();
    			hide();
    			getParent().remove(this);
    		}
    	}
     
    	/**
             * Permet de récupérer le chemin du répertoire choisie
             * @return String
             */
    	public String getSelectedDirectory() {
    		return iSelectedDirectory;
    	}
    }
    La classe de rendu :
    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
    class treeCellRenderer extends DefaultTreeCellRenderer {
     
    	public Component getTreeCellRendererComponent(
    		JTree tree,
    		Object value,
    		boolean selected,
    		boolean expanded,
    		boolean leaf,
    		int row,
    		boolean hasFocus) {
    		if (leaf){
    			return super.getTreeCellRendererComponent(tree,value,selected,expanded,false,row,hasFocus);
    		}else
    			return super.getTreeCellRendererComponent(tree,value,selected,expanded,leaf,row,hasFocus);
    	}
     
    	treeCellRenderer() {
    	}
    }
    Et enfin l'appelle à cette classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DirectoryChooser chooser = new DirectoryChooser(jFrame);
    chooser.show();
    String cheminRep = chooser.getSelectedDirectory();
    Le problème est que si je passe le chemin que je veux ouvrir dans le constructeur, celui n'est pas pris en compte (l'affichage ne s'est pas encore fait).
    Si j'implémente les méthodes show() ou update(), elles ne sont même pas lancée lorsque je fait chooser.show() !!!! (D'ailleurs je comprends pas ce non plus).

    Merci de m'indiquer pourquoi et comment faire pour que mon JDialog s'ouvre avec un chemin dans l'arbre déjà ouvert.

    Ben

  2. #2
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 14
    Points : 11
    Points
    11
    Par défaut J'avance ...
    Bon, j'ai trouvé un peu plus pourquoi ca ne marchait pas, je me trompait dans l'utilisation du TreePath.

    C'est un exemple. Je veux afficher dans mon arbre le chemin pour le répertoire d'apache conteant les pages html.

    Ce n'est pas du tout optimisé mais ca me permet de débugger en même temps.

    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
     
    // Création du fichier
    File f1 = new File("C:\\Program Files\\Apache Group\\Apache2\\htdocs");
    StringTokenizer tk = new StringTokenizer(f1.getAbsolutePath());
    Enumeration enum;
    DefaultMutableTreeNode node = iRoot;
    StringBuffer lastPath = new StringBuffer();
    while(tk.hasMoreTokens()){
    	String temp = tk.nextToken("\\");
    	System.out.println("token :"+temp);
    	lastPath = lastPath.append(temp+"\\");
    	File file = new File(lastPath.toString());
    	enum = node.children();
    	while (enum.hasMoreElements()) {
    		DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) enum.nextElement();
    		if( ((File)treeNode.getUserObject()).getName() .equals(file.getName())) {
    			System.out.println("Equals");
    			node = treeNode;
    			if(!node.children().hasMoreElements())
    				foundSubDirectory(node,file);
    				while(enum.hasMoreElements()){
    					enum.nextElement();
    				}
    			}
    		}
    	}
    	if(node != iRoot){
    		paths = node.getPath();
    		TreePath path = new TreePath(paths);
    		iDirectoryTree.expandPath(path);
    		iDirectoryTree.setSelectionPath(path);
    		SwingUtilities.updateComponentTreeUI(iDirectoryTree);
    	}
    }
    Pour l'instant ca marche une fois que le JDialog est instancié (normale) mais aussi que le JDialog soit affiché.

    Autre remarque : Je fais un double While car mon arbre n'est pas créé avant. Donc si je cherche à étendre l'arbre jusqu'au noeud mais que celui-ci n'existe pas, ca ne va pas marche.


    Je vais chercher pour changer de répertoire avant d'afficher le JDialog.


    PS: J'espère que tout ce que j'ai dit est assez clair !! Sinon postez moi des questions !!!

    Ben

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Fini
    C'est bon, j'ai terminé.

    Pour que cela fonctionne, il vous suffit de reprendre le code du début et de rajouter ces deux variables de classes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	private boolean iSetDirectory = false;
    	private int iPositionDirectory = -1;
    Ensuite, vous implémentez la méthode update(g) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    /* (non-Javadoc)
     * @see java.awt.Component#update(java.awt.Graphics)
     */
    public void update(Graphics g) {
    	super.update(g);
    	if(iSetDirectory){
    		iDirectoryTree.scrollPathToVisible(iDirectoryTree.getPathForRow(iPositionDirectory));
    		iDirectoryTree.setSelectionRow(iPositionDirectory);
    	}
    }
    et enfin vous créez la méthode set pour définir le chemin :
    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
     
    /**
     * Permet de définir un répertoire pour l'ouverture du JDialog
     * @param pDirectory Le chemin du répertoire
     */
    public void setDirectory(String pDirectory) {
    	iSetDirectory = true;
    	StringTokenizer tk = new StringTokenizer(pDirectory);
    	Enumeration enum;
    	DefaultMutableTreeNode node = iRoot;
    	StringBuffer lastPath = new StringBuffer();
    	while (tk.hasMoreTokens()) {
    		String temp = tk.nextToken("\\");
    		lastPath = lastPath.append(temp + "\\");
    		File file = new File(lastPath.toString());
    		enum = node.children();
    		while (enum.hasMoreElements()) {
    			DefaultMutableTreeNode treeNode =
    				(DefaultMutableTreeNode) enum.nextElement();
    			if (((File) treeNode.getUserObject())
    				.getName()
    				.equals(file.getName())) {
    				node = treeNode;
    				if (!node.children().hasMoreElements())
    					foundSubDirectory(node, file);
    				while (enum.hasMoreElements()) {
    					enum.nextElement();
    				}
    			}
    		}
    	}
    	if (node != iRoot) {
    		TreeNode[] nodes = node.getPath();
    		TreePath path = new TreePath(nodes);
    		iDirectoryTree.expandPath(path);
    		iPositionDirectory = iDirectoryTree.getRowForPath(path);
    	}
    }
    N'hésitez pas si vous avez des questions.

    Ben

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

Discussions similaires

  1. problème d'ouverture des infobulles dans safari
    Par pascalbtb dans le forum IGN API Géoportail
    Réponses: 10
    Dernier message: 20/01/2013, 23h57
  2. NFCDemo: problème d'ouverture du lien dans un navigateur
    Par Pico_info dans le forum Android
    Réponses: 0
    Dernier message: 18/04/2012, 12h07
  3. Problème pour placer un chemin dans une variable
    Par steph70 dans le forum Tkinter
    Réponses: 2
    Dernier message: 06/03/2009, 17h48
  4. sélectionner un chemin dans un jtree
    Par selmaK dans le forum Composants
    Réponses: 0
    Dernier message: 23/11/2008, 17h01

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