JAVA目录树

JAVA目录树,第1张

分两步取子项目。先取子目录,再取文件。

做两个文件过滤器。

import java.io.FileFilter

class FolderFilter extends FileFilter{

public boolean accept(File f){

return f.isDirectory()

}

}

class FilesFilter extends FileFilter{

public boolean accept(File f){

return f.isFile()

}

}

在调用listFiles()取子项目时,先new一个FolderFilter做参数调用listFiles,得到的子项目就是目录。

new一个FilesFilter做参数调用listFiles得到的就是子文件。

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)

}

})

}

}

Java中使用递归算法实现查找树形结构中所有父级和子级节点,用递归加一个全局变量标记是否已经找到,然后返回。

截取后面的一段例子:

if (list[i].ID.Equals(id) || found)

found = true

return

拓展资料

递归查询子级节点

1.一个节点可能有多个子级节点,每个自己节点可能还有更多的子级节点。

2.所以递归时的参数用一个list来接受,首先遍历参数list,分别查询pid为参数id的对象。

3.每一个参数id所查询返回的数据是一个对象的list。

4.遍历list获取符合条件的对象的id值,一份存到temp中用作递归的参数,并存到全局变量中用来获取所有符合条件的id。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存