2017-07-24 3 views
0

Je suis nouveau à JTrees et une requête:Ajout DTree à JFileChooser

Si nous pouvons ajouter un tree des fichiers et des répertoires disponibles dans notre système JFileChooser. Fondamentalement, je veux avoir un JFileChooser personnalisé où les fichiers et les répertoires peuvent être affichés sous la forme de l'arbre.

Merci d'avance :)

J'ai créé un arbre qui prend les fichiers actuels de mon système, mais comment afficher cet arbre dans JFileChooser. Voici le code pour JTree

public class FileTree extends JPanel { 

/** Construct a FileTree */ 
    public FileTree(File dir) { 
    setLayout(new BorderLayout()); 

    // Make a tree list with all the nodes, and make it a JTree 
    JTree tree = new JTree(addNodes(null, dir)); 

    // Lastly, put the JTree into a JScrollPane. 
    JScrollPane scrollpane = new JScrollPane(); 
    scrollpane.getViewport().add(tree); 
    add(BorderLayout.CENTER, scrollpane); 
    } 

    /** Add nodes from under "dir" into curTop. Highly recursive. */ 
    DefaultMutableTreeNode addNodes(DefaultMutableTreeNode curTop, File dir) 
{ 
    String curPath = dir.getPath(); 
    DefaultMutableTreeNode curDir = new DefaultMutableTreeNode(curPath); 
    if (curTop != null) { // should only be null at root 
    curTop.add(curDir); 
    } 
    Vector ol = new Vector(); 
    String[] tmp = dir.list(); 
    for (int i = 0; i < tmp.length; i++) 
    ol.addElement(tmp[i]); 
    Collections.sort(ol, String.CASE_INSENSITIVE_ORDER); 
    File f; 
    Vector files = new Vector(); 
    // Make two passes, one for Dirs and one for Files. This is #1. 
    for (int i = 0; i < ol.size(); i++) { 
    String thisObject = (String) ol.elementAt(i); 
    String newPath; 
    if (curPath.equals(".")) 
     newPath = thisObject; 
    else 
    newPath = curPath + File.separator + thisObject; 
    if ((f = new File(newPath)).isDirectory()) 
    addNodes(curDir, f); 
    else 
    files.addElement(thisObject); 
    } 
    // Pass two: for files. 
    for (int fnum = 0; fnum < files.size(); fnum++) 
    curDir.add(new DefaultMutableTreeNode(files.elementAt(fnum))); 
    return curDir; 
    } 

    public Dimension getMinimumSize() { 
    return new Dimension(200, 400); 
    } 

    public Dimension getPreferredSize() { 
    return new Dimension(200, 400); 
    } 

    /** Main: make a Frame, add a FileTree */ 
    public static void main(String[] av) { 

    JFrame frame = new JFrame("FileTree"); 
    frame.setForeground(Color.black); 
    frame.setBackground(Color.lightGray); 
    Container cp = frame.getContentPane(); 

    if (av.length == 0) { 
    cp.add(new FileTree(new File("."))); 
    } else { 
    cp.setLayout(new BoxLayout(cp, BoxLayout.X_AXIS)); 
    for (int i = 0; i < av.length; i++) 
    cp.add(new FileTree(new File(av[i]))); 
    } 

    frame.pack(); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
    } 
+1

Si votre question est seulement la réponse est oui. Si vous voulez savoir comment, alors votre question est trop large pour répondre. Posez plutôt une question spécifique. – talex

+0

Je sais que c'est vaste, c'est pourquoi je ne pouvais pas comprendre par où commencer si j'avais besoin de faire un tel projet. @talex. Merci :) –

+0

@bhavna garg vous pouvez utiliser 'setAccesory (FileTree)' sur 'FileChooser' cette méthode ajoutez votre' FileTree' à droite dans votre 'FileChooser' –

Répondre

0

Ceci est une question très large, mais voici quelques pointeurs.

Si vous essayez de l'intégrer avec un jFileChooser les choses peuvent se salir, c'est possible cependant.

Je vous suggère plutôt d'utiliser votre code mais avec quelques changements pour agir comme un jFileChooser. Tout d'abord, ajoutez un bouton Sélectionner/Ouvrir à votre panneau FileTree. Lorsque ce bouton est enfoncé, vous pouvez créer une méthode rapide pour obtenir une liste des fichiers sélectionnés et les enregistrer dans une variable partagée.

Deuxièmement: vous pouvez utiliser une variable partagée pour transmettre les informations de la fenêtre FileTree popup au thread il a été appelé à partir (you could also have a change listener checking for the updated variable), et vous pouvez faire votre tâche prévue avec les fichiers renvoyés, comme un retour déclaration d'un jFileChooser.

Note: Assurez-vous que appelez votre FileTree classe from a separate thread than the EDT (Ou vous pouvez bloquer l'EDT, mais qui est normalement pas une bonne idée): « Est-ce possible »

+0

Merci beaucoup pour cette idée. Je ne pouvais pas y penser. Mais si vous connaissez la méthode, faites-le moi savoir :) –