Get multiple root directories on JTree to select the leaf - Swing

五迷三道 提交于 2019-12-13 17:25:06

问题


I have been using JTree to get the multiple root directories of the system, using the example FileTreeModel.java to achieve it. And also trying to get the selected leaf (path) but it throws cast error, please give me some directions on this, have posted the code so far have tried. Thanks.

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:


In your model you store File's instead of DefaultMutableTreeNode, because of you get ClassCastException here:

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

Change your listener like next:

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


来源:https://stackoverflow.com/questions/27128165/get-multiple-root-directories-on-jtree-to-select-the-leaf-swing

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!