62,621
社区成员
发帖
与我相关
我的任务
分享
package h;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Desktop;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
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.table.DefaultTableModel;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
public class FileSystemDemo extends JFrame {
private static final long serialVersionUID = 1L;
private JTree tree;
private JTable table;
private HashMap<File, List<File>> directoryMap;
private HashMap<File, List<File>> fileMap;
private List<List<String>> tableData;
private final String[] COLUMN_NAMES = new String[] { "Name", "LastModify",
"Size" };
private File currSelFile = null;
private TreeSelectionListener listener = new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent e) {
TreePath path = tree.getSelectionPath();
if (path == null) {
return;
}
Object obj = path.getLastPathComponent();
if (obj instanceof File) {
File f = (File) obj;
currSelFile = f;
List<File> subFiles = Arrays.asList(f.listFiles());
if (subFiles == null || subFiles.size() == 0) {
return;
}
tableData.clear();
for (Iterator<File> it = subFiles.iterator(); it.hasNext();) {
File file = it.next();
List<String> record = new ArrayList<String>();
record.add(file.getName().length() == 0 ? file
.getAbsolutePath() : file.getName());
record.add(String.valueOf(file.lastModified()));
record.add(String.valueOf(file.getTotalSpace()));
tableData.add(record);
}
((DefaultTableModel) table.getModel()).fireTableDataChanged();
}
}
};
public FileSystemDemo() {
super();
directoryMap = new HashMap<File, List<File>>();
fileMap = new HashMap<File, List<File>>();
tableData = new ArrayList<List<String>>();
init();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(800, 600);
setLocationRelativeTo(null);
setVisible(true);
}
private void init() {
Container c = getContentPane();
c.setLayout(new BorderLayout());
JSplitPane jsp = new JSplitPane();
tree = new JTree();
tree.addTreeSelectionListener(listener);
tree.setCellRenderer(new FileTreeCellRenderer());
tree.setModel(new FileTreeModel());
jsp.setLeftComponent(new JScrollPane(tree));
table = new JTable();
table.setModel(new FileTableModel());
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1
&& e.getClickCount() >= 2) {
if (currSelFile != null) {
List<File> files = Arrays.asList(currSelFile
.listFiles());
int index = table.getSelectedRow();
if (index < 0) {
return;
}
File f = files.get(index);
openFile(f);
}
}
}
});
jsp.setRightComponent(new JScrollPane(table));
jsp.setDividerLocation(300);
c.add(jsp, BorderLayout.CENTER);
}
private void openFile(File f) {
Desktop d = Desktop.getDesktop();
try {
d.open(f);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
new FileSystemDemo();
}
private List<File> getDirectory(File f) {
List<File> subDirectory;
if (!directoryMap.containsKey(f)) {
subDirectory = new ArrayList<File>();
File[] listFiles = f.listFiles();
for (int i = 0; i < listFiles.length; i++) {
File file = listFiles[i];
if (file.isDirectory()) {
subDirectory.add(file);
}
}
directoryMap.put(f, subDirectory);
} else {
subDirectory = directoryMap.get(f);
}
return subDirectory;
}
private List<File> getFiles(File f) {
List<File> subFiles;
if (!fileMap.containsKey(f)) {
subFiles = new ArrayList<File>();
File[] listFiles = f.listFiles();
for (int i = 0; i < listFiles.length; i++) {
File file = listFiles[i];
if (file.isFile()) {
subFiles.add(file);
}
}
fileMap.put(f, subFiles);
} else {
subFiles = fileMap.get(f);
}
return subFiles;
}
private class FileTreeModel extends DefaultTreeModel {
private static final long serialVersionUID = 1L;
public FileTreeModel() {
super(null);
}
@Override
public Object getRoot() {
return FileSystemView.getFileSystemView().getRoots()[0];
}
@Override
public int getChildCount(Object parent) {
int rs = 0;
if (parent instanceof File) {
rs = getDirectory((File) parent).size();
}
return rs;
}
@Override
public Object getChild(Object parent, int index) {
Object obj = null;
if (parent instanceof File) {
File f = (File) parent;
List<File> subDiretory = getDirectory(f);
File file = subDiretory.get(index);
obj = file;
}
return obj;
}
@Override
public boolean isLeaf(Object node) {
boolean rs = true;
if (node instanceof File) {
File f = (File) node;
List<File> directory = getDirectory(f);
rs = directory == null || directory.size() == 0;
}
return rs;
}
}
private class FileTreeCellRenderer extends DefaultTreeCellRenderer {
private static final long serialVersionUID = 1L;
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean sel, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
Component treeCellRendererComponent = super
.getTreeCellRendererComponent(tree, value, sel, expanded,
leaf, row, hasFocus);
if (value instanceof File) {
File f = (File) value;
setIcon(FileSystemView.getFileSystemView().getSystemIcon(f));
String name = f.toString();
if (name.endsWith(File.separator)) {
name = name.substring(0, name.length() - 1);
} else {
int index = name.lastIndexOf(File.separator);
name = name.substring(index + 1, name.length());
}
setText(name);
}
return treeCellRendererComponent;
}
}
private class FileTableModel extends DefaultTableModel {
private static final long serialVersionUID = 1L;
@Override
public int getRowCount() {
return tableData.size();
}
@Override
public int getColumnCount() {
return COLUMN_NAMES.length;
}
@Override
public String getColumnName(int column) {
return COLUMN_NAMES[column];
}
@Override
public Object getValueAt(int row, int column) {
return tableData.get(row).get(column);
}
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
}
}