简易文件管理器V1
简介
项目介绍
这是一个初步实现了文件夹和文件查看的项目,可用于熟悉一些Java常用的类,巩固语法的基础。项目包含窗体,按钮,标签,监听器,动态数组,网格布局管理器等。
用到的类
javax.swing下的 JFrame, JLabel, JButton
java.awt下的 GridLayout
java.io下的 File
java.util下的 ArrayList
java.awt.event下的 ActionListener
实现的功能
实现了对特定文件夹下的文件和文件夹的查看。
项目实现
1.实现文件与文件夹在一个窗体上的显示
①创建窗体,这里在自己创建的FileUI类中操作
②根据提供的路径获取获取文件
③储存文件和文件夹
④将文件和文件夹以某种方式显示在窗体上
public class FileUI {
static String Path = "E:\\Test";//提供需要显示的文件路径,static修饰方便下一步的调用
public void showUI() {
//创建窗体
JFrame frame = new JFrame();
frame.setTitle("File Manager");
frame.setSize(800, 600);
frame.setLocation(300, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
File file = new File(Path);//根据给的路径获取文件
File[] files = file.listFiles();//将文件都储存在File的数组中
int column = 5;//设定窗口每列放四个文件
int row = (files.length / column) + 1;//计算放下所有文件所需的行数,不足一行则加一行
GridLayout layout = new GridLayout(row, column, 10, 10);//使用网格布局(传入行列的数量)
frame.setLayout(layout);
//用动态数组存储文件名称
ArrayList<String> dirNameList = new ArrayList<>();//文件夹
ArrayList<String> fileNameList = new ArrayList<>();//文件
//遍历文件数组
for (int i = 0; i < files.length; i++) {
File file1 = files[i];//取出每一个文件
if (!file1.isHidden()) { //隐藏的文件不显示
if (file1.isDirectory()) {
dirNameList.add(file1.getName());//将文件夹放入存储文件夹的数组
} else {
fileNameList.add(file1.getName());//将文件放入存储文件的数组
}
}
}
//显示文件夹和文件(文件夹用按钮,文件用标签)
for (int i = 0; i < dirNameList.size(); i++) {
JButton button = new JButton(dirNameList.get(i));//创建一个按钮,并用文件夹名当文本
button.setBackground(Color.GRAY);//设置按钮背景颜色为灰色
frame.add(button);
}
for (int i = 0; i < fileNameList.size(); i++) {
JLabel jla = new JLabel(fileNameList.get(i));//创建一个标签,并用文件名当文本
jla.setBackground(Color.CYAN);//设置标签背景颜色为青色
frame.add(jla);
}
frame.setVisible(true);//将窗体设置为可见
}
}
到此为止,实现了E盘下Test文件夹下的所有文件的显示。用主函数调用便可实现功能。
2.实现文件夹的打开
①创建监听器类,这里在自己创建的FileOPListener类中操作
②继承动作监听器接口
③为按钮添加动作监听器,实现点击按钮显示被点击文件夹下的内容
*即打开一个新的窗口显示文件,与上面的内容大同小异
public class FileOPListener implements ActionListener{
public void actionPerformed(ActionEvent e){
String dirName = e.getActionCommand();//获取文件名
File file = new File(FileUI.Path + "\\" + dirName);//被点击文件名的文件
//检测到按钮被点击就调用下面的打开文件夹方法,并传入被点击的文件参数
showFileDir(file);
}
//封装打开文件夹的方法(跟上面实现显示文件的功能的代码大同小异)
public void showFileDir(File dirFile){ //参数为文件
JFrame fileFrame = new JFrame();
fileFrame.setTitle(dirFile.getName());
fileFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
fileFrame.setSize(800, 600);
fileFrame.setLocationRelativeTo(null);
File[] files = dirFile.listFiles();//这里的数组存入的是被点击的文件夹下的文件
int column = 4;
int row = (files.length / column) + 1;
GridLayout layout = new GridLayout(row,column,10,10);
fileFrame.setLayout(layout);
ArrayList<String> dirNameList = new ArrayList<>();
ArrayList<String> fileNameList = new ArrayList<>();
//遍历文件
for (int i = 0; i < files.length; i++) {
File file = files[i];
if (!file.isHidden()) {
if (file.isDirectory()) {
dirNameList.add(file.getName());
} else {
fileNameList.add(file.getName());
}
}
}
for (int i = 0; i < dirNameList.size(); i++) {
JButton dirButton = new JButton(dirNameList.get(i));
dirButton.setBackground(Color.GRAY);
fileFrame.add(dirButton);
}
for (int i = 0; i < fileNameList.size(); i++) {
JLabel jla = new JLabel(fileNameList.get(i));
jla.setBackground(Color.CYAN);
fileFrame.add(jla);
}
fileFrame.setVisible(true);
}
}
下面再为第一步中的按钮添加监听器后再调用即可实现功能。不难发现,上面的代码仅实现了打开“一层”文件夹的功能,下面在此基础上来完善打开多层文件夹的功能。
3.实现多层文件夹的显示
前置知识:ActionCommand是JButton的一个属性,不会显示到按钮的文本上,使用动作监听器可以获取,但默认是空,当我们调用getActionCommand时,若我们为其ActionCommand赋值,则调用getActionCommand时能得到的返回值即为我们设置的内容,否则返回按钮上的文本。
下面是源代码
public String getActionCommand() {
String ac = getModel().getActionCommand();
if(ac == null) {
ac = getText();
}
return ac;
}
所以,我们可以在创建按钮时,就将按钮的ActionCommand设置为所点击的文件夹的路径,这样,在调用getActionCommand时,我们就每次都能获取文件路径,从而获取文件用于传入打开文件夹的方法,进而打开文件夹。
下面在上面的代码的基础上进行一点修改即可实现功能。
完整代码如下
FileUI类
import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.util.ArrayList;
public class FileUI {
static String Path = "E:\\Test";
FileOPListener listener = new FileOPListener();
public void showUI(){
//创建窗体
JFrame frame = new JFrame();
frame.setTitle("File Manager");
frame.setSize(800, 600);
frame.setLocation(300,300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//根据路径获取文件
File file = new File(Path);
//创建储存文件的数组
File[] files = file.listFiles();
//计算出要显示的文件
int column = 5;
int row = (files.length / column) + 1;
//使用网格布局
GridLayout layout = new GridLayout(row,column,10,10);
frame.setLayout(layout);
//用动态数组存储文件夹名称
ArrayList<String> dirNameList = new ArrayList<>();
ArrayList<String> fileNameList = new ArrayList<>();
frame.addMouseListener(listener);
//遍历文件数组,区分文件和文件夹,再存入数组
for (int i = 0; i < files.length; i++) {
File file1 = files[i];
if(!file1.isHidden()){
if(file1.isDirectory()){
dirNameList.add(file1.getName());
}else{
fileNameList.add(file1.getName());
}
}
}
//创建按钮(文件夹) 和 标签(文件)
for (int i = 0; i < dirNameList.size(); i++) {
JButton button = new JButton(dirNameList.get(i));
button.setBackground(Color.GRAY);
button.addActionListener(listener);//为按钮添加监听器
//给ActionCommand属性赋值,赋值为文件的全局路径
button.setActionCommand(Path + "\\" + dirNameList.get(i));
frame.add(button);
}
for (int i = 0; i < fileNameList.size(); i++) {
JLabel jla = new JLabel(fileNameList.get(i));
jla.setBackground(Color.CYAN);
frame.add(jla);
}
frame.setVisible(true);
}
}
FileOPListener类
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.util.ArrayList;
public class FileOPListener implements ActionListener{
public void actionPerformed(ActionEvent e){
//获取文件夹的全局路径
String dirPath = e.getActionCommand();
File file = new File(dirPath);
showFileDir(file);
}
//封装打开文件夹的方法
public void showFileDir(File dirFile){
JFrame fileFrame = new JFrame();
fileFrame.setTitle(dirFile.getName());
fileFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
fileFrame.setSize(800, 600);
fileFrame.setLocationRelativeTo(null);
File[] files = dirFile.listFiles();
int column = 4;
int row = (files.length / column) + 1;
GridLayout layout = new GridLayout(row,column,10,10);
fileFrame.setLayout(layout);
ArrayList<String> dirNameList = new ArrayList<>();
ArrayList<String> fileNameList = new ArrayList<>();
for (int i = 0; i < files.length; i++) {
File file = files[i];
if (!file.isHidden()) {
if (file.isDirectory()) {
dirNameList.add(file.getName());
} else {
fileNameList.add(file.getName());
}
}
}
for (int i = 0; i < dirNameList.size(); i++) {
JButton dirButton = new JButton(dirNameList.get(i));
dirButton.setBackground(Color.GRAY);
dirButton.setActionCommand(dirFile.getAbsolutePath() + "\\" + dirNameList.get(i));//给ActionCommand属性赋值,赋值为被点击的文件夹的全局路径,用于点击按钮后获取路径
fileFrame.add(dirButton);
dirButton.addActionListener(this);//为按钮添加监听器
}
for (int i = 0; i < fileNameList.size(); i++) {
JLabel jla = new JLabel(fileNameList.get(i));
jla.setBackground(Color.CYAN);
fileFrame.add(jla);
}
fileFrame.setVisible(true);
}
}
4.效果展示


总结
该项目仅是简单实现了文件的查看,其他功能亟待补充。下次将在此基础上添加创建与删除文件的功能和打开文件的功能。
685

被折叠的 条评论
为什么被折叠?



