
java课程设计
万户oa-联想打印机更换墨粉后怎么清零
2023年3月17日发(作者:初中生物实验)《Java程序设计》课程设计
一、课程设计总体要求:
本次课程设计是对前面学过的所有面向对象的编程思想以及编程方法的一个总结、回顾
和实践,因此,开始设计前学生一定要先回顾以前所学的内容,明确本次作业设计所要用到
的技术点并到网上搜索以及查阅相关的书籍来搜集资料。通过编写一个基于JAVA的应用系
统综合实例,来掌握Java语言编程技巧。
具体要求有以下几点:
1.问题的描述与程序将要实现的具体功能。
2.程序功能实现的具体设计思路或框架,并检查流程设计。
3.代码实现。
4.程序测试(如程序代码、功能测试、可靠性测试和效率测试等)。
5.设计小结。
二、选题(题目在后面)
整体要求:建议使用Eclipse或NetBeans、JBuilder集成开发环境完成作业,界面友好,
代码的可维护性好,有必要的注释和相应的文档。
三、考核办法
根据提交的设计文档(包括程序主要完成的功能、设计思路和框图、主要代码,程序中
有何创新,有何收获和所存在的不足以及需要改进的地方。),程序功能的实现(要求演示)
进行考核:
无任何文档,无程序,得0分;
文档混乱,没有思路,程序不能运行,不及格;
文档描述清晰,程序实现了基本功能,及格;
文档描述清晰准确,思路清晰,程序实现了要求的所有功能,良好;
文档完备,设计合理有创新,报告清晰明确,深入分析了自己进行实验的体会感想,程
序实现了全部功能,功能完善,并有其它的创新实现,优秀。
四、课程设计报告内容(样例请参照第十页样本1和样本2)
1.目录
2.选题与分工
3.设计题目及具体要求
4.总体设计思路(简要说明系统包含的java源程序及其功能,描述类之间的主要关
系)
5.具体设计(以表格形式描述各个类含有的成员变量和方法,并对关键代码加以说明,
显示程序运行界面)
6.总结(包括对本课程的建议)
7.参考资料
联系方式号码备注
QQ765725111
765725111@(优先)
Terryztx@
五、设计时间
两周(详细时间安排经供参考),具体安排如下:
第一阶段:
1.班级分组,选定课题,查阅相关资料2天
2.划分模块、小组成员分工,
利用CASE工具进行系统设计和分析,并编制源程序5天
第二阶段:上机调试,修改、调试、完善系统4天
第三阶段:撰写、上交课程设计报告,上交课程设计作品源程序(每课题组一份)2天
六、设计方式和安排
分组选题:最多3人为一组,每组一个课题(可根据课题工作量大小,合理分配人数),
每组设组长一名,负责该组设计工作的协调、分工等。
设计过程:
1.分析设计准备阶段(按组讨论、对系统功能进行分析,确定算法,并进行明确分工);
2.编程调试阶段(绘制可能涉及到的数据流图、数据字典、系统流程图、用例图、类
图、时序图和活动图等,编制源程序,上机调试,修改程序,编写软件测试报告,用户
使用手册)
3.总结和书写报告阶段(撰写上交相关资料)
七、课程设计提交内容
由小组组长负责将课程设计报告(WORD文档)和程序的项目文件夹统一
..
压缩打
包(注意:课程设计报告这个word文档放置在“报告”这个文件夹,程序的项目文件夹
(如eclipse新建的项目文件夹)放置在“程序”文件夹,然后将这两个文件一起选中
右键选择压缩为,取名为你们的“班级拼音代号-你们小组各成员的学号_姓名-《选题名
称》”,例如:R024_王五_2_李四_2_张三-《网络监
听程序》.rar),然后联系我发送到E-Mail或当面提交电子稿
...
。
课程设计选题
第一部分:小型项目
1、编写一个记事本程序
要求:
用图形用户界面实现。
能实现编辑、保存、另存为、查找替换等功能。
提示:使用文件输入输出流。
2、模拟龟兔赛跑
要求:
用图形用户界面实现。
能设置比赛时间,马匹的数量等等。
在任意时间段内马匹的速度是随机的。
开始比赛之后以动画显示赛马过程。
提示:使用多线程
3、学生信息管理系统
要求:
使用图形用户界面
用数据库建立1或2个学生信息表。(不限使用哪种数据库)
能连接数据库并实现查询、增、删、改等功能。
4、图书信息管理系统
要求:
使用图形用户界面
用数据库建立1或2个图书信息表。(不限使用哪种数据库)
能连接数据库并实现查询、增、删、改(CRUD)等功能。
5、聊天小程序
要求:
使用图形用户界面。
能实现一个聊天室中多人聊天。
可以两人私聊。
提示:使用socket通信
6、ATM柜员机模拟程序
要求:使用图形用户界面。当输入给定的卡号和密码(初始卡号和密码为123456)时,系
统能登录ATM柜员机系统,用户可以按照以下规则进行:
1、查询余额:初始余额为10000元
2、ATM取款:每次取款金额为100的倍数,总额不超过5000元,支取金额不允许透支。
3、ATM存款:不能出现负存款。
4、修改密码:新密码长度不小于6位,不允许出现6位完全相同的情况,只有旧密码正
确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码。
7、超市收银系统
要求:使用图形用户界面。
由收银员输入顾客的会员卡卡号(若有卡)、所购商品的货号等。从数据库中取出有关
价格信息,再把这些信息返回给收银台。同时把该收银台的销售总量和有关种类商品的
剩余量以及该持卡顾客的消费情况交数据库存储以供查询。
另外,对没有卡的消费情况不记录该顾客的消费情况等个人信息。如果一个未持卡顾客
一次购物满200元,可为其发放一张会员卡,以后在该商场购物可向9折优惠。
8、万年历
要求:
使用图形用户界面。
实现日期与星期的查询
9、网络监听程序
要求:
使用图形用户界面。
有服务器和客户端,服务器监听客户端的登陆。即:如果A客户端登陆服务器,则服
务器界面上的A字母对应的红灯变成绿色。
绿灯表示连接,红灯表示断线。
提示:socket的监听方法
10、全球通计费程序
要求:
使用图形用户界面。
使用真实的全球通资费标准,模拟统计一个特定号码的一个月的实时话费。
能根据输入实现各种用户的话费的计算并显示月实时帐单。
提示:使用接口和多个子类实现分别表示金卡、银卡等各种套餐的话费计算。
11.日历记事本
要求:带有日程提醒功能的日历。
1、显示信息:用户可以向前翻页查询前一个月的日期,也可以向后翻页查询下一个月的
日期。
2、定时提醒:用户可以针对某一天来添加,删除和编辑这一天的日程提醒信息,当系统
时间和提醒时间相吻合时,给出具有提示信息的对话框。
3、查询信息:用户可以查询到某个月的所有的提示信息。
12.电子英汉词典
要求:
能够编辑词典库中的信息
能够实现英译汉,汉译英。(要考虑一词多义)
13.加密与解密
要求:采用图形用户界面
1、给定任意一个文本文件,进行加密,生成另一个文件。
2、对加密后的文件还原。
14.小游戏
要求:
程序随机产生20—50根火柴,由人与计算机轮流拿,每次拿的数量不超过3根,拿到
最后一根为胜。(使用图形界面)
15.敏感词汇分析
要求:
任意选择一个文本文件,分析该文件,如果存在敏感词汇(这些词汇保存在
文件中,每个词占一行),报告每个词出现的次数。
16、猜数字游戏
要求:计算机产生随机数,猜中即胜,猜不中,提示是大了还是小了,继续猜,直至猜到,
给出所用时间和评语。
要求提交Application和Applet两个版本的程序。
17、小学算术运算测试程序
要求:制作一个可供小学数学运算程序:10以内加减法,能根据输入题数出题,判断做题
是否正确,最后计算分数。
要求提交Application和Applet两个版本的程序。
18、模拟科学计算器【已提供此程序样本,故不能选择此题】
要求:界面模拟Windows中的计算器程序。
实现基本数学运算、函数等功能:加、减、乘、除、阶乘、正弦、余弦和指数运算。
实现要点:添加相关组件并进行按钮事件处理。
要求提交Application和Applet两个版本的程序。
19、模拟画图
要求:模拟Windows中的画图程序,实现图形图像的编辑、修改、保存等功能。
20、模拟时钟
要求:通过多线程技术,重绘界面,界面包括表盘和指针。并用数字表显示时间。
实现要点:多线程技术,图形的绘制。
21、打字训练测试软件
要求:设计一个中英文打字测试软件。从文件中调入中英文录入材料,最后可以给出错误率,
平均录入速度。
22、ip地址、手机归属地查询
实现要点:数据库查询。
23、五子棋
功能要求:可两人对下(用鼠标操作),判断胜负。
界面要求:美观简洁,有简单操作说明。
24、电话号码查询系统。
要求:有电话录入,修改,增加,删除,按姓名查询,按电话号码查询,按部门查询,按部
门显示,显示所有电话号码信息,打印等功能。
25、其他题目:
如扫雷、红心大战等游戏程序的设计;
作业管理系统,具有对本学期所有作业管理、运行的管理系统;
学生成绩管理系统;
学生信息管理系统;
试题管理系统;
动画制作,根据所学知识编制一些动画程序;
及媒体播放器等等自拟题目。
第二部分:中型项目
一.一个简单的学生成绩管理信息系统
数据库要求:
1.建立的数据库中包含如下信息:学生学号、姓名、班级,语文、数学、英语成绩。
2.至少要有5个班级,每个班级要有10名以上学生。
3.使用.txt格式文本表示各种表。
功能需求:
1.能够实现根据以下关键字查询:学生姓名、学号、班级、课程名称。
2.能够实现按照单科成绩、总成绩、平均成绩、学号排序。
3.能够实现学生信息的插入、删除和修改。
4.能够查询每个课程的最高分、最低分及相应学生姓名、班级和学号。
5.能够查询每个班级某门课程的优秀率(90分及以上)、不及格率,并进行排序。
界面要求:
1.尽量使用图形界面实现,要符合日常软件使用规范来设计菜单和界面。
2.如果无法实现图形界面,则在命令行方式下也需要提供菜单,方便用户操作。
其他要求:
1.标识符命名遵循Windows命名规范。
2.能够注意各种异常处理,注重提高程序运行效率。
提交内容:
1.用于表示数据库的.txt文件格式说明。
2.全部源代码。
3.软件设计和使用说明书(UML类图;实现的功能、主要技术;使用帮助文档)。
二、一个简单的算法演示程序
功能要求:
1.选择一个算法(提供选择见下),利用各种方法(图形、动画等)演示算法的演示过程。
2.可以进行手动演示,也可以自动步进式演示。
3.允许用户设置算法的各个输入参数,以及自动步进式演示中的时间间隔。
4.不同的算法输入要求见下。
界面要求:
1.尽量使用图形界面实现,要符合日常软件使用规范来设计菜单和界面。
2.如果无法实现图形界面,则在命令行方式下也需要提供菜单,方便用户操作。
其他要求:
1.标识符命名遵循Windows命名规范。
2.能够注意各种异常处理,注重提高程序运行效率。
提交内容:
1.全部源代码。
2.软件设计和使用说明书(UML类图;实现的功能、主要技术;使用帮助文档)
参考算法:
1.最小生成树算法:Prim算法、Kruskal算法。允许以下方式输入一个图形:绘制图形、
输入邻接矩阵、输入边及其关联的顶点。要求在图形方式下进行演示算法执行步骤。
2.单源最短路算法:Dijkstra算法。允许以下方式输入一个图形:绘制图形、输入邻接矩
阵、输入边及其关联的顶点。要求在图形方式下进行演示算法执行步骤。
3.最优编码算法:Huffman编码算法。允许用户输入一段英文文字,或者打开一个txt文
档(英文内容),据此文档内容进行编码。要求动态列出每个字符的出现概率统计结果以
及对应编码。
4.其他可供演示的具有一定难度的算法,如关键路径问题、有向图的极大连通分支等。
三、一个简单的网络聊天程序
功能要求:
1.实现类似与飞鸽的功能,自动侦测局域网内部启动该软件的用户,并显示在用户列
表中。
2.可以进行两个人之间的私聊。
3.可以群聊。
4.可以发送文件。
界面要求:
1.尽量使用图形界面实现,要符合日常软件使用规范来设计菜单和界面。
其他要求:
1.标识符命名遵循Windows命名规范。
2.能够注意各种异常处理,注重提高程序运行效率。
提交内容:
1.全部源代码。
2.软件设计和使用说明书(UML类图;实现的功能、主要技术;使用帮助文档)
四、一个简单的万年历
功能要求:
1.能够显示实现1800-2100年的日期,包括公历、农历、星期、二十四节气。
2.能够按照月份格式显示,或按照星期格式显示。
3.能够显示系统时间。
4.能够设置闹钟。
5.能够查询若干国际大城市(分布在不同时区)的时间。
界面要求:
1.尽量使用图形界面实现,要符合日常软件使用规范来设计菜单和界面。
其他要求:
1.标识符命名遵循Windows命名规范。
2.能够注意各种异常处理,注重提高程序运行效率。
提交内容:
1.全部源代码。
2.软件设计和使用说明书(UML类图;实现的功能、主要技术;使用帮助文档)
五、一个计算数学表达式的程序
功能要求:
1.由用户输入一个简单的四则运算表达式,求出其计算结果后显示。
2.允许在表达式中出现常用的数学函数,如绝对值、取整、三角函数、倒数、平方根、
平方、立方等。
界面要求:
1.尽量使用图形界面实现,要符合日常软件使用规范来设计菜单和界面。
2.如果无法实现图形界面,则在命令行方式下也需要提供菜单,方便用户操作。
其他要求:
1.标识符命名遵循Windows命名规范。
2.能够注意各种异常处理,注重提高程序运行效率。
提交内容:
1.全部源代码。
2.软件设计和使用说明书(UML类图;实现的功能、主要技术;使用帮助文档)
课程设计样本1
一.设计GUI界面的计算器程序
1.问题描述:设计GUI界面的计算器程序,用户可以通过鼠标依次输入参加计算的数值,
进行加、减、乘、除混合运算。
2.设计思路:
本程序功能不是太复杂,主要工作是界面的设计。为减少通信接口设计,所有功能均在一个
类中实现。程序中的函数列表如下:
函数名称函数功能简介
publicCalculator()加载窗体及窗体关闭事件等
publicvoidactionPerformed(ActionEvente)响应事件,执行相应的逻辑处理
privateDoublenumberFormat(Stringsrc)去掉多于的0,返回double数值
privateStringnumberFormat(doublesrc)去掉多于的0,返回字符串
privatevoidsetNumber(Stringid)为显示域extField设置数值
privatevoidcompute(doubled1,doubled2,int
ot)
计算并在TextField中显示
3.代码实现:
.*;
.*;
.*;
.*;
.*;
publicclassCalculatorextendsJFrameimplementsActionListener{
staticfinalString[]button_name={"7","8","9","/",
"sqrt","4","5","6","*","%","1","2",
"3","-","1/x","0","+/-",".","+","="};
doublenum=0;
privatebooleanoperate_flag=false;
privateintoperate_type=0;
privateJPaneldisplay_main=newJPanel();
privateJPaneldisplay=newJPanel();
privateJPanelbuttons=newJPanel();
privateJButtonbackspace=newJButton("Backspace");
privateJButtonc=newJButton("C");
privateJButtonce=newJButton("CE");
privateJButton[]bg=newJButton[20];
privateJTextFieldtext=newJTextField("0");
privateJPanelmain=newJPanel();
publicCalculator(){
super("简易计算器");
setIconImage((aultToolkit()).getImage(""));
//获得图标文件
out(newGridLayout(1,3,15,15));
(backspace);
(c);
(ce);
der(newLineBorder(kground(),5));
//添加边框
ionListener(this);
ionListener(this);
ionListener(this);
t(newFont("宋体",+,20));
//设置显示字体
kground(Color(44,3,87));
der(newLineBorder(,1));
izontalAlignment();//设置鼠标靠右
table(false);//屏蔽键盘输入,防止非法字符
display_out(newGridLayout(2,1,10,10));
display_(text,);
display_(display,);
out(newGridLayout(4,5,10,20));
for(inti=0;i<20;i++){
bg[i]=newJButton(button_name[i]);
bg[i].addActionListener(this);//为各个按钮添加事件监听
(bg[i]);
}
der(newLineBorder(kground(),5));//边框
out(newBorderLayout());
(display_main,);
(buttons,);
setDefaultCloseOperation(_ON_CLOSE);
//添加关闭窗口事件监听器
pack();//自动设置窗体大小
setResizable(false);//设置面板大小不可变
setVisible(true);
Toolkittk=lkit();
Dimensionde=eenSize();
setBounds((th())/2,(-this
.getHeight())/2,th(),ght());
//使之居于屏幕正中央
}
publicvoidactionPerformed(ActionEvente){//事件响应
Objectsource=rce();
if(operate_flag==true){
t("0");
operate_flag=false;
}
if(!("".equals(t()))&&t().charAt(0)=='+'){
t(t().substring(1,t().length()));
}//存在'+',就去掉
try{
ouble(t());
}catch(Exceptionee){
t("0");
}//检测输入数据格式是否合法,不合法就重置为0
if(source==c||source==ce){
t("0");
}elseif(source==backspace){
if("0".equals(t())||"+".equals(t())
||"-".equals(t())){
}else{
t(t().substring(0,
t().length()-1));
}
}elseif(source==bg[0]){
setNumber("7");
}elseif(source==bg[1]){
setNumber("8");
}elseif(source==bg[2]){
setNumber("9");
}elseif(source==bg[3]){//"/"运算
operate_flag=true;
operate_type=1;
num=ouble(t());
}elseif(source==bg[4]){//求平方根
doublesqrt=ouble(t());
if(sqrt<0){
t("函数输入无效!");
}elseif(sqrt==0){
}else{
t(""+(sqrt));
}
}elseif(source==bg[5]){
setNumber("4");
}elseif(source==bg[6]){
setNumber("5");
}elseif(source==bg[7]){
setNumber("6");
}elseif(source==bg[8]){
operate_flag=true;
operate_type=2;
num=ouble(t());
}elseif(source==bg[9]){
t("Sorry,我还没理解该功能的意思!");
}elseif(source==bg[10]){
setNumber("1");
}elseif(source==bg[11]){
setNumber("2");
}elseif(source==bg[12]){
setNumber("3");
}elseif(source==bg[13]){
operate_flag=true;
operate_type=3;
num=ouble(t());
}elseif(source==bg[14]){
doublereciprocal=ouble(t());
if(reciprocal==0.0){
t("数据非法!");
}else{
t(""+1/reciprocal);
}
}elseif(source==bg[15]){
if("0".equals(t())){
}else{
t(t()+"0");
}
}elseif(source==bg[16]){//取相反数
doublelinshi=numberFormat(t());
if(linshi>0){
t("-"+t());
}elseif(linshi<0){
t(t().substring(1,
t().length()));
}else{
}
}elseif(source==bg[17]){//‘.’的输入
intcount_comma=0;
for(inti=0;i if('.'==(t().charAt(i))){ count_comma++; } } if(count_comma>0){ count_comma--; return;//检测到两次输入".",不响应 }else{ if("".equals(t())){ t("0."); }else{ t(t()+"."); } } }elseif(source==bg[18]){ operate_flag=true; operate_type=4; num=ouble(t()); }elseif(source==bg[19]){//等号被按下就计算 compute(num,ouble(t()),operate_type); } } privateDoublenumberFormat(Stringsrc){//去掉多于的0,返回double数值 inti=0; doubledest=0.0; for(i=0;i<();i++){ if(!((i)=='0')){ break; } } src=ing(i); try{ dest=ouble(src); }catch(Exceptione){ n(e); } returndest; } privateStringnumberFormat(doublesrc){//numberFormat()进行了方法重载! DecimalFormatdf=newDecimalFormat( " ###. ##"); Stringsrc2=(src); returnsrc2; }//去除数字前无效的0,返回字符串 privatevoidsetNumber(Stringid){ t(t()+id); t(numberFormat(numberFormat(t()))); } privatevoidcompute(doubled1,doubled2,intot){//运算 switch(ot){ case1://"/" if(d2==0.0){ t("除数不能为零!"); return; }else{ t(""+(d1/d2)); } break; case2://"*" t(""+(d1*d2)); num=d1*d2; break; case3://"-" t(""+(d1-d2)); num=d1-d2; break; case4://"+" t(""+(d1+d2)); num=d1+d2; break; } } publicstaticvoidmain(String[]args)throwsException{ newCalculator(); } } 4.程序运行: 运用jar命令打包后如下: 界面如下: 5.小结: 本程序的实现不难,主要是其中的一些细节问题,如数字的格式,按钮按下的次序不同 导致的问题(如不能二次以上按下“.”应不响应;不能输入“00.1”这种数据等),需要经 多次调试才行。 程序的整体结果其实并不好,界面的实现应该和逻辑处理分离开来。但是鉴于程序的规 模,本程序未曾进行包间的调用,而是采用了单类实现。 课程设计样本2 1.问题描述:文件分割、合并器。实现对任意文件的分割,并且能够对分割后的文件进行 合并还原。实现系统托盘,最小化时到系统托盘。 2.设计思路:要实现对任意文件的分割,这就需要找到所有文件的共同之处。其实,也很 简单,我们把文件都看作是一连串的字节流组成的即可。利用包中的 FileOutputStream和FileInputStream对文件进行字节流的读写。文件和并,通过对欲合 并文件的辨认(本程序通过后缀“-split”来确定),将分割后的文件加入一个 ArrayList中,利用迭代器用文件分割同样的道理进行合并还原。 3.代码实现: .*; .*; .*; .*; ; .*; .*; rder; publicclassFileCutextendsJFrameimplementsCloneable{ /* *operateKind存储操作种类(分割或者合并文件)cutKind存储分割文件的方式 */ publicstaticintoperateKind=1,cutKind=1; //加载框架顶部的图片由类MyCanvas实现 //下部框架 privateJPanelfloor=newJPanel(newBorderLayout()); //左部框架 privateJPanelleft=newJPanel(newGridLayout(2,1,10,10)); privateJPanelleft_up=newJPanel(newGridLayout(3,1)); privateJLabelleft_up_label=newJLabel("-------功能选择-------"); privateCheckboxGroupcheckgroup_left=newCheckboxGroup(); privateCheckboxsplit=newCheckbox("分割文件",true,checkgroup_left); privateCheckboxunion=newCheckbox("合并文件",false,checkgroup_left); privateJTextArealeft_down_label=newJTextArea( "欢迎使用n文件分割※合并器1.0nn作者:陈维n地址:太原理工大学 n~成于2007年元月~"); //右部框架 privateJPanelright=newJPanel(newBorderLayout()); privateJPanelright_up=newJPanel(newGridLayout());//右上 publicstaticJLabelcutMethod=newJLabel("分割方式:"); publicstaticCheckboxGroupcheckgroup_right=newCheckboxGroup(); publicstaticCheckboxbigOrSmall=newCheckbox("按大小",true, checkgroup_right); publicstaticCheckboxfileNumber=newCheckbox("按数目",false, checkgroup_right); privateJPanelright_mid=newJPanel(newBorderLayout());//右中 publicstaticJLabelJLabel1=newJLabel("参数:"), JLabel2=newJLabel("源文件:"),JLabel3=newJLabel("目标目录: "); publicstaticJTextFieldJTextField1=newJTextField("2"),//分割方式参数 JTextField2=newJTextField(13),//源文件路径及文件名 JTextField3=newJTextField(13);//分割后文件存放目录 publicstaticJComboBoxunit=newJComboBox(); privateJButtoncalcu=newJButton("计算"),//调用计算器进行计算 browse_source=newJButton("浏览"),//浏览源文件 browse_target=newJButton("浏览"),//浏览分割后文件存放目录 clear=newJButton("重置");//所有参数重置 privateJPanelright_down=newJPanel();//右下 privateJButtonenter=newJButton("确定"),cancel=newJButton("取消"); staticJTextAreamessage=newJTextArea(5,20);//信息提示 privateJScrollPanejsp=newJScrollPane(); publicFileCut(){//构造函数 super("文件分割※合并器1.0--chenwei_computer@"); nImage(aultToolkit().getImage("")); Boxbox_main=VerticalBox(); //顶部图片 box_(newMyCanvas()); //左部组件 left_der(newLineBorder(newColor(8,57,108),2));//边框 left_(left_up_label); mListener(newSplitItemListener()); left_(split); mListener(newUnionItemListener()); left_(union); left_(left_down_label); (left_up); left_down_der(newLineBorder(newColor(8,57,108),2));//边框 left_down_table(false); left_down_kground(left_kground()); left_down_t(newFont("宋体",G_BASELINE +,13)); der(newLineBorder(newColor(8,57,108),2)); (left_down_label); (left,"West"); //右部上组件 der(EmptyBorder(1,2,1,2));//边框 right_(cutMethod); mListener(newBigOrSmallItemListener()); right_(bigOrSmall); mListener(newFileNumberItemListener()); right_(fileNumber); (right_up,"North"); //右部中组件 Boxbox=HorizontalBox(),box1=VerticalBox(),box2= Box .createVerticalBox(),box3=VerticalBox(); (JLabel1); (VerticalStrut(9));//添加垂直间距 (JLabel2); (VerticalStrut(9)); (JLabel3); (JTextField1); (JTextField2); (JTextField3); ItemAt("MB",0); ItemAt("KB",1); ItemAt("B",2); ectedIndex(0); (unit); browse_ionListener(newSourceActionListener()); (browse_source); browse_ionListener(newTargetActionListener()); (browse_target); (box1); (box2); (box3); right_(box,"Center"); table(false);//设置为不可编辑 der(EmptyBorder(1,2,1,2)); wport().add(message); kground(_GRAY); right_(jsp,"South"); (right_mid,"Center"); //右部下组件 ionListener(newCalcuAction()); right_(calcu); ionListener(newEnterAction()); right_(enter); ionListener(newCancelAction()); right_(cancel); ionListener(newClearAction()); right_(clear); (right_down,"South"); (right,"Center"); //整体下部组件 box_(floor); (box_main); //设置可见性和窗体大小,窗口居中 ible(true); //aultCloseOperation(_ON_CLOSE); (); Toolkittk=lkit(); Dimensionde=eenSize(); nds((th())/2,(-this .getHeight())/2,th(),ght());//使之居于 屏幕正中央 izable(false); dowListener(tance()); } publicstaticvoidmain(String[]args){//主函数 newFileCut(); } } classBrowseSourceFileimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ try{ JFileChooserdf=newJFileChooser("请选择要分割的文件:"); if(eKind==1) eSelectionMode(_ONLY); if(eKind==2) eSelectionMode(_AND_DIRECTORIES); veDialog(newJPanel()); ible(true); t(ectedFile().toString()); if(ectedFile().isDirectory()){//当为文件夹时 File[]aimFiles=ectedFile().listFiles(); String[]strFiles=new String[ectedFile().listFiles().length]; for(inti=0;i strFiles[i]=aimFiles[i].getName(); t("文件夹名称:" +ectedFile().getName()+"n子文件:n"); for(inti=0;i (strFiles[i]+"n"); } if(ectedFile().isFile()){//当为文件时 t("该目标是一个文件n文件夹名称:n" +ectedFile().getName()+"n文件大小:" +ectedFile().length()+"Bytesn" +newDate(ectedFile().lastModified())); } }catch(Exceptionex){ t("n找不到指定文件或文件夹!"); } } } classSplitItemListenerimplementsItemListener{//分割文件功能 publicvoiditemStateChanged(ItemEvente){ eKind=1; booleanbool=true; bled(bool); bled(bool); t("源文件:"); t("目标目录:"); bled(bool); bled(bool); bled(bool); bled(bool); } } classUnionItemListenerimplementsItemListener{//合并文件功能 publicvoiditemStateChanged(ItemEvente){ eKind=2; booleanbool=false; bled(bool); bled(bool); t("分块文件目录:"); t("合成文件目录:"); bled(bool); bled(bool); bled(bool); bled(bool); } } classBigOrSmallItemListenerimplementsItemListener{//按大小分割 publicvoiditemStateChanged(ItemEvente){ d=1; bled(true); } } classFileNumberItemListenerimplementsItemListener{//按数目分割 publicvoiditemStateChanged(ItemEvente){ d=2; bled(false); } } classSourceActionListenerimplementsActionListener{//源文件 publicvoidactionPerformed(ActionEvente){ try{ JFileChooserjfc=newJFileChooser(); if(eKind==1){//文件分割模式,只能选择文件 logTitle("请选择要分割的文件"); eSelectionMode(_ONLY); } if(eKind==2){//文件合并模式,可选择文件或文件夹 logTitle("请选择要合并的文件或其所在文件夹"); eSelectionMode(_AND_DIRECTORIES); } enDialog(newJPanel()); ible(true); Stringsource=ectedFile().toString(); t(source); if(ectedFile().isDirectory()){//当为文件夹时 File[]aimFiles=ectedFile().listFiles(); String[]strFiles=newString[]; for(inti=0;i<;i++) strFiles[i]=aimFiles[i].getName(); t("文件夹名称为:" +ectedFile().getName()+"n子文件:n"); for(inti=0;i<;i++) (strFiles[i]+"n"); } if(ectedFile().isFile()){//当为文件时 e .setText("该目标是一个文件:n文件名:" +ectedFile().getName() +"n文件大小:" +ectedFile().length() +"Bytesn最后修改时间:" +newDate(ectedFile().lastModified()) +"n"); } }catch(NullPointerExceptionnpe){ return;//直接关闭窗体退出的情况 }catch(Exceptionexception){ t("找不到指定文件或文件夹!"); } } } classTargetActionListenerimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ JFileChooserjfc=newJFileChooser(); ible(true); if(eKind==1){ logTitle("请选择分割后文件存放目录"); } if(eKind==2){ logTitle("请选择合并后文件存放目录"); } eSelectionMode(ORIES_ONLY); enDialog(newJPanel()); t(ectedFile().toString()); } } classCalcuActionimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ ator("calc"); } } classEnterActionimplementsActionListener{ publicvoidactionPerformed(ActionEvente){//调用核心功能代码 if(eKind==1) e(); else ile(); } } classCancelActionimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ t(""); t(""); t(""); t(""); } } classClearActionimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ t(""); t(""); t(""); } } classProcessFile{ publicstaticvoidcutFile(){//文件分割 intfileSize=0,fileNumber=0; t("文件分割开始...n"); Filesource=newFile(t().replace("","/")); if(d==1){/////按文件长度分割 if(ectedItem()=="MB") fileSize=(int)(loat(ield1 .getText())*1024*1024); elseif(ectedItem()=="KB") fileSize=(int)(loat(ield1 .getText())*1024); elseif(ectedItem()=="B") fileSize=(int)(loat(ield1 .getText())); n("dierci:"+fileNumber+"wenjianchangdu:" +()); fileNumber=(int)(()/fileSize); if(()%fileSize!=0){ fileNumber++; } } if(d==2){ fileNumber=nt(t()); fileSize=((int)(()/fileNumber))+1; } File[]newFile=newFile[fileNumber]; try{ intcount=0,i=0; byte[]bueff=newbyte[fileSize]; FileOutputStreamout=null; FileInputStreamin=newFileInputStream(source); Filef=newFile(t().replace("","/")); if(!()) NewFile(); for(i=0;i<;i++){ ("正在创建第"+(i+1)+"个文件...n"); newFile[i]=newFile(t().replace( "","/"),e()+"-"+i+"-split"); } i=0; while((count=(bueff,0,fileSize))!=-1){ ("正在写入第"+(i+1)+"个文件...n"); out=newFileOutputStream(newFile[i]); (bueff,0,count); (); i++; } (); ("哈哈,分割成功了!n"); }catch(Exceptione){ ("唉,为什么分割失败呢?n"); } } publicstaticvoidunionFile(){//文件合并 //输出流的目标文件 ArrayListal=newArrayList(); intcount,fileNumber=0;//用于判断文件合并是否结束 File[]unionFiles; FileoutFile=newFile(t()); if(ctory()) outFile=newFile(outFile,"union"); FileInputStreamin=null;//输入流 FileOutputStreamout=null;//输出流 byte[]buff=newbyte[1024];//用于读写,相当一个缓冲区 t("开始合并文件......n"); Filesource=newFile(t()); //添加的是要合并文件的文件名 if(()){ try{ out=newFileOutputStream(outFile,true);//创建输出硫 in=newFileInputStream(source);//创建输入流 while((count=(buff,0,1024))!=-1){ (buff,0,count); } (); (); ("哈哈,合并成功了!n"); }catch(Exceptione){ ("唉,为什么合并失败呢!n"+sage()); } } //添加的是要合并文件所在目录 if(ctory()){ Fileresult; File[]fileList=les(); for(inti=0;i<;i++){ if(fileList[i].getName().endsWith("-split")){ (fileList[i]); fileNumber++; } } } try{ inttemp=0; out=newFileOutputStream(newFile((0).getAbsolutePath() .replace("-0-split",""))); for(Iteratoriter=or();t();){ ("正在对第"+(++temp)+"个文件进行合 并......n"); in=newFileInputStream((File)()); while((count=(buff,0,1024))!=-1){ (buff,0,count); } (); } (); ("哈哈,合并成功!n"); }catch(FileNotFoundExceptionfnfe){ ("唉,为什么合并失败呢!n"+sage()); }catch(IOExceptionioe){ tackTrace(); ("唉,为什么文件失败呢!n"+sage()); } } } classMyCanvasextendsCanvas{//加载顶部图片 //由tool负责获取图像. staticImagemyimage=aultToolkit().getImage(""); MyCanvas(){ setSize(438,45); } publicvoidpaint(Graphicsg){ age(myimage,0,0,th(this),myimage .getHeight(this),this); } } classMyWindowListenerimplementsWindowListener{ //利用singleton(单态)模式获取唯一对象 privatestaticMyWindowListenermwl=newMyWindowListener(); privateMyWindowListener(){ } publicstaticMyWindowListenergetInstance(){ returnmwl; } publicvoidwindowActivated(WindowEvente){ } publicvoidwindowClosed(WindowEvente){ } publicvoidwindowClosing(WindowEvente){ (0);//关闭窗体,退出程序 } publicvoidwindowDeactivated(WindowEvente){ } publicvoidwindowDeiconified(WindowEvente){ } publicvoidwindowIconified(WindowEvente){//最小化到托盘图标 dow().dispose(); esktopTray(); } publicvoidwindowOpened(WindowEvente){ } } classDesktopTray{//实现托盘图标 privatestaticDesktopdesktop; privatestaticSystemTrayst; privatestaticPopupMenupm; privatestaticTrayIconti; publicstaticvoidcreatDesktopTray(){ if(topSupported()){//判断当前平台是否支持Desktop类 desktop=ktop(); } if(orted()){//判断当前平台是否支持系统托盘 st=temTray(); //定义托盘图标的图片 Imageimage=aultToolkit().getImage(""); createPopupMenu(); ti=newTrayIcon(image,"chenwei",pm); try{ (ti); }catch(AWTExceptionex){ tackTrace(); } } } publicstaticvoiddisposeDesktopTray(){ (ti);//移出托盘图标 } publicstaticvoidsendMail(Stringmail){ //查看系统是否支持desktop,能的话调用系统的邮件系统 if(desktop!=null&&orted()){ try{ (newURI(mail)); }catch(IOExceptionex){ tackTrace(); }catch(URISyntaxExceptionex){ tackTrace(); } } } publicstaticvoidcalculator(StringproName){ //调用系统的计算器 Runtimert=time(); try{ (proName); }catch(IOExceptione){ tackTrace(); } } publicstaticvoidcreatePopupMenu(){//托盘的弹出菜单 pm=newPopupMenu(); MenuItemshowWindow=newMenuItem("显示窗体"); ionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ disposeDesktopTray(); newFileCut(); } }); MenuItemcalculator=newMenuItem("计算器"); ionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ calculator("calc"); } }); MenuItemsendMail=newMenuItem("联系我"); ionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ sendMail("mailto:chenwei_computer@"); } }); MenuItemexitMenu=newMenuItem("退出"); ionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ (0); } }); (showWindow); (calculator); (sendMail); arator(); (exitMenu); } } 4.程序运行: 分割实例: 现系统D盘中有如下文件: 设置分割参数: 分割成功提示: 分割后(最下面的为合并后的文件): 该程序最小化到托盘的情况: 小结:此文件的分割、合并程序主要使用到的知识点有: A、文件输入输出流(事务处理的核心) B、布局管理器(包括FlowLayout()、BorderLayout()、GridLayout()、box) C、监听与事件(选择组件事件、按钮、窗体) D、弹出菜单与托盘(如Desktop与SystemTray类等) 第四部分:课程设计总结 继C++之后学习Java程序设计语言会感觉很轻松,因为Java与C++语法类似,并把 C++中一些较低级和较难以理解的功能都去掉了,如多继承、指针等,同时Java增强了部分 功能,如“+”运算符的重载。对于初学Java的人而言,难点是Java中的引用、初始化 一个类过程等。总的来说,Java其易于学习、高效率的执行方式、平台无关性、分布式与 高安全性及其丰富的API文档和类库等特点都说明Java是程序设计语言的伟大进步的表 现。 可以说这么说,本次课程设计综合考察了我们对Java程序设计知识的掌握熟练程度和 实际运用能力。其间,涉及到了Java中的绝大多数的知识点,如Java图形用户界面设计、 Java的异常处理机制、Java中的多线程程序设计、Java输入输出流等。 程序实现的关键在于功能的合理划分以及各个包或者类之间的通讯问题,只要分析清楚 这两点,剩下的就是按部就班的写代码了。所以设计是关键。 功能实现了,再就是如何对程序进行性能优化的问题。如有的类需要多个对象实例,这 时我们就可以使用Singleton模式产生唯一的对象实例,如“文件分割※合并器”中 MyWindowListener类;文件操作中加入缓冲机制;对与图像可以使用使用双缓冲区等等。 学习Java,我推荐使用“六步走”的方法,循序渐进: 第一步是安装好JDK,写一个HelloWorld。其实JDK的学习没有那么简单,关于JDK 有两个问题是很容易一直困扰Java程序员的地方:一个是CLASSPATH的问题,其实从原理 上来说,是要搞清楚JRE的ClassLoader是如何加载Class的;另一个问题是package和 import问题,如何来寻找类的路径问题。把这两个问题摸索清楚了,就扫除了学习Java和 使用JDK的最大障碍。推荐看一下王森的《Java深度历险》,对这两个问题进行了深入的探 讨。第二步是学习Java的语法。第三步是学习Java的面向对象的编程语言的特性的地方。 比如继承,构造器,抽象类,接口,方法的多态,重载,覆盖,Java的异常处理机制。第 四步就是熟悉Java的类库。第五步,JavaWeb编程。第六步,J2EE编程。 总之,作为一门程序设计语言,Java的学习务必要做到多看多写多想多请教。 多看,看高手、大师的程序,借鉴其解题思路和程序架构;多写,学习程序设计很重要 的就是要自己亲自动手写代码,切忌犯眼高手低的弊病,而且这样记忆非常深刻;多想,程 序调试中出现一些“莫明其妙”的问题,为什么会这样而不是那样;多请教:程序设计说到 底是要彻底搞清设计该语言的人的思想,遇到问题想不通应该请教同学、老师等。这样可达 到事半功倍的目的。 参考资料: 1.耿祥义.2004.7.《Java2实用教程》北京:清华大学出版社 2.《JAVA与模式》 ann,GaryCornell,August,va2VolumeI7thEdithon; August17,va2VolumeII-AdvancedFeatures -DDU