Java课程设计图片浏览器.docx
《Java课程设计图片浏览器.docx》由会员分享,可在线阅读,更多相关《Java课程设计图片浏览器.docx(18页珍藏版)》请在冰豆网上搜索。
Java课程设计图片浏览器
黔南师院计科系实验报告
《易木图片浏览器》
——《Java程序设计》课程设计报告
系别:
计算机科学系班级:
B11计科班
学生姓名:
林元兵学生学号:
1108075150
指导教师:
罗刚设计日期:
2013年6月
一、课程设计目的:
1、复习、巩固Java语言的基础知识,进一步加深对Java的理解和掌握;
2、将学习Java中的抽象概念与实际动手编程相结合,锻炼学生的分析解决实际问题的能力,培养正确的编程习惯和能力;
3、培养学生自主学习能力、创新意识和创新能力。
二、课程设计要求:
1、首先要对课程设计题目进行前期分析,规划好所要制作的类、需要实现的功能、需要编写哪些类来实现、类和类之间有什么关系(请对这部分内容进行简单叙述、可以使用UML图);
2、完成的程序要进行相应的的测试,功能要完整,设计要合理,对测试出现的问题进行适当处理,使程序能正确运行;
3、设计报告的写法要求:
Ø对本次设计/编程的大体思路进行文字描述,并摘抄关键语句;
Ø使用GUI编程的,将主要代表界面进行截图放于文档中,没有使用GUI编程的请画出类图,流程图等说明;
Ø对本次Java的学习和课程设计进行总结。
4、提交方式:
设计报告文档电子版和源程序,统一交到班长或者学习委员处。
5、提交时间:
6月28日。
目录
1、项目运行系统要求
2、项目功能分析
3、项目文件(类)说明
3.1、PictureView类
3.2、PictureViewWin类
3.2.1、PictureViewWin()方法
3.2.2、createTop()方法
3.2.3、createCenter()方法
3.24、createBottom()方法
3.24、reSiziPicture()方法
3.2.5、actionPerformed()方法
3.3.6、run()方法
3.3、ReName(内部类)
3.4、musicPlay类
3.4.1、musicPlay()方法
3.4.2、actionPerformed()方法
3.5、SettingWin类
3.6、Help类
4、项目演示
5、总结
1、项目运行系统要求
在运行该程序前,必须先安装JDK,在源文件的的根目录下有jdk-6u16-windows-i586.exe文件,该文件为jdk1.6版本,安装好该文件后即可运行该程序。
但该程序中的背景音乐仍不能播放,因为音乐的播放需要JMF的类包,JMF是Java的媒体框架,它提供了先进的媒体处理能力,从而扩展了Java平台的功能。
在源文件的的根目录下有jmf-2_1_1e-windows_i586.exe文件,该文件是jmf的安装包,要使用背景音乐功能,必须先安装该安装包。
2、项目功能分析
该项目为一个图片浏览器(易木图片浏览器)。
本浏览器可以浏览常见的图片文件,图片文件可以进行复制、移动、删除、重命名等操作,在播放图片是可以选择下一张,上一张,或者幻灯片播放,播放是循环播放,即当播放到最后一张(第一张)时,点击下一张(上一张)软件自动会播放到第一张(最后一张),当改变窗体使窗体大小小于图片大小时,图片会自动缩放适应窗体(不同步,当前图片不会缩放,仅当播放到下一张时才会缩放)。
本浏览器其中一个最大的特点是在播放图片的同时,也可以播放背景音乐。
音乐播放功能仅支持MP3和WAV可以打开音乐文件播放,通过下一首、上一首可以播放当前目录下的所有支持的音乐文件,同时,可通过暂停或停止播放功能来关闭背景音乐。
该图片浏览器可通过设置默认值来设置幻灯片播放的类型、幻灯片播放的时间间隔、以及默认的背景音乐。
3、项目文件(类)说明
该项目分为5个类,分别为:
PictureView类、PictureViewWin类、musicPlay类、SettingWin类和Help类。
其中,在PictureViewWin类中有一内部类ReName类。
类之间的关系图如下:
PictureView
PictureViewWin
ReName(内部类)
Help
SettingWin
musicPlay
3.1、PictureView:
PictureView类是主窗体,其内部仅有构造方法PictureView()和main()方法。
构造方法主要是定义了窗体的大小、位置、标题等。
mian方法,匿名实例了一个PictureView类的对象,函数体为:
newPictureView();。
3.2、PictureViewWin
PictureViewWin()
PictureViewWin类是本项目的核心,其大部分功能均有该类实现。
PictureViewWin类是继承了JPanel类而成为一个面板。
在该类中共含有7个方法,分别为:
构造方法:
PictureViewWin(),创建面板的顶部:
createTop()、创建面板的中部:
createCenter()、创建面板的底部:
createBottom()、改变图片的大小:
reSiziPicture()、事件的处理:
actionPerformed()、线程:
run()。
各个函数的关系如图:
createBottom()
createTop()
createCenter()
run()
reSiziPicture()
actionPerformed()
(图中的箭头方向表示被调用的函数)
3.2.1、PictureViewWin()
PictureViewWin()方法为构造方法,通过调用
createTop(),createCenter()和createBottom()方法,分别生成pnlTop面板、pnlCenter面板、pnlBottom面板,然后使用边框布局管理器:
BorderLayoutbl=newBorderLayout();
this.setLayout(bl);
this.dd(pnlTop,BorderLayout.NORTH);
this.add(pnlCenter1,BorderLayout.CENTER);
this.add(pnlBottom1,BorderLayout.SOUTH);
将这三个面板加入PictureViewWin面板中
3.1.2、createTop()
createTop()方法主要是将菜单栏和工具栏加入面板中。
其中菜单栏使用到JMenuBar类,声明并实例化为mbCaiDan对象,然后再将各个菜单加入到其中。
在主菜单中有“文件”菜单、“工具”菜单和“帮助”菜单,而文件菜单中包含了打开、另存为、移动到...、重命名和删除,工具菜单中包含了使用画图程序打开、选择其他程序打开和设置。
在帮助菜单中包含了帮助。
首先将子菜单加入到主菜单中,使用JMenuObj.add(JMenuItemName)加入到主菜单中,例如:
btnWenJian.add(btnDaKai);//将打开子菜单加入文件主菜单中
再将主菜单使用JMenuBarObj.add(JMenuName)将主菜单加到菜单栏中,例如:
mbCaiDan.add(btnWenJian);//将文件菜单加入菜单栏中
如此将所需的菜单均加入到菜单栏中,即完成了菜单栏的制作。
在工具栏,添加了一个音乐播放的工具控件,在createTop()
方法里声明并实例化MusicPlay类的对象。
制作好菜单栏和工具栏,将他们分别放在面板pnlMenu和pnlTool
然后再使用BorderLayout布局管理器将这两个面板加入到pnlTop面板中,实现代码如下:
BorderLayoutgl=newBorderLayout();
pnlTop.setLayout(gl);
pnlTop.add(pnlMenu,BorderLayout.NORTH);//加入菜单栏
pnlTop.add(pnlTool,BorderLayout.SOUTH);//加入工具栏
即完成了主面板的顶部的制作。
在菜单栏和工具栏中的按钮均使用到了本类的单击事件。
在主面板声明时,已实现了接口ActionListener类的方法,并重写了ActionListener类的actionPerformed()方法,在菜单栏里的按钮,通过给各按钮监听本类的事件,从而实现相应的功能。
在actionPerformed()方法里说明相应功能的实现。
而在工具栏的按钮,则通过监听musicPlay类的actionPerformed()方法而实现了相应的功能。
在musicPlay类里再说明。
3.2.3、createCenter()
createCenter()方法主要完成图片的显示和图片的播放控制,播放控制包括上一张、下一张和幻灯片播放。
其所有组件均放在pnlCenter面板之上,而pnlCenter面板由一个用于显示图片的标签lbPictrue和用于放置图片播放控制的按钮的面板pnlCenterBottom,然后使用GridBagLayout布局管理器将两个组件放入pnlCenter面板中,而在将两个面板加入到pnlCenter时,还使用了GridBagConstraints布局管理器加以控制,实现代码如下:
//声明布局管理器
GridBagConstraintsgbc=newGridBagConstraints();
GridBagLayoutgbl=newGridBagLayout();
gbc.weighty=100;
//设置图片面板在y轴占的网格数,使控制按钮一直在窗体的下方
gbc.gridwidth=GridBagConstraints.REMAINDER;
//指定为该行最后一个组件
gbl.setConstraints(lbPictrue,gbc);
pnlCenter.add(lbPictrue);//添加显示图片的标签
gbc.weighty=1;
gbl.setConstraints(pnlCenterBottom,gbc);
pnlCenter.add(pnlCenterBottom);//添加按钮面板
其中在本项目中,播放控制的按钮使用了图片作为按钮。
使用
btnShangYiZhang=newJButton();//实例化上一张按钮
btnShangYiZhang.setIcon(newImageIcon("huanDengPian.png"));//将按钮设置为图片
btnShangYiZhang.addActionListener(this);//给按钮添加本类监听器
即可将图片转换为按钮并添加监听器。
上述过后,完成了面板pnlCenter的制作。
3.2.4、createBottom()
createBottom()方法中主要的是显示图片的信息,包括图片的名称,大小,尺寸和最后编辑时间,这的显示均通过标签实现,但播放图片时,程序会读出当前文件的相应属性,然后通过:
lbFileName.setText("文件名:
"+files[index].getName());
lbFileSize.setText("文件大小:
"+
files[index].length());
lbFileEditTime.setText("最后编辑时间:
"+newSimpleDateFormat("yyyy/MM/dd").format
(files[index].lastModified()));
//最后编辑时间,并指定为年/月/日的格式
lbFileDimensions.setText("尺寸:
"+pictureWidhOld+"*"+pictureHigeOld);
//显示图片尺寸
其中pictureWidhOld和pictureHigeOld是通过在reSiziPicture()方法里的:
pictureWidhOld=inPictrueFile.getIconHeight();
pictureHigeOld=inPictrueFile.getIconWidth();
方法来获得,因每次显示图片前,总会先调用reSiziPicture()方法,所以,每次均能得到当前图片相应的信息。
然后显示出来。
3.2.5、reSiziPicture()
reSiziPicture()方法主要是但图片大于窗口时,对图片进行一定的缩放以适应窗口。
该方法中为了图片缩放时不变形,首先计算出原始图片的宽高比:
pictureRatio=(float)pictureWidh/pictureHigh;//图片的宽高比
显示图片的面板的宽高:
pnlCenterHigh=pnlCenter.getHeight();
pnlCenterWidh=pnlCenter.getWidth();
然后判断图片的宽或高是否大于了显示图片的面板的大小,if(pictureHigh>pnlCenterHigh)
{
pictureHigh=pnlCenterHigh-35;//调整图片的高pictureWidh=(int)(pictureHigh*pictureRatio);//调整图片的宽度
}
if(pictureWidh>pnlCenterWidh)
{
pictureWidh=pnlCenterWidh-10;
pictureHigh=(int)(pictureWidh/pictureRatio);
}
即完成了退图片的缩放。
3.2.6、actionPerformed()
actionPerformed()方法里,主要完成了菜单按钮里功能和播放控制的功能。
菜单栏:
打开:
在打开按钮时,打开文件选择器,并将选择的图片的文件夹下的所有图片文件均读出来用文件数组files存放,其获取当前文件夹下的所有图片的代码如下:
tempFiles为当前文件夹下的所有文件,fileFormats为图片文件格式的数组,
其中:
File[]fileTemp=newFile[tempFiles.length];//获取当前文件夹下的所有文件;String[]fileFormats=newString[]{".jpg",".JPG",".gif",".GIF",".png",".PNG",".jpeg",".JPEG"};
//设置可以读取的图片文件格式
for(Filefile:
tempFiles)
{
for(Stringtemp:
fileFormats)
{
if(file.getName().endsWith(temp))
{
try{
fileTemp[pictureSum++]=file;
//如果文件格式为图片格式,则将该文件放入数组中
}
catch(Exceptione2){}
}
}
File[]files=newFile[pictureSum];
for(inti=0;fileTemp[i]!
=null;i++)
{
files[i]=fileTemp[i];//将图片存放到files数组中
}
另存为:
使用保存文件对话框获得要保存到路径,然后使用二进制输入输出流将文件重新存到指定的位置:
FileInputStreamfin=newFileInputStream(files[index]);//以当前文件实例化输入流
FileOutputStreamfout=newFileOutputStream(file);//实例化输出流
byte[]b=newbyte[128];
while(fin.read(b)!
=-1)//读入文件并判断是否读完
{
fout.write(b);//写出文件
}
移动到:
移动到功能是在另存为功能之上在把当前文件删除即可,即files[index].delete();//删除文件
重命名:
在ReName类里说明
删除文件:
使用files[index].delete();即可删除文件
使用画图程序打开和使用其他程序打开:
该功能指定将当前文件使用外部程序打开。
使用:
Runtime.getRuntime().exec(程序名+文件名),例如使用画图程序打开:
Runtime.getRuntime().exec("mspaint1.jpg");//使用画图程序打
设置:
在SettingWin类里说明
帮助:
使用一个窗体显示制作人的信息,在Help类里说明
图片播放控制:
上一张和下一张:
读取当前指向files数组的前一个文件,即files[index-1]文件,
然后通过该图片文件设置显示图片的标签lbPictrue的图标。
即:
if(index<0)index=pictureSum-1;//使循环播放,下一张改为:
if(index>=pictureSum)index=0;
FileinPictrueFile=new
ImageIcon(files[index].getAbsolutePath());
inPictrue=reSizePicture(inPictrue);
lbPictrue.setIcon(inPictrue);
幻灯片播放:
幻灯片播放首先创建一个线程,通过线程图片实现幻灯片播放。
具体实现在run()函数里说明。
3.6.7、run()
Run()函数控制图片自动播放。
首先从setting.ini文件读出播放的类型(随机或顺序)和播放时间间隔,然后根据设置,采用不同的播放方式和播放时间间隔(以秒为单位)。
顺序播放是采用下一张的播放方式,循环播放是随机产生一个随机数,然后根据这个随机数选择播放的文件。
其基本原理同下一张、上一张功能相同。
3.3、ReName(内部类)
ReName类是PictureViewWin类的一个内部类,主要实现对文件的重命名。
在该类中生成了一个窗体,窗体里放置里一个文本框用于输入重命名的文件名,和一个确定按钮,该按下该按钮实现将文本框的内容作为文件名重命名该文件。
该按钮的事件处理:
首先使用输入框的内容创建一个文件变量reFileName;然后使用files[index].renameTo(reFileName),将当前文件名称改为reFileName的文件名称。
3.4、musicPlay
musicPlay类是对背景音乐的播放控制,该类仅有两个方法:
构造方法musicPlay()和事件监听方法actionPerformed()。
播放控制包括:
上一首、播放、暂停、停止、下一首和打开文件。
musicPlay()方法中,主要是对空间的布置和添加。
使用到JToolBar类,将各个按钮实例化好后,添加到JToolBar对象中,再使用FlowLayout布局管理器将JToolBar对象添加到面板中:
setLayout(newFlowLayout());//设置布局管理器
his.add(musicBar);//添加JToolBar对象
actionPerformed()方法是对各个按钮的事件进行处理。
打开:
使用同打开图片相同的方法获取当前文件夹下的所有支持的音乐文件(*.mp3或者*.wav),并将选中的文件创建一个Player类的对象,即创建播放器。
然后使用play()方法播放该音乐文件。
创建播放器并播放的实现代码:
player=Manager.createPlayer(new
File(musicFilePath).toURI().toURL());//创建播放器
player.prefetch();//将文件载入缓存中
player.start();//播放音乐
播放:
若当前播放器已存在,则使用player.start();即可播放音乐
暂停:
使用player.stop()即可实现暂停音乐
停止:
使用player.stop()后重新以当前文件创建播放器
player=Manager.createPlayer(newFile(files[index].getAbsolutePath()).toURI().toURL());即完成音乐停止功能。
上一首:
获取当前播放的文件的前以个音乐文件,并以此文件重新创建播放器,然后播放
下一首:
同上一首原理相同
3.5、SettingWin
SettingWin类继承了JDialog,并实现了接口ActionListener,WindowFocusListener的方法。
该类的作用是设置图片的播放类型,幻灯片播放时间间隔,和默认背景音乐。
该设置是通过将设置的参数写出到setting.ini文件中保存,然后再使用是在将其中的内容读出来。
在实现接口ActionListener的方法actionPerformed()中,将读取的设置通过:
myFileWriter=newFileWriter("setting.ini");
myBufferedWriter=newBufferedWriter(myFileWriter);
myBufferedWriter.write(string);//将设置内容写到内存缓冲区
myBufferedWriter.flush();//将缓冲区的内容写到文件中去
myBufferedWriter.close();//关闭写出流
写出到setting.ini文件中
在实现WindowFocusListener类的windowGainedFocus()(窗体获得焦点)方法时,如果setting.ini文件存在(即已设置过),则读出setting.ini的内容填充到相应的输入框中去,如果该文件不存在,这这些框中将使用默认值。
然后可进行更改,单击“确定”即可将设置重新写到setting.ini文件中
3.6、Help
Help类中,是一个单纯的窗体,通过在窗体上添加标签,显示相关的信息。
4、项目演示
开始进入界面:
菜单:
打开图片:
播放图片:
循环播放:
音乐停止:
音乐播放:
音乐暂停:
设置:
帮助:
保存文件:
删除文件:
5、总结
这次是一次课程设计,但是我感觉这更像是我们的一次实践,学了几个高级语言都没感觉学到了什么,但是通过这次的课程设计,我看到了我做出来的东西,非常的开心。
虽然在这次的课程设计上我花了很长的时间和精力,并且做出来的东西并不是很漂亮、功能很完善,还存在很多的缺点,但是我还是很觉得很值得,因为在这次的课程设计中我基本掌握了常见的布局管理器的使用,对事件的处理,对文件的操作等等的知识。
这次的课程设计,我综合使用了现在所学的东西,我不仅仅是学到了很多java以前没学过的知识,还回顾了许多以前的东西。
并且,通过这次课程设计我更加感受到java语言的优略,让自己更加明确自己以后的路,认识自己的兴趣。