2015-02-03 5 views
1

Я пытаюсь использовать this piece of code, поскольку он проще других решений для отображения файлов и папок в JTree.Как изменить корневой каталог этого JTree

Единственная проблема заключается в том, что я не знаю, как дать ему корневой каталог. У этого есть путь по умолчанию, который я не могу идентифицировать.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.io.File; 
import java.util.Collections; 
import java.util.Vector; 

import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.event.TreeSelectionEvent; 
import javax.swing.event.TreeSelectionListener; 
import javax.swing.tree.DefaultMutableTreeNode; 

/** 
* Display a file system in a JTree view 
* 
* @version $Id: FileTree.java,v 1.9 2004/02/23 03:39:22 ian Exp $ 
* @author Ian Darwin 
*/ 
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)); 

    // Add a listener 
    tree.addTreeSelectionListener(new TreeSelectionListener() { 
     public void valueChanged(TreeSelectionEvent e) { 
     DefaultMutableTreeNode node = (DefaultMutableTreeNode) e 
      .getPath().getLastPathComponent(); 
     System.out.println("You selected " + node); 
     } 
    }); 

    // 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); 
    } 
} 

Любая идея изменить путь к каталогу?

+0

Вы передаете каталог ввода в качестве параметра. Вы можете передать несколько каталогов ввода в качестве параметров, но макет немного отключен для нескольких входных каталогов. –

+0

@GilbertLeBlanc Итак, не могу ли я иметь переменную типа 'String dir =" C: // "' в этом коде? – Dan

+0

Вы спрашивали, как изменить путь к каталогу. Я говорил тебе. Если вы хотите поместить каталог в код, измените основной метод. –

ответ

1

Это часть кода, которая принимает решения о том, что отображать. В основном это проверка, чтобы увидеть, если вы предоставляете какие-либо параметры командной строки и если вас, он использует их в качестве корня для JTree, в противном случае он использует текущий рабочий каталог (.)

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]))); 
} 

FileTree сами позволяют указать и указать путь в виде объекта File. Вы можете просто передать то, что когда-либо путь к нему через FileTree конструктор

0
cp.add(new FileTree(new File("D:\\Temp"))); 

Эта часть кода может содержать любой корень, а списки JTree - это субфайлы. Однако он не работает с D:\\

1

Я думаю, вы почти там, только небольшое изменение,

String curPath = dir.getPath(); 
DefaultMutableTreeNode fileRoot = new DefaultMutableTreeNode(curPath); 
JTree tree = new JTree(fileRoot); 
addNodes(fileroot, dir); 
Смежные вопросы