《基于java的图片查看器设计面向对象程序设计课程设计报告册(含源文件)(38页).doc》由会员分享,可在线阅读,更多相关《基于java的图片查看器设计面向对象程序设计课程设计报告册(含源文件)(38页).doc(38页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-基于java的图片查看器设计面向对象程序设计课程设计报告册(含源文件)课程设计报告题目 面向对象程序设计课程设计 课 程 名 称 基于java的图片查看器设计 院 部 名 称 专 业 班 级 学 生 姓 名 学 号 课程设计地点 课程设计学时 指 导 教 师 金陵科技学院教务处-第 34 页成绩课程设计题目: 基于java的科学计算器设计 一、摘要(所进行设计工作的主旨、缘起、目的,设计工作的主要内容、过程,采用的方法及取得的成果。关键字(Key Words):一般35个,最能代表报告内容特征,或在报告起关键作用,最能说明问题的词组)主旨:进一步掌握java的面向对象的程序设计缘起:在学习了
2、java的面向对象的程序设计后,学校开了java的课程设计课,正好进一步掌握java的图形用户界面设计。目的:设计一个基于java的科学计算器关键字:java面向对象 科学计算器 图形用户界面二、目录目 录1、课程设计概述42、系统功能描述43、系统需求分析与设计43.1 系统需求分析43.2 系统设计43.2.1 系统总体设计43.2.2 程序详细设计54、系统测试和使用说明84.1 系统测试84.2 系统使用说明105、课程设计总结105.1 遇到的问题和解决方法105.2 心得体会10参考文献10附录11三、前言(说明本次课程设计课题意义,本课题相关技术特点、拟采用的方案或路线)该程序是
3、一个图形界面的简单的 java 计算器,使用人员能快捷简单地进行 操作.即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了 时间,对人们的生活有一定的帮助.可以进行简单的四则运算(加,减,乘,除, 以及求倒数,求相反数) ,有退格功能, 归零 表示初始化,界面颜色为灰白,该 程序支持键盘操作。随着科学技术的不断发展, 计算机已经成为我们工作学习和生活中不可缺少 的工具.文本编辑器是个人计算机最司空见惯的应用程序了,在学习了 Java 语 言之后,我决定使用 Java 语言编写一个简单的计算器,可以实现简单的运算功 能,满足日常基本的工作学习和娱乐需要. Java 是由 Sun 公
4、司开发的新一代纯面向对象的网络编程语言.其目标是建 立一种在任意种机器, 任一种操作系统的网络环境中运行的软件, 实行所谓的 程 序写一次,到处运行的目标.正因为如此,Java 已成为当今 Internet 上最流 行,最受欢迎的一种程序开发语言.Java 开发小组把 Java 按特性分为基本版,移动版,企业版,每个版本有一 个软件开发包. Java 基本版本叫 Java 2 标准版 (Java 2 Standard Edition,J2SE) , 它包含建立 Java 应用程序或者是 Applet 所需的应用程序编程接口(API) .Java 2 移动版(The Java 2 Mobile
5、Edition,J2ME)包含创建无线 Java 应用程序的 API.还有 Java 2 企业版(The Java 2 Enterprise,J2EE)是 J2SE 的增强版本, 包含建立多层架构应用程序 API。四、正文(包含所进行设计的整体内容)图片查看器1、课程设计概述为提高学生理论与实践相结合的能力,计电学院于2009年6月开展了为期两周的面向对象课程设计,针对对象为07级全体计科专业学生。本次实践教学采用学生集中在学校网络机房上机,指导老师指导的形式。要求学生用所学的面向对象程序设计语言JAVA来编写程序,实现特定功能,以加深对面向对象程序设计这个概念的理解。2、系统功能描述本次设计
6、的图片查看器实现了在用户选定的文件目录下循环浏览指定后缀的图片文件,并且可以对选择的图片进行放大,缩小,左旋,右旋,另存,彻底删除等操作。3、系统需求分析与设计3.1 系统需求分析随着数字产品渐进人们的生活,网络通信技术、图像处理技术以及多媒体技术的发展,越来越多的用户希望能够对已有的数字图片进行查看并能够实现简单的操作。本图片查看器以其简洁明了易操作的特点实现图片查看的基本功能,从而也就满足了用户的基本要求。3.2 系统设计3.2.1 系统总体设计(1)系统功能分析本系统要用到以下的Java编程技术实现的功能:图像显示功能:客户需要显示图片,这将由图像显示功能来完成。显示图片的时候,用到了双
7、缓冲技术来消除闪烁问题。(2)类图系统中用到了一些基本类、实现了一些接口。系统所用到的类如图1所示:PicViewerActionListenerJpanelJLabelJButtonImageBufferedImageGraphics2DStringJfilechooseAppletJava.awt.*Javax.swing.*Java.io.*Java.applet.*extendsimplementimport图1 系统类图3.2.2 程序详细设计(1)程序中引用的类JPanel类程序中定义了三个Jpanel类分别是:pathBar, picContainer, ctrBar。用于图片查
8、看器的整体布局。其中pathBar为顶部路径栏,picContainer为图片显示区域,ctrBar为底部控制栏。JLabel类程序中定义了类名为pathInfo的JLabel类,用于实现顶部路径栏,底部控制栏按钮的文字显示。JButton类程序中定义了多个JButton类:openbtn, prebtn, nextbtn, zoominbtn, zoomoutbtn, oripicbtn, angleleftbtn, anglerightbtn,exitbtn,deletebtn,sav;为查看器的按钮。Image 类程序中定义了名为pic的Image类用于对被查看的图片的操作。Buffer
9、edImage 类此类为用于显示的缓冲区图像。在对图像进行操作前,都先将图片读进预设的缓冲区,然后再显示在用户前端,这样虽然速度慢了点,但很好的消除了图片闪烁效果。Graphics2D 类此类与上面的BufferedImage类共同作用,通过运用双缓冲技术很好的消除屏闪问题。String类程序中运用了三个不同的String类,从而实现了需要查看的图片的路径的操作,并且在启动图片查看器时,图片的路径能够在路径栏显示出来。同时还设置了String 数组用于存储用户选定的目录下所有指定格式的图片,这样可以实现循环浏览图片等操作。(2)程序的构造方法及其实现因为图片查看器可以实现对图片不同的操作,程序
10、中构造了十多个方法以达到其目的。各构造方法相互联系共同完成图片查看器的各项功能。各个方法描述如下:public void init()本方法实现了对图片查看器的界面的整体布局及按钮的初始化。对页面的总体布局采用了以下主要代码进行实现:setLayout(new BorderLayout();add(pathBar, BorderLayout.NORTH); add(picContainer, BorderLayout.CENTER); add(ctrBar, BorderLayout.SOUTH); resize(640, 400);设置顶部路径栏,及其文字显示;代码如pathBar = ne
11、w JPanel();pathBar.setLayout(new BorderLayout();pathInfo.setText(图片查看器); pathBar.add(pathInfo);同时对图片显示区域,底部的控制栏的设置也运用了相似的代码进行实现,在此就不再重复。各按钮除了“打开”一按钮外,其他的各按钮均设置为false。这是因为只有“打开”图片后才能进行以下的像循环浏览,旋转,删除等操作。具体方法的实现见附件。public void actionPerformed(ActionEvent)在本方法中主要实现了用户对底部控制栏各按钮的点击后,图片查看器进行的相对应的操作反应。方法中一开
12、始用JButton click = (JButton) e.getSource();获取按键源,然后根据click与程序设定的已知的类进行比较决定进行相应的反应。if(click = openbtn);if(click = prebtn & pic != null);等一系列进行判断后,进行或是打开文件open()方法的调用;或是pre()方法的调用;其他各操作也大同小异,在此就不再赘述。方法的详细代码见附件。public void open()该方法实现了对用户选定的文件路径下的后缀为.jpg的图片文件的打开操作。同时能够对该路径下的一切符合条件的文件进行跟踪处理。方法中的核心在于一个过滤操
13、作:FileNameExtensionFilter filter = new FileNameExtensionFilter(*.JPG, jpg);这样就能实现.jpg文件的浏览了。在选定了图片后,相应的按钮值应该被赋值为ture,以便进行其他的操作。若没有选定图片则显示“没有选择图片”。public void save() throws IOException该方法是为了满足用户希望对图片进行另外存储的操作,通过用户自己的选择重新选定图片的存储路径。详细实现见附件中代码。 public void pre()及public void next()Pre与next方法实现了对当前图片的上一张下
14、一张的浏览。因为在第一次打开文件时就将该路径下所有符合要求的图片存储在String pics中。通过if(i = 0) i = pics.length-1; else i -;其中i为当前的图片位置数。通过dir = path + + picsi;获得文件的路径,然后调用loadImage(dir);此方法将在后面介绍;与上面的方法相对应的是此方法实现了对当前图片下一张的浏览,实现原理与上相同,if(i = pics.length-1) i = 0; else i+;通过调用loadImage(dir);一方法实现。public void picTrans()如果bufImage为空则直接返回
15、,之后进行过滤图像操作,2D仿射变换,设置仿射变换的比例因子transform.setToScale(scaleX, scaleY); 创建仿射变换操作对象,过滤图像,将目标图像存在filteredBufImage中,然后显示。public void zoomin()此方法实现了对当前的图片进行按设置比例缩小操作。在进行缩小操作前,先对图片的大小进行判断,看是否已经缩小到最小,若最小则显示提示信息“已经缩至最小!”;否则进行缩小操作。在此过程中调用了picTrans()方法,以及repaint(); 重绘组件的方法。public void oripic()及public void delete
16、()方法实现了将放大或缩小后的图片大小还原的操作。同时也调用了picTrans()方法,以及repaint(); 重绘组件的方法。具体的picTrans()方法将在下面详细描述。此方法具体实现见附件;public void delete()方法将图片彻底删除,删除后图片彻底被粉碎,回收站里面都不能找到。因此要慎用此按钮。public void angleleft() 及public void angleright()方法每次对图片进行45的向左向右的旋转操作。radius += -Math.PI / 2;用以控制,而这些操作后,每次都应oripicbtn.setEnabled(true),也就
17、是要将还原按钮赋值为真。public void loadImage(String fileName) 及public void exit()前一个方法通过增加图像到加载器中,创建原始缓冲区图像,创建bufImage的图形环境:bufImageG = bufImage.createGraphics();传输源图像数据到缓冲区图像中一些列的操作,对图片进行了加载操作;public void exit()方法是退出查看器的方法。 4、系统测试和使用说明4.1 系统测试使用eclipse运行程序时,会出现applet小程序的界面。并显示程序已启动。显示如图2:图2 程序开始时的界面单击“打开”按钮后的
18、效果图如图3:图3 选择图片文件多次单击“缩小”按钮后的效果图如图4:图4 图片缩小显示多次单击放大按钮后的效果图如图5所示:图5 图片放大显示4.2 系统使用说明由于本人的能力有限在制作此图片查看器时有许多没能完善的地方,因此客户在使用时应注意慎用删除与保存按钮,另外其他的操作只要单击按钮则行。特别值得注意原始按钮只有在对图片已经进行了放大或缩小的操作后其才是有效的。5、课程设计总结5.1 遇到的问题和解决方法在用JAVA编写程序时,我遇到了很多困难,对很多的接口,类,方法都不是很熟悉,只好采用查看API文档,一个一个进行对照学习,同时也上网查看了有关图片查看器的相关描述,还向同学请教了,翻
19、阅了相关的书籍。尤其是因为有些方法需要使用JDK1.6才行,所以在学校网络机房一开始不能运行,在安装了1.6版本后运行正常了。另外文件在打开时会有严重的频闪问题,在重写了public void update(Graphics g) this.paint(g);后解决了。5.2 心得体会在这次的面向对象程序设计课程设计中,我进一步熟悉了上一学期学习的JAVA语言中的包,类,方法:导入哪些包,继承哪些类可以实现什么方法等。深刻感受到了面向对象语言中类库的强大功能。但是由于自己掌握的知识有限,图片查看器的功能没有做到尽善尽美,尤其是删除操作,删除掉以后就没了,在回收站也找不到。还有就是单击“保存”按
20、钮后似乎就不能进行其他操作,但这样的情况或有或无。通过这次的课程设计,我懂得了要充分利用网络资源查找资料同时要多向同学请教,大家互相讨论进步得会很快。通过近两周多的努力,这次课程设计圆满的结束了,在这个过程中,我收获了很多的知识,同时也非常感谢杭志老师帮助与指导。在以后的学习中,我会更加努力的学好专业知识,并将所学知识用于实践当中去,以便牢固掌握知识。参考文献1叶核亚 java 程序设计实用教程(第四版) 电子工业出版社2百度文库 5.2算法实现package mypackage;import java.awt.BorderLayout;import java.awt.Color;import
21、 java.awt.Dimension;import java.awt.Font;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.text.DecimalFormat;import javax.swing.BorderFactory;import javax.swing.ButtonGroup;import javax.swing.JButton;import javax.swing.JCheckBoxMenuItem;im
22、port javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JPanel;import javax.swing.JRadioButtonMenuItem;import javax.swing.JTextField;public class Counter extends JFrame private JTextField tf;private JPanel panel1, panel2, panel3, p
23、anel4;private JMenuBar myBar;private JMenu menu1, menu2, menu3;private JMenuItem editItem1, editItem2, help1, help2, help3;private JRadioButtonMenuItem seeItem1, seeItem2;/单选框private JCheckBoxMenuItem seeItem3;/复选框private ButtonGroup bgb;private String back;private boolean IfResult = true, flag = fa
24、lse;private String oper = =;private double result = 0;private Num numActionListener;private DecimalFormat df;public Counter()super(科学计算器);/设置标题栏df = new DecimalFormat(#.#);/保留十位小数this.setLayout(new BorderLayout(10, 5);panel1 = new JPanel(new GridLayout(1, 3, 10, 10);panel2 = new JPanel(new GridLayou
25、t(5, 6, 5, 5);/5行6列panel3 = new JPanel(new GridLayout(5, 1, 5, 5);panel4 = new JPanel(new BorderLayout(5, 5); * 菜单栏myBar = new JMenuBar();menu1 = new JMenu(编辑(E);menu2 = new JMenu(查看(V);menu3 = new JMenu(帮助(H);menu1.setFont(new Font(宋体, Font.PLAIN, 12);menu2.setFont(new Font(宋体, Font.PLAIN, 12);menu
26、3.setFont(new Font(宋体, Font.PLAIN, 12); * 编辑栏editItem1 = new JMenuItem(复制(C) Ctrl+C);editItem2 = new JMenuItem(粘贴(P) Ctrl+V);editItem1.setFont(new Font(宋体,Font.PLAIN,12);editItem2.setFont(new Font(宋体,Font.PLAIN,12); * 查看栏seeItem1 = new JRadioButtonMenuItem(科学型(T);seeItem2 = new JRadioButtonMenuItem(
27、标准型(S);seeItem3 = new JCheckBoxMenuItem(数字分组(I);seeItem1.setFont(new Font(宋体,Font.PLAIN,12);seeItem2.setFont(new Font(宋体,Font.PLAIN,12);seeItem3.setFont(new Font(宋体,Font.PLAIN,12); * 帮助栏help1 = new JMenuItem(帮助主题(H);help2 = new JMenuItem(关于计算器(A);help1.setFont(new Font(宋体,Font.PLAIN,12);help2.setFon
28、t(new Font(宋体,Font.PLAIN,12);bgb = new ButtonGroup();/选项组menu1.add(editItem1);menu1.add(editItem2);menu2.add(seeItem1);menu2.add(seeItem2);menu2.addSeparator();/添加一条分割线menu2.add(seeItem3);menu3.add(help1);menu3.addSeparator();/添加一条分割线menu3.add(help2);myBar.add(menu1);myBar.add(menu2);myBar.add(menu3
29、);this.setJMenuBar(myBar);numActionListener = new Num();/实现数字监听 * 文本域,即为计算器的屏幕显示区域tf = new JTextField();tf.setEditable(false);/文本区域不可编辑tf.setBackground(Color.white);/文本区域的背景色tf.setHorizontalAlignment(JTextField.RIGHT);/文字右对齐tf.setText(0);tf.setBorder(BorderFactory.createLoweredBevelBorder();init();/
30、对计算器进行初始化 * 初始化操作 * 添加按钮private void init()addButton(panel1, 退格, new Clear(), Color.red);addButton(panel1, CE, new Clear(), Color.red);addButton(panel1, C, new Clear(), Color.red);addButton(panel2, 1/x, new Signs(), Color.magenta);addButton(panel2, log, new Signs(), Color.magenta);addButton(panel2,
31、7, numActionListener, Color.blue);addButton(panel2, 8, numActionListener, Color.blue);addButton(panel2, 9, numActionListener, Color.blue);addButton(panel2, , new Signs(), Color.red);addButton(panel3, 10n, new Signs(), Color.red);addButton(panel3, ln, new Signs(), Color.red);addButton(panel2, n!, new
32、 Signs(), Color.magenta);addButton(panel2, sqrt, new Signs(), Color.magenta);addButton(panel2, 4, numActionListener, Color.blue);addButton(panel2, 5, numActionListener, Color.blue);addButton(panel2, 6, numActionListener, Color.blue);addButton(panel2, , new Signs(), Color.red);addButton(panel2, sin,
33、new Signs(), Color.magenta);addButton(panel2, x2, new Signs(), Color.magenta);addButton(panel2, 1, numActionListener, Color.blue);addButton(panel2, 2, numActionListener, Color.blue);addButton(panel2, 3, numActionListener, Color.blue);addButton(panel2, -, new Signs(), Color.red);addButton(panel2, cos
34、, new Signs(), Color.magenta);addButton(panel2, x3, new Signs(), Color.magenta);addButton(panel2, 0, numActionListener, Color.blue);addButton(panel2, -/+, new Clear(), Color.blue);addButton(panel2, ., new Dot(), Color.blue);addButton(panel2, +, new Signs(), Color.red);addButton(panel2, tan, new Sign
35、s(), Color.magenta);addButton(panel2, 开立方根, new Signs(), Color.magenta);addButton(panel2, , numActionListener, Color.blue);addButton(panel2, e, numActionListener, Color.blue);addButton(panel2, , new Signs(), Color.orange);addButton(panel2, =, new Signs(), Color.red);JButton btns = new JButton(计算器);b
36、tns.setBorder(BorderFactory.createLoweredBevelBorder();btns.setEnabled(false);/按钮不可操作btns.setPreferredSize(new Dimension(20, 20);panel3.add(btns);/加入按钮addButton(panel3, MC, null, Color.red);addButton(panel3, MR, null, Color.red);addButton(panel3, MS, null, Color.red);addButton(panel3, M+, null, Colo
37、r.red);panel4.add(panel1, BorderLayout.NORTH);panel4.add(panel2, BorderLayout.CENTER);this.add(tf, BorderLayout.NORTH);this.add(panel3, BorderLayout.WEST);this.add(panel4);pack();this.setResizable(false);/窗口不可改变大小this.setLocation(300, 200);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); * 统一设置按
38、钮的的使用方式 * param panel * param name * param action * param colorprivate void addButton(JPanel panel, String name, ActionListener action, Color color)JButton bt = new JButton(name);panel.add(bt);/在面板上增加按钮bt.setForeground(color);/设置前景(字体)颜色bt.addActionListener(action);/增加监听事件 * 计算器的基础操作(+ - ) * param x
39、private void getResult (double x)if(oper = +)result += x;else if(oper = -)result -= x;else if(oper = )result *= x;else if(oper = )result /= x;else if(oper = =)result = x;tf.setText(df.format(result); * 运算符号的事件监听class Signs implements ActionListenerpublic void actionPerformed(ActionEvent e) * 用Action
40、Event对象的getActionCommand()方法 * 取得与引发事件对象相关的字符串String str = e.getActionCommand();/* sqrt求平方根 */if(str.equals(sqrt)double i = Double.parseDouble(tf.getText();if(i=0) * String.valueOf() 转换为字符串 * df.format() 按要求保留四位小数 * Math.sqrt() 求算数平方根tf.setText(String.valueOf(df.format(Math.sqrt(i);elsetf.setText(负数
41、不能开平方根);/* log求常用对数 */else if(str.equals(log)double i = Double.parseDouble(tf.getText();if(i0)tf.setText(String.valueOf(df.format(Math.log10(i);elsetf.setText(负数或0不能求对数);/* 开立方根 */else if(str.equals(开立方根)double i = Double.parseDouble(tf.getText();tf.setText(String.valueOf(df.format(Math.pow(i,1.0/3)
42、;/* 1/x求倒数 */else if(str.equals(1/x)if(Double.parseDouble(tf.getText() = 0)tf.setText(除数不能为零);elsetf.setText(df.format(1 / Double.parseDouble(tf.getText();/* sin求正弦函数 */else if(str.equals(sin)double i = Double.parseDouble(tf.getText();tf.setText(String.valueOf(df.format(Math.sin(i*Math.PI/180);/* co
43、s求余弦函数 */else if(str.equals(cos)double i = Double.parseDouble(tf.getText();tf.setText(String.valueOf(df.format(Math.cos(i*Math.PI/180);/* tan求正切函数 */else if(str.equals(tan)double i = Double.parseDouble(tf.getText();tf.setText(String.valueOf(df.format(Math.tan(i*Math.PI/180);/* n!求阶乘 */else if(str.equals(n!)double i = Double.parseDouble(tf.getText();if(i%2=0)|(i%2=1)/判断为整数放进行阶乘操作int j = (int)i;/强制类型转换int result=1;for(int k=1;k=j;