import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/**
* 图形化文件遍历
*
* @author wangr
* @version 1.0
*/
public class Window {
private JFrame frame;
private JPanel panel;
private JLabel label;
private JFileChooser filedialog;
private JButton button;
private JScrollPane spanel;
private JTextArea textarea;
private static int level = 0;// 层级数
public Window() {
init();
addListener();
}
// 初始化界面
private void init() {
frame = new JFrame("遍历文件显示文件夹的结构");
label = new JLabel("选择文件目录");
button = new JButton("选择文件夹");
panel = new JPanel();
textarea = new JTextArea();
textarea.setEditable(false);
spanel = new JScrollPane(textarea);
spanel.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
panel.add(label);
panel.add(button);
frame.add(panel, BorderLayout.NORTH);
frame.add(spanel, BorderLayout.CENTER);
frame.setSize(600, 500);
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int screenWidth = screenSize.width;
int screenHeight = screenSize.height;
int windowWidth = frame.getWidth();
int windowHeight = frame.getHeight();
frame.setLocation((screenWidth - windowWidth) / 2,
(screenHeight - windowHeight) / 2);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
// 添加监听器
private void addListener() {
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
filedialog = new JFileChooser();
filedialog.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
filedialog.showOpenDialog(frame);
File selectFile = filedialog.getSelectedFile();
String filepath = "";
if (selectFile != null) {
filepath = selectFile.getAbsolutePath();
textarea.setText("");
}
// System.out.println(filepath);//测试使用
if (filepath != null && !filepath.equals("")) {
IteratorDir(new File(filepath));
} else {
textarea.setText("选择目录无效");
}
}
});
}
public void IteratorDir(File file) {
if (file != null && file.exists()) {
// 找出递归的出口
// 假设是文件或者是空文件夹就返回.
if (file.isFile() || file.listFiles().length == 0) {
// textarea.setText("选择目录无效");
return;
} else {
File[] files = file.listFiles();
// 要求是先输出文件夹再输出文件
files = sort(files);
for (File f : files) {
StringBuilder sb = new StringBuilder();
if (f.isFile()) {
sb.append(getTab(level));
sb.append(f.getName() + "\n");
} else {
sb.append(getTab(level));
sb.append(f.getName());
sb.append("\\");
}
if (!textarea.isEditable()) {
textarea.setEditable(true);
textarea.replaceSelection(sb.toString());
textarea.setEditable(false);
}
// 假如是文件夹
if (f.isDirectory()) {
level++;// 进入目录遍历,层级加1
IteratorDir(f);// 递归调用遍历目录的方法
level--;// 目录层级减一,返回上一级目录继续打印输出
}
}
}
}
}
/**
* 对File类型的数组进行先目录后文件的排列
*
* @param files
* @return
*/
private File[] sort(File[] files) {
List<File> fList = new ArrayList<File>();
// 先存放文件夹(目录)
for (File f : files) {
if (f.isDirectory()) {
fList.add(f);
}
}
// 再存放文件
for (File f : files) {
if (f.isFile()) {
fList.add(f);
}
}
// 把集合中的元素转换成指定大小和指定类型的数组
return fList.toArray(new File[fList.size()]);
}
// 就是根据层级数来得到\t所组成的字符串
private String getTab(int level) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < level; i++) {
sb.append(" ");
}
return sb.toString();
}
public static void main(String[] args) {
new Window();
}
}