文件管理器JAVA课程设计报告文档.docx
《文件管理器JAVA课程设计报告文档.docx》由会员分享,可在线阅读,更多相关《文件管理器JAVA课程设计报告文档.docx(25页珍藏版)》请在冰点文库上搜索。
课 程 设 计 报 告
学院、系:
专业名称:
网络工程
课程设计科目 Java程序课程设计学生姓名:
指导教师:
完成时间:
2011年3月-5月
文件管理器
一、设计任务与目标
编写一个窗口程序,该程序可以打开硬盘中的某个目录,并可以打开目录中某个文件进行浏览。
设计要求:
1)在界面上设计两个文本区,一个用于显示打开的硬盘上的目录,另一用于打开所选中该目录中的文件。
2)设计文本框,用于显示当前的目录位置
*3)设计一个“压缩”按钮,和一个指定目录文本框,将选中的这个文件压缩到指定的目录中。
二、方案设计与论证
对于题目的要求1),使用布局管理器可以设计两个文本区。
对于题目要求2),使用JTextField文本框组件可以实现。
对于题目要求3),使用JButton按钮组件实现。
对于此题的设计要求,我从总体上进行了构思。
运用JavaSwing高级组件中的JTree树组件实现在图形用户界面(GUI)下文件浏览器的编制。
Javax.swing.JTree类提供了组件的功能,可以方便地显示多层次的数据,比
如Windows文件管理器中的文件列表就是有树状结构实现的。
本题设计要求就是Windows文件管理器的工作。
树组件有节点组成,对树组件的操作实际上就是对树上的节点做添置画叶的
操作。
树中最基本的对象是节点。
使用JTree的步骤:
(1)创建树
(2)对节点的选择做出响应
(3)自定义树的外观表现
(4)动态改变一棵树
(5)创建树的数据模型
(6)懒加载孩子
(7)如何写expansionlinstener
(8)如何写tree-will-expandlistener
利用JTree类,你可以显示等级体系的数据Jtree垂直显示它的数据。
树中显示的每一行包含一项数据,称之为节点(node)。
每颗树有一个根节点(rootnode),其他所有节点是它的子孙。
默认情况下,树只显示根节点,但是你可以设置改变默认显示方式。
一个节点可以拥有孩子也可以不拥有任何子孙。
我们称那些可以拥有孩子(不管当前是否有孩子)的节点为“分支节点”
(branchnodes),而不能拥有孩子的节点为“叶子节点”(leafnodes
)。
分支节点可以有任意多个孩子。
通常,用户可以通过点击实现展开或者折叠分支节点,使得他们的孩子可见或者不可见。
默认情况下,除了根节点以外的所有分支节点默认呈现折叠状态。
程序中,通过监听treeexpansion或者tree-will-expand事件可以检测分支节点的展开状态。
三、程序框图或流程图,程序清单与调用关系
开始
初始化窗口各个控件
添加控件事件监听
构造系统目录树模块
判断系统是否有WINRAR
把rar.exe拷贝到系统目录下并配置环境
①窗体初始模块加载 NO
系统关联打开文件
应用当前配置环境
对窗口控件进行布局
②压缩模块加载
显示窗口
关于对话框
构造及其刷新文件树
添加目录根节点
遍历添加盘符节点
添加节点选择事件监听
③事件监听关闭窗体
结束
获取文件对象
读取文件属性及其摘要,显示在右区域
多线程遍历子节点
把子节点添加到树中
添加节点展开事件监听
设置目录树的显示样式
树节点选择事件捕获
普通控件事件捕获,例如:
单击按钮启用不同功
④压缩文件
树节点展开事件捕获
刷新文件树
调用WINRAR环境中的
rar.exe进行压缩
获取目标文件位置
获取文件位置
①位于FileViewe类中的构造函数中(FileViewer.java)
②位于FileViewer类中Main方法中(FileViewer.java)
③其中普通事件监听方法位于FileViewe类中,树的两个特殊事件监控类位的于
DirExpansionListener和DirSelectionListener两个内部类中(FileViewer.java)
④位于Compress类中(Compress.java)
注:
其中FileNode类(FileNode.java)为文件节点类,故不在流程范围内
FileViwer流程图
version1.0
一、全部源程序清单
packagejluzh.fileViewer;
importjava.awt.*;importjava.awt.event.*;importjava.io.*;
importjava.text.DateFormat;
importjavax.swing.*;importjavax.swing.tree.*;importjavax.swing.event.*;
publicclassFileViewerextendsJFrame implementsActionListener
{
/**
*FileView程序的主窗口
*/
privatestaticfinallongserialVersionUID=1L; //Eclipse自动生成的序列化版本id号
privateJTree m_tree; //文件夹树privateDefaultTreeModelm_model; //默认树显示模式
privateJTextAream_rightTextArea; //右边的文本显示区域privateJTextFieldm_PathDisplay; //底部的路径显示区域
privateJButtonm_openBtn; //打开文件按钮privateJButtonm_compressBtn; //压缩文件按钮privateJButtonm_refreshBtn; //刷新按钮privateJButtonm_aboutBtn;
privateStringm_szFileExcutePath; //文件打开绝对路径
publicFileViewer()
{
束程序
super("FileViewer"); //设置窗口标题
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//在关闭窗口时候结
//
//***************************************************************************
*********
//初始化成员变量
//
//***************************************************************************
*********
/*其中m_tree的初始化在《构造系统目录树》中*/
/*其中m_model的初始化在《构造系统目录树》中*/
m_rightTextArea=newJTextArea();m_rightTextArea.setEditable(false); //右面文本显示区域不可写
m_PathDisplay=newJTextField();m_PathDisplay.setEditable(false); //下面路径显示区域不可写
//初始化按钮并添加事件响应
m_openBtn=newJButton("打开文件 利用系统关联打开文件");
m_openBtn.addActionListener(this);
m_compressBtn=newJButton("压缩 配置winrar成功时可用");
m_compressBtn.addActionListener(this);m_refreshBtn=newJButton("刷新");
m_refreshBtn.addActionListener(this);m_aboutBtn=newJButton("关于FileViewer");
m_aboutBtn.addActionListener(this);m_szFileExcutePath=null; //初始化文件打开路径
//
//***************************************************************************
*********
// 构造系统目录树 利用树自带的TreeExpansionListener对树进行
Expansion和Selection响应处理
//
//***************************************************************************
*********
DefaultMutableTreeNodetop; //树形目录的根节点DefaultMutableTreeNodenode; //系统的盘符的节点
File[]roots=File.listRoots(); //列出可用的文件系统盘符数组
");
//构造根节点,后面加空格为了增大左面板初始面积
top = new DefaultMutableTreeNode("我的电脑
//遍历所有盘符,增加到top的孩子节点里
for(intk=0;k{
node=newDefaultMutableTreeNode(newFileNode(roots[k]));top.add(node);
node.add(newDefaultMutableTreeNode(newBoolean(true)));
//在构造的孩子节点下构造初始子节点,节点为true,使成为能扩展状态
}
m_model=newDefaultTreeModel(top); //设置默认模式根节点为topm_tree=newJTree(m_model); //按m_model模
式构造文件树
m_tree.putClientProperty("JTree.lineStyle","Angled"); //设置客户区样
式
m_tree.addTreeExpansionListener(newDirExpansionListener());//设置树展开事件响应处理
m_tree.addTreeSelectionListener(newDirSelectionListener());//设置树选择事件响应处理
为单选编辑
m_tree.getSelectionModel().setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION); //设置选择模式m_tree.setEditable(false); //设置树为不可
//
//***************************************************************************
*********
//对窗口的界面进行处理
//
//***************************************************************************
*********
JPanelleftPanel=newJPanel(); //左边区域的pane的设置leftPanel.setLayout(newBorderLayout());
JScrollPanescroll_tree=newJScrollPane(m_tree); //给树形区
域添加滚动条
leftPanel.add(scroll_tree,BorderLayout.CENTER); //加入文件树到左区域
leftPanel.add(m_refreshBtn,BorderLayout.SOUTH); //添加刷新
按钮
leftPanel.add(m_aboutBtn,BorderLayout.NORTH); //添加关于
按钮
JPanelringhtPanel=newJPanel(); //右边区域的pane的设置ringhtPanel.setBackground(Color.WHITE);ringhtPanel.setLayout(newBorderLayout());
JScrollPanescroll_text=newJScrollPane(m_rightTextArea);//给本文区
域添加滚动条
ringhtPanel.add(scroll_text,BorderLayout.CENTER); //加入文本显示到右区域
ringhtPanel.add(m_openBtn,BorderLayout.NORTH); //加入打开按钮ringhtPanel.add(m_compressBtn,BorderLayout.SOUTH); //加入压缩按钮
JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,leftPanel,ringhtPanel);//垂直分割左右pane
getContentPane().add(split,BorderLayout.CENTER); //分割pane置中
getContentPane().add(m_PathDisplay,BorderLayout.SOUTH); //路径显示置于底部
setSize(800,600); //设置窗口大小
setLocation(200,100);//设置位置setVisible(true); //显示窗口
}
@Override
///////////////////////////////////
//通用事件处理
///////////////////////////////////
publicvoidactionPerformed(ActionEvente){
//TODOAuto-generatedmethodstubif(e.getSource()==this.m_openBtn)//打开文件
{
if(this.m_szFileExcutePath==null)
{
JOptionPane.showMessageDialog(null,
"盘符、文件夹等没有系统文件后缀关联,所以无法打开",
"警告",JOptionPane.WARNING_MESSAGE);return;
}
try{
Runtime.getRuntime().exec("cmd /c start"+this.m_szFileExcutePath);
}catch(IOExceptione1){
//TODOAuto-generatedcatchblocke1.printStackTrace();
}
}
if(e.getSource()==this.m_compressBtn)//压缩文件
{
if(m_szFileExcutePath==null)
{
JOptionPane.showMessageDialog(null,
"盘符、文件夹等没有系统文件后缀,不支持压缩操作",
"警告",JOptionPane.WARNING_MESSAGE);
}
else
{
newCompress(m_szFileExcutePath);
}
}
if(e.getSource()==this.m_refreshBtn)//刷新文件夹树
{
DefaultMutableTreeNodetop; //树形目录的根节点DefaultMutableTreeNodenode; //系统的盘符的节点
File[]roots=File.listRoots(); //列出可用的文件系统盘符数组
");
//构造根节点,后面加空格为了增大左面板初始面积
top = new DefaultMutableTreeNode("我的电脑
//遍历所有盘符,增加到top的孩子节点里for(intk=0;k{
node=newDefaultMutableTreeNode(newFileNode(roots[k]));top.add(node);
node.add(newDefaultMutableTreeNode(newBoolean(true)));
//在构造的孩子节点下构造初始子节点,节点为true,使成为能扩展状
态
}
m_model=newDefaultTreeModel(top);//重新构造树形模式m_tree.setModel(m_model);
m_szFileExcutePath=null; //清空当前路径m_PathDisplay.setText(null); //清空路径显示框m_rightTextArea.setText(null); //清空右方文本区域
}
if(e.getSource()==this.m_aboutBtn)//关于窗口
{
JOptionPane.showMessageDialog(null,
"作者:
",
"关于FileViewer",JOptionPane.DEFAULT_OPTION);
}
}
/**********************************************************
*用于响应树节点展开事件
*内部事件响应类
*/
classDirExpansionListenerimplementsTreeExpansionListener
{
//树展开事件
publicvoidtreeExpanded(TreeExpansionEventevent)
{
//TODOAuto-generatedmethodstub
finalDefaultMutableTreeNodenode=getTreeNode(event.getPath());
//要展开的树节点
finalFileNodefnode=getFileNode(node);
//转换为要展开的文件节点
//多线程BFS遍历生成所有子节点Threadrunner=newThread()
{
publicvoidrun()
{
if(fnode!
=null&&fnode.expand(node))//如果节点不为空,还有可扩展节点(子节点)
{
Runnablerunnable=newRunnable()
{
publicvoidrun()
{
m_model.reload(node); //在模式里刷新本子
树
}
};
到线程队列
}
};
SwingUtilities.invokeLater(runnable);//把runnable加入
}
runner.start();
}
//树折叠事件(不处理)
publicvoidtreeCollapsed(TreeExpansionEventevent)
{
//TODOAuto-generatedmethodstub
}
}
/**********************************************************
*用于响应树节点选中事件
*内部事件响应类
*/
classDirSelectionListenerimplementsTreeSelectionListener
{
publicvoidvalueChanged(TreeSelectionEventevent)
{
的树节点
DefaultMutableTreeNodenode=getTreeNode(event.getPath());//选中
FileNodefnode=getFileNode(node); //转换
为选中的文件节点
if(fnode!
=null) //判断选中的是否为有效文件节点
{
m_PathDisplay.setText(fnode.getFile().getAbsolutePath()); //在底部显示绝对路径
Filef=fnode.getFile();longlen=f.length();
Stringf_Attribute="属性:
\n"; //文件的属性字符串
+"\n";
if(f.isFile())f_Attribute+=" 文件名称:
"+f.getName()
elsef_Attribute+=" 文件夹名:
"+f.getName()+"\n";f_Attribute+=" 文件路径:
"+f.getPath()+"\n";if(f.isFile())
{
f_Attribute+=" 文件长度:
"+len+"字节\n";
式对象
DateFormatdf=DateFormat.getDateInstance();//创建时间格
f_Attribute += " 修改时间:
" +
df.format(f.lastModified())+"\n";
读";
if(f.canRead())f_Attribute+=" 当前权限:
"+"可
elsef_Attribute+=" 当前权限:
"+"不可读";if(f.canWrite())f_Attribute+="可写"+"\n";
elsef_Attribute+="不可写"+"\n";FileReaderfr=null;
try{
fr=newFileReader(f.getPath());
}catch(FileNotFoundExceptione){
//TODOAuto-generated