📄 filetree2.java
字号:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.Vector;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreeSelectionModel;
public class FileTree2 extends JFrame
{
protected JTree m_tree;
protected DefaultTreeModel m_model;
protected JTextField m_display;
public FileTree2() {
super("Directories Tree");
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception err) {
}
setSize(400, 300);
File[] roots = FileSystemView.getFileSystemView().getRoots();// File.listRoots();
FileRow root = new FileRow(roots);
m_model = new DefaultTreeModel(root);
m_tree = new JTree(m_model);
m_tree.getSelectionModel().setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION);
m_tree.putClientProperty("JTree.lineStyle", "Angled");
m_tree.setCellRenderer(new FileTreeRenderer1());
// m_tree.addTreeExpansionListener(new DirExpansionListener());
// m_tree.addTreeSelectionListener(new DirSelectionListener());
m_tree.setShowsRootHandles(true);
m_tree.setEditable(false);
m_tree.setDragEnabled(true);
JScrollPane s = new JScrollPane();
s.getViewport().add(m_tree);
getContentPane().add(s, BorderLayout.CENTER);
m_display = new JTextField();
m_display.setEditable(false);
System.out.println();
TreeSelectionListener tEar = new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
FileRow fr = (FileRow) e.getNewLeadSelectionPath()
.getLastPathComponent();
File[] contents = fr.getFile().listFiles();
// mFileView.setListData(contents);
for (int i = 0; i < contents.length; i++)
System.out.println(contents[i]);
// m_model.add(node);
// m_tree.add(node);
}
};
m_tree.addTreeSelectionListener(tEar);
getContentPane().add(m_display, BorderLayout.NORTH);
WindowListener wndCloser = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
addWindowListener(wndCloser);
setVisible(true);
}
public static void main(String argv[]) {
new FileTree2();
}
public static boolean isDirectory(File fl) {
FileSystemView fsv = FileSystemView.getFileSystemView();
if (fl.isDirectory() || fl.isFile())
return fsv.isTraversable(fl).booleanValue();
return fsv.isComputerNode(fl) || fsv.isDrive(fl)
|| fsv.isFileSystemRoot(fl);
}
private class FileRow implements FileFilter, Comparator, TreeNode {
private File mDir;
private String mName;
private FileRow[] mChildren;
private FileRow mParent;
FileRow(File fl, FileRow parent) {
mDir = fl;
mName = fl.getName();
mParent = parent;
if (mName.length() == 0) // file roots have no name
mName = mDir.toString();
}
FileRow(File[] roots) {
mName = "Root";
mChildren = new FileRow[roots.length];
makeChildren(roots);
}
public int getChildCount() {
if (mChildren == null)
makeChildrenFromDir();
return mChildren.length;
}
public TreeNode getChildAt(int index) {
if (mChildren == null)
makeChildrenFromDir();
return mChildren[index];
}
public File getFile() {
return mDir;
}
/*
* Workaround to bug 4701462
*/
public File[] filterFiles(File mDir, FileFilter fltr) {
File[] children = mDir.listFiles();
ArrayList<File> passed = new ArrayList<File>();
for (int ii = 0; ii < children.length; ii++)
if (fltr.accept(children[ii]))
passed.add(children[ii]);
return (File[]) passed.toArray(new File[0]);
}
public void makeChildrenFromDir() {
// We don't call listFiles(FileFilter), due to bug 4701462
// File[] kids = mDir.listFiles(this);
File[] kids = filterFiles(mDir, this);
if (kids != null) {
Arrays.sort(kids, this);
mChildren = new FileRow[kids.length];
makeChildren(kids);
} else
// this happens sometimes, like when the volume doesn't exist
// (a:)
mChildren = new FileRow[0];
}
public void makeChildren(File[] kids) {
for (int ii = 0; ii < kids.length; ++ii)
mChildren[ii] = new FileRow(kids[ii], this);
}
public boolean accept(File fl) {
return isDirectory(fl);
}
public int compare(Object o1, Object o2) {
return ((File) o1).compareTo((File) o2);
}
public String toString() {
return mName;
}
public TreeNode getParent() {
return mParent;
}
public int getIndex(TreeNode node) {
for (int ii = 0; ii < mChildren.length; ++ii)
if (mChildren[ii] == node)
return ii;
return -1;
}
public boolean getAllowsChildren() {
return true;
}
public boolean isLeaf() {
return false;
}
public Enumeration children() {
Enumeration enum1 = new Enumeration() {
int ii = 0;
public boolean hasMoreElements() {
return ii < mChildren.length;
}
public Object nextElement() {
return mChildren[ii++];
}
};
return enum1;
}
}
private class FileTreeRenderer1 extends DefaultTreeCellRenderer {
/**
*
*/
private static final long serialVersionUID = 256008059685651679L;
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean sel, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
File fl = ((FileRow) value).getFile();
String name = FileSystemView.getFileSystemView()
.getSystemDisplayName(fl);
Component cmp = super.getTreeCellRendererComponent(tree, name, sel,
expanded, leaf, row, hasFocus);
JLabel jc = (JLabel) cmp;
Icon fileIcon = FileSystemView.getFileSystemView()
.getSystemIcon(fl);
jc.setIcon(fileIcon);
return jc;
}
}
}
class FileNode {
protected File m_file;
public FileNode(File file) {
m_file = file;
}
public File getFile() {
return m_file;
}
public String toString() {
return m_file.getName().length() > 0 ? m_file.getName() : m_file
.getPath();
}
public boolean expand(DefaultMutableTreeNode parent) {
DefaultMutableTreeNode flag = (DefaultMutableTreeNode) parent
.getFirstChild();
if (flag == null) // No flag
return false;
Object obj = flag.getUserObject();
if (!(obj instanceof Boolean))
return false; // Already expanded
parent.removeAllChildren(); // Remove Flag
File[] files = listFiles();
if (files == null)
return true;
Vector<FileNode> v = new Vector<FileNode>();
for (int k = 0; k < files.length; k++) {
File f = files[k];
if ((f.isDirectory()))
continue;
FileNode newNode = new FileNode(f);
boolean isAdded = false;
for (int i = 0; i < v.size(); i++) {
FileNode nd = (FileNode) v.elementAt(i);
if (newNode.compareTo(nd) < 0) {
v.insertElementAt(newNode, i);
isAdded = true;
break;
}
}
if (!isAdded)
v.addElement(newNode);
}
for (int i = 0; i < v.size(); i++) {
FileNode nd = (FileNode) v.elementAt(i);
// IconData idata = new IconData(FileTree1.ICON_FOLDER,
// FileTree1.ICON_EXPANDEDFOLDER, nd);
// DefaultMutableTreeNode node = new
// DefaultMutableTreeNode();//idata);
// parent.add(node);
// if (nd.hasSubDirs())
// node.add(new DefaultMutableTreeNode( new Boolean(true) ));
}
return true;
}
public boolean hasSubDirs() {
File[] files = listFiles();
if (files == null)
return false;
for (int k = 0; k < files.length; k++) {
if (files[k].isDirectory())
return true;
}
return false;
}
public int compareTo(FileNode toCompare) {
return m_file.getName().compareToIgnoreCase(toCompare.m_file.getName());
}
protected File[] listFiles() {
if (!m_file.isDirectory())
return null;
try {
return m_file.listFiles();
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Error reading directory "
+ m_file.getAbsolutePath(), "Warning",
JOptionPane.WARNING_MESSAGE);
return null;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -