JAVA课程设计报告_1.docx
JAVA课程设计报告 计算机科学技术与工程系 Java课程设计 课 程 设 计 报 告 题目:简易媒体播放器 班级:0633081 姓名:063308123郭伟 063308164张志朋 063308125靳浩兵063308168周小晨指导教师:陈红军、赵军民 设计日期:2022.01.11-15 专业:计算机网络技术 目录 1 、引言. 错误!未定义书签。 2 、设计依据 . 3错误!未定义书签。 2.1设计平台 .错误!未定义书签。 2.2设计思想 .错误!未定义书签。 3、主要框架图、. 错误!未定义书签。 4、详细设计 (4) 5 、软件调试分析. 错误!未定义书签。 6 、源程序代码. 6错误!未定义书签。 7、执行结果 (15) 8、学习心得 . 15错误!未定义书签。 9、参考文献 . 16错误!未定义书签。 1、引言: 旨在考察在经过一个学期的学习,对JA V A知识的理解与应用。同时把所学的理论知识用于实战编程,进而培养同学们的动手能力和团结协作的团队意识。综合应用java语言的相关知识,独立设计中型的Java应用程序。通过本课程设计,使学生巩固JA V A课程设计课程学习的内容,掌握工程软件设计的基本方法,强化上机动手能力,闯过编程关。 2、设计依据: 1、设计平台 Eclipse是开发源码项目,由于其开放源码,任何人都可以免费使用,并可以在此基础上开发各自的插件,eclipse不只作为一个JA V A IDE的开发平台,而且是作为一个平台框架,各种各样的插件都可以安装在它上面,从而形成各种各样的工具,它有开源软件,使用插件功能,可以完成比较复杂的开发等优点。此Java程序设计就是在Eclipse环境平台下开发的。 Java API文档: Java API文档包含了Java的大部分类,方面查询不熟悉的类,所以它是一款不错的帮助文档! 2、设计思想 根据一学期对JA V A知识的学习,在Eclipse平台下,导入JMF包通过不断查询API 文档,编写媒体播放器在现有类的基础上组织一个新类。有时,我们也将组织称作“包含”关系。播放器主要针对面向对象,并且实现序列化接口,多线程等知识。 对象的组织具有极大的灵活性。新类的“成员对象”通常设为“私有”(Private),使用这个类的客户程序员不能访问它们。这样一来,我们可在不干扰客户代码的前提下,从容地修改那些成员。也可以在“运行期”更改成员,这进一步增大了灵活性。后面要讲到的“继承”并不具备这种灵活性,因为编译器必须对通过继承创建的类加以限制。 由于继承的重要性,所以在面向对象的程序设计中,它经常被重点强调。作为新加入这一领域的程序员,或许早已先入为主地认为“继承应当随处可见”。沿这种思路产生的设计将是非常笨拙的,会大大增加程序的复杂程度。相反,新建类的时候,首先应考虑“组织”对象;这样做显得更加简单和灵活。利用对象的组织,我们的设计可保持清爽。一旦需要用到继承,就会明显意识到这一点。 3、程序主要框架图 4、详细设计 图形分析: 本程序的播放器图形有五部分构成,即四个面板个和一个存放歌曲文件名的滚动面板JscrollPane。第一个面板存放时间标签(label)第二个面板存放三个按钮,第三个存放滑标(Jslider)第四个面板放置二个按钮。 模块功能: 本程序由十五个小模块构成,分别是:一:序列化接口二:一个MP3类继承了Jframe 同时实现了线程的Runnable接口,类里分别为:五个按钮的事件处理,滚动面板里组件的事件处理,窗口关闭事件,run( )方法,daoxu( )方法,fun( )方法,fen( )方法以及main( )主方法。Lujin类实现序列化就是方便它的属性值保存起来,适当的时候在取出来。首先,添加文件需要实现一个JFileChooser对象(文件选择器)对文件进行选择再判断是否是MP3格式,开始播放用到一JList对象的getSelectedIndex( )对列表里文件进行选择播放,同时又MediaPlayer对象的getDuration( ).getSeconds( )方法的时间二者之间都调用了线程sleep方法如果格式不对或没有选文件会弹出提示对话框。循环播放与上同。停止播放方法里通过设置属性调用stop()结束播放同时滑标左右播放时间消失。删除操作调用了removeAlementAt( )删除指定位置处的组件。其中的fun( )方法作用是对文件进行序列化。Daoxu( )是对文件的相对路径进行更改,改为纯文件名(*.MP3) 5、调试与测试: 调试要根据Eclipse中出错的信息以及所导入的javadoc文档还有一些快捷键进行快速调试,通过Eclipse运行平台自带的ru nJava Application进行运行程序。看运行结果是否与自己的预想是否相同再进行调试。 测试过程中遇到问题:(1)某些用到的类不熟悉,需要查找API (2)没法运行程序,看是否Eclipse配置的一些变量成功。(3)JMF包如何导入及使用,需上网查找。 6、程序源代码: import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import javax.swing.*; import javax.media.bean.playerbean.*; /这个包要用到JMF class Lujin implements Serializable /序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。 private static final long serialVersionUID = 1L; Vector a ;/CharSequence 是 char 值的一个可读序列 Vector b ; public Lujin(Vector vector, Vector mingcheng) a = vector; b = mingcheng; public class MP3extends JFrame implements Runnable private static final long serialVersionUID = 1L;/为了在反序列化时,确保类版本的兼容性 public JLabel shijian; private JSlider sldDiameter;/滑标 public MediaPlayer sound1; public JButton playSound, loopSound, stopsound; public JButton tj, sc; public JPanel jp1, jp2, jp3, jp4; public JList jl; int zongmiao=0; public Vector vector, mingcheng;/charsequence是char 值的一个可读序列 boolean fo = false, geshi = false; JLabel jl1, jl2, sj1, sj2;/sj1,sj2分别用在playSound(),loopSound(),stopsound()方法中显示与取消时间数据 JTextField jt1, jt2; int a = 0, b = 0, you = 1,mm=0,zong = 0; int fenzhong, miaozhong; public MP3() super("java简单音乐播放器"); sound1 = new MediaPlayer(); Container c = getContentPane();/AWT容器对象是一个可包含其他 AWT 组件的组件。 c.setLayout(new FlowLayout(); mingcheng = new Vector(); jp1 = new JPanel(); jp1.setBackground(Color.gray); shijian = new JLabel(); jp1.add(shijian); c.add(jp1); playSound = new JButton("开始播放"); loopSound = new JButton("循环播放"); stopsound = new JButton("停止播放"); jp2 = new JPanel(); jp2.setBackground(Color.BLUE); jp2.add(playSound); jp2.add(loopSound); jp2.add(stopsound); c.add(jp2); jp3 = new JPanel(); jp3.setBackground(Color.cyan); sj1 = new JLabel(); sj2 = new JLabel(); sldDiameter = new JSlider(SwingConstants.HORIZONTAL, 0, 100, 0);/一个让用户以图形方式在有界区间内通过移动滑块来选择值的组件 sldDiameter.setMajorTickSpacing(1);/此方法设置主刻度标记的间隔。 sldDiameter.setMinimum(2);/此方法设置次刻度标记的间隔。 sldDiameter.setPaintTicks(true);/确定是否在滑块上绘制滑道。 jp3.add(sj1); jp3.add(sldDiameter);/进度条左右时间标签。 jp3.add(sj2); c.add(jp3); vector = new Vector(); jl = new JList(mingcheng);/mingcheng为Vector类型使其显示指定 Vector 中的元素。 /显示对象列表并且允许用户选择一个或多个项的组件 jl.setVisibleRowCount(5);/指示要显示的首选行数(不要求滚动) jl.setFixedCellHeight(40);/列表中每个单元(组件)的高度 jl.setFixedCellWidth(265); jl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);/设置列表的选择模式,一次只能选择一个列表索引。一次只能选择一个列表索引。 JScrollPane scroll = new JScrollPane(jl); c.add(scroll);/某个组件添加到显示的容器中JScrollPane为Component类型,此为显示j1组件内容的JScrollPane tj = new JButton("添加"); sc = new JButton("删除"); jp4 = new JPanel(); jp4.setBackground(Color.green); jp4.add(tj); jp4.add(sc); c.add(jp4); playSound.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) if(jl.getSelectedIndex() >= 0) /只选择了列表中单个项时,返回该选择。选择了多项时,则只返回最小的选择索引 String yy = (String) vector.get(jl.getSelectedIndex();/返回向量中指定位置的元素 File ff = new File(yy); if (ff.exists() if (yy.matches("Ss*.mp3")| yy.matches("Ss*.MP3") /告知此字符串是否匹配给定的正则表达式 if (sound1 != null) a = 0; b = 0; you = 0; sound1.stop(); sound1.setMediaLocation("file:/" + yy);/yy改为ff fo = true; sound1.start(); geshi=true; try Thread.sleep(500); catch (InterruptedException eee) System.out.println("打断出错了"); zongmiao=(int)sound1.getDuration().getSeconds(); if(zongmiao>10000) try Thread.sleep(500); catch (InterruptedException ew) System.out.println("打断出错了"); String aa=fen(zongmiao); sj2.setText(aa); else JOptionPane.showMessageDialog(null,/弹出要求用户提供值或向其发出通 知的标准对话框 "播放文件格式的有错,无法播放建议删除");/调出标题为 "Message" 的信息 消息对话框 else JOptionPane.showMessageDialog(null, "此歌曲文件已经不存在,建议删除"); else JOptionPane.showMessageDialog(null, "请选择音乐文件"); ); loopSound.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) if (jl.getSelectedIndex() >= 0) String yy = (String) vector.get(jl.getSelectedIndex(); File ff = new File(yy); if (ff.exists() if (yy.matches("Ss*.mp3")| yy.matches("Ss*.MP3") if (sound1 != null) a = 0; b = 0; you = 0; sound1.stop(); sound1.setMediaLocation("file:/" + yy); fo = true; sound1.start(); geshi=true; try Thread.sleep(500); catch (InterruptedException we) System.out.println("中断一场!"); zongmiao=(int)sound1.getDuration().getSeconds(); if(zongmiao>10000) try Thread.sleep(500); catch (InterruptedException we) System.out.println("中断一场!"); String aa=fen(zongmiao); sj2.setText(aa); else JOptionPane.showMessageDialog(null, "播放文件格式的有错,无法播放建议删除"); else JOptionPane.showMessageDialog(null, "此歌曲文件已经不存在,建议删除"); else JOptionPane.showMessageDialog(null, "请选择音乐文件"); ); stopsound.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) a = 0; b = 0; you = 0; mm=0; geshi=false; fo = false; sldDiameter.setMaximum(100);/将滑块的最大值设置为 100。此方法将新的最大值转发给模型 sldDiameter.setValue(0);/将滑块的当前值设置为 0。此方法将新值转发给模型sj1.setText(null);/定义此组件将要显示的单行文本。如果 text 值为 null 或空字符串,则什么也不显示。 sj2.setText(null); if (jl.getSelectedIndex() >= 0) s ound1.stop(); ); tj.addActionListener(new ActionListener() public void actionPerformed(ActionEvent event) JFileChooser fileChooser = new JFileChooser(); / 实例化文件选择器 fileChooser .setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); / 设置文件选择模式,此处为文件和目录均可 fileChooser.setCurrentDirectory(new File("."); / 设置文件选择器当前目录,及mp3所位于得文件夹 fileChooser .setFileFilter(new javax.swing.filechooser.FileFilter() /设置当前文件过滤器,使用它过滤显示给用户的文件集合,以阻止不需要的文件出现在目录清单中public boolean accept(File file) / 可接受的文件类型 String name = file.getName().toLowerCase(); return name.endsWith(".mp3") | file.isDirectory(); public String getDescription() / 文件描述 return"音乐文件(*.mp3)" ); / 以下用到Vector类的作用 if (fileChooser.showOpenDialog(MP3.this) = JFileChooser.APPROVE_OPTION) / 弹出文件选择器,并判断是否点击了打开按钮String fileName = fileChooser.getSelectedFile() .getAbsolutePath(); / 得到选择文件或目录的绝对路径 vector.add(fileName);/先暂存一下文件名,vector只是一个中间过渡向量 StringBuffer buffer = Daoxu(fileName);/通过调用daoxu()返回*.MP3文件名 mingcheng.add(buffer);/再取出转换后的文件名 ); sc.addActionListener(new ActionListener() public void actionPerformed(ActionEvent event) if (jl.getSelectedIndex() >= 0) /j1属JList对象 mingcheng.removeElementAt(jl.getSelectedIndex();/删除指定索引处的组件 vector.removeElementAt(jl.getSelectedIndex(); jl.setListData(mingcheng);/listData - 包含要在列表中显示的项的 Vector );