Java资源管理器中树形文件目录的路径取得问题

Java资源管理器中树形文件目录的路径取得问题,第1张

这个要看你是怎么实现的TreeModel,无非三种方式:

1.

自己实现TreeModel,这样的话,节点对象就可以直接使用File对象。获取路径也就不成问题了。

2.

自己实衡厅现treeNode接口,蠢燃这样的话,可以在treeNode接口中增加File对象的引用。

3.

用defaultMutableTreeNode来实现的,那么,可以使用setUserObject的方法咐档隐,将File对象设置在TreeNode中,然后就可以在得到节点后,使用getUserObject来获取了。

大致如此吧,估计你用的是第3种,因为很少有人愿意重写TreeCellRenderer的,呵呵。但最佳的办法其实就是第一种。

import java.awt.BorderLayout

import java.awt.Component

import java.io.File

import java.util.*

import javax.swing.*

import javax.swing.border.EmptyBorder

import javax.swing.filechooser.FileSystemView

import javax.swing.tree.DefaultTreeCellRenderer

import javax.swing.tree.TreeNode

/**

* @author Kirill Grouchnikov

*/

public class FileTreePanel extends JPanel {

/**

* File system view.

*/

protected static FileSystemView fsv = FileSystemView.getFileSystemView()

/**

* Renderer for the file tree.

*

* @author Kirill Grouchnikov

*/

private static class FileTreeCellRenderer extends DefaultTreeCellRenderer {

/**

* Icon cache to speed the rendering.

*/

private Map<String, Icon>iconCache = new HashMap<String, Icon>()

/**

* Root name cache to speed the rendering.

*/

private Map<File, String>rootNameCache = new HashMap<File, String>()

/*

* (non-Javadoc)

*

* @see javax.swing.tree.DefaultTreeCellRenderer#getTreeCellRendererComponent(javax.swing.JTree,

* java.lang.Object, boolean, boolean, boolean, int, boolean)

*/

@Override

public Component getTreeCellRendererComponent(JTree tree, Object value,

boolean sel, boolean expanded, boolean leaf, int row,

boolean hasFocus) {

FileTreeNode ftn = (FileTreeNode) value

File file = ftn.file

String filename = ""

if (file != null) {

if (ftn.isFileSystemRoot) {

// long start = System.currentTimeMillis()

filename = this.rootNameCache.get(file)

if (filename == null) {

filename = fsv.getSystemDisplayName(file)

this.rootNameCache.put(file, filename)

}

// long end = System.currentTimeMillis()

// System.out.println(filename + ":" + (end - start))

} else {

filename = file.getName()

}

}

JLabel result = (JLabel) super.getTreeCellRendererComponent(tree,

filename, sel, expanded, leaf, row, hasFocus)

if (file != null) {

Icon icon = this.iconCache.get(filename)

if (icon == null) {

// System.out.println("Getting icon of " + filename)

icon = fsv.getSystemIcon(file)

this.iconCache.put(filename, icon)

}

result.setIcon(icon)

}

return result

}

}

/**

* A node in the file tree.

*

* @author Kirill Grouchnikov

*/

private static class FileTreeNode implements TreeNode {

/**

* Node file.

*/

private File file

/**

* Children of the node file.

*/

private File[] children

/**

* Parent node.

*/

private TreeNode parent

/**

* Indication whether this node corresponds to a file system root.

*/

private boolean isFileSystemRoot

/**

* Creates a new file tree node.

*

* @param file

*Node file

* @param isFileSystemRoot

*Indicates whether the file is a file system root.

* @param parent

*Parent node.

*/

public FileTreeNode(File file, boolean isFileSystemRoot, TreeNode parent) {

this.file = file

this.isFileSystemRoot = isFileSystemRoot

this.parent = parent

this.children = this.file.listFiles()

if (this.children == null)

this.children = new File[0]

}

/**

* Creates a new file tree node.

*

* @param children

*Children files.

*/

public FileTreeNode(File[] children) {

this.file = null

this.parent = null

this.children = children

}

/*

* (non-Javadoc)

*

* @see javax.swing.tree.TreeNode#children()

*/

public Enumeration<?>children() {

final int elementCount = this.children.length

return new Enumeration<File>() {

int count = 0

/*

* (non-Javadoc)

*

* @see java.util.Enumeration#hasMoreElements()

*/

public boolean hasMoreElements() {

return this.count <elementCount

}

/*

* (non-Javadoc)

*

* @see java.util.Enumeration#nextElement()

*/

public File nextElement() {

if (this.count <elementCount) {

return FileTreeNode.this.children[this.count++]

}

throw new NoSuchElementException("Vector Enumeration")

}

}

}

/*

* (non-Javadoc)

*

* @see javax.swing.tree.TreeNode#getAllowsChildren()

*/

public boolean getAllowsChildren() {

return true

}

/*

* (non-Javadoc)

*

* @see javax.swing.tree.TreeNode#getChildAt(int)

*/

public TreeNode getChildAt(int childIndex) {

return new FileTreeNode(this.children[childIndex],

this.parent == null, this)

}

/*

* (non-Javadoc)

*

* @see javax.swing.tree.TreeNode#getChildCount()

*/

public int getChildCount() {

return this.children.length

}

/*

* (non-Javadoc)

*

* @see javax.swing.tree.TreeNode#getIndex(javax.swing.tree.TreeNode)

*/

public int getIndex(TreeNode node) {

FileTreeNode ftn = (FileTreeNode) node

for (int i = 0i <this.children.lengthi++) {

if (ftn.file.equals(this.children[i]))

return i

}

return -1

}

/*

* (non-Javadoc)

*

* @see javax.swing.tree.TreeNode#getParent()

*/

public TreeNode getParent() {

return this.parent

}

/*

* (non-Javadoc)

*

* @see javax.swing.tree.TreeNode#isLeaf()

*/

public boolean isLeaf() {

return (this.getChildCount() == 0)

}

}

/**

* The file tree.

*/

private JTree tree

/**

* Creates the file tree panel.

*/

public FileTreePanel() {

this.setLayout(new BorderLayout())

File[] roots = File.listRoots()

FileTreeNode rootTreeNode = new FileTreeNode(roots)

this.tree = new JTree(rootTreeNode)

this.tree.setCellRenderer(new FileTreeCellRenderer())

this.tree.setRootVisible(false)

final JScrollPane jsp = new JScrollPane(this.tree)

jsp.setBorder(new EmptyBorder(0, 0, 0, 0))

this.add(jsp, BorderLayout.CENTER)

}

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

public void run() {

JFrame frame = new JFrame("File tree")

frame.setSize(500, 400)

frame.setLocationRelativeTo(null)

frame.add(new FileTreePanel())

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

frame.setVisible(true)

}

})

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12201590.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存