2014-11-25 34 views
1

我一直使用JTree來獲取系統的multiple root directories,使用示例FileTreeModel.java來實現它。並且還試圖獲得所選葉(路徑)但它拋出cast error,請給我一些指示,迄今爲止已經發布的代碼已經嘗試過了。謝謝。在JTree上獲取多個根目錄以選擇葉 - Swing

import java.io.File; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.SwingUtilities; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeModel; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.tree.*; 
import java.io.File; 

public class FileTreeDemo { 
    public static void main(String[] args) { 
    // Figure out where in the filesystem to start displaying 
    File root; 
if (args.length > 0) { 
    root = new File(args[0]); 
    //System.out.println(args.length); 
    } 
else root = new File(System.getProperty("user.home")); 
    //System.out.println(args.length); 

// Create a TreeModel object to represent our tree of files 
FileTreeModel model = new FileTreeModel(root); 


// Create a JTree and tell it to display our model 
JTree tree = new JTree(); 
tree.setModel(model); 
tree.setRootVisible(true); 
tree.setShowsRootHandles(true); 
//tree.setShowsRootHandles(true); 

// The JTree can get big, so allow it to scroll. 
JScrollPane scrollpane = new JScrollPane(tree); 

// Display it all in a window and make the window appear 
JFrame frame = new JFrame("FileTreeDemo"); 
frame.getContentPane().add(scrollpane, "Center"); 
frame.setSize(400,600); 
frame.setVisible(true); 

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

    } 
} 

class FileTreeModel implements TreeModel { 
    protected File root; 
    public FileTreeModel(File root) { this.root = root; } 

    public Object getRoot() { return root; } 

    public boolean isLeaf(Object node) { return ((File)node).isFile(); } 

    public int getChildCount(Object parent) { 
    String[] children = ((File)parent).list(); 
    if (children == null) return 0; 
    return children.length; 
    } 

    public Object getChild(Object parent, int index) { 
    String[] children = ((File)parent).list(); 
    if ((children == null) || (index >= children.length)) return null; 
    return new File((File) parent, children[index]); 
    } 

    public int getIndexOfChild(Object parent, Object child) { 
    String[] children = ((File)parent).list(); 
    if (children == null) return -1; 
    String childname = ((File)child).getName(); 
    for(int i = 0; i < children.length; i++) { 
     if (childname.equals(children[i])) return i; 
    } 
    return -1; 
    } 

    public void valueForPathChanged(TreePath path, Object newvalue) {} 


    public void addTreeModelListener(TreeModelListener l) {} 
    public void removeTreeModelListener(TreeModelListener l) {} 
} 

回答

1

在你的模型,你存儲File的,而不是DefaultMutableTreeNode,因爲你ClassCastException這裏:

DefaultMutableTreeNode node = (DefaultMutableTreeNode)e.getPath().getLastPathComponent(); 

改變你的聽衆喜歡下一個:

tree.addTreeSelectionListener(new TreeSelectionListener() { 
     public void valueChanged(TreeSelectionEvent e) { 
      File node = (File) e.getPath().getLastPathComponent(); 
      System.out.println("You selected " + node); 
     } 
    }); 
+0

感謝@ alex2410,賓果!它的工作,非常感謝你,如何獲得一個多根目錄! – 2014-11-25 14:02:58

+0

以root身份使用帶有子項的不可見根節點 – alex2410 2014-11-25 14:04:41