第一篇:JAVA课程设计报告_完整版
《JAVA面向对象程序设计》
课 程 设 计 报 告
(2011-2012学年第2学期)
系 别: 专业名称:
厦门理工学院计算机科学与技术系
10级网络工程1班
课程设计科目: 《JAVA面向对象程序设计》课程设计 学生姓名: 学 号: 指导教师: 成 绩: 完成时间:
崔建峰
2012年7月6日
题目JAVA程序课程设计
任务一
手机号码检测器
(一)设计任务与目标
任务:
手机号码是由11位数字构成,用户在输入手机号码时经常混乱输入若干位数字或字母,要求你编写一个程序检测用户所输入的手机号码是否符合规则。要求目标:
检测所输入的手机号码是否是11位 检测每一位是否都为数字。分析论证:
本题目要求对用户输入的手机号码进行检测,判断输入的正确性。曾经有做过类似字符比较的题目,可以借鉴。将字符的比较运用进来,把用户的输入字符和正确的进行比较。但是必须满足多次输入和错误提醒。同时还可以添加提示错误的位置和错误字符是什么。
程序正确运行时可以满足以上功能,基本可以达到题目要求了。
(二)方案设计与论证
为了满足多次输入的要求,将提示和输入的操作放在一个循环体中,我采用了do_whiele()循环。每次输入结束后提示是否继续输入。
在循环中逐步对输入的号码位数和字符类型进行检测。位数可以分超出和不足,并均给出错误提示。如果位数满足要求后对手机号码类型进行检测。一般手机号在0~9之间,所以不满足的字符将报错。通过将输入的整个字符串调用charAt(int i)方法对字符串逐位比较。
本程序的特点在于可以满足了多次输入和错误字符的显示(内容和位置)。在程序的调试过程中,有过多次输入正确的号码也会报错(还会报错0位错误),这是因为记录错误位子的变量放在错误条件下并且未在循环体中初始化为0。最终解决了此问题。
(三)程序框图或流程图,程序清单与调用关系
(四)程序运行的测试与分析
实现了多次输入和错误提示,可以判断输入的号码的错误位置及字符,错误类型,满足了设计构思要求。最终结果如下图:
实验结果截图:
(五)结论心得
实验过程中对于判断条件的选择出现了问题,开始时觉得要对输入的字符一个一个的比较,这样增加了难度也不方便实现。后面改成了将用户输入完成后的全部字符串当做整体后再来逐位比较。如果能做成手机外形的面板并能一个一个 3 的判断,只要输入错误字符马上提示,那功能将更加完善。
任务二
扑克牌
(一)设计任务与目标
任务:
设计一个Card类代表扑克牌,每张牌都有自己的花色和大小。创建一个DeskOfCards类保存54张扑克牌,设计洗牌、发一张牌、报告剩余牌数的方法。创建main方法测试你的程序。要求目标:
实现洗牌和发牌。
显示当前片面和剩余牌数。
分析论证:
本题目需要用到数组来存储一副纸牌,并需要用到随机数来代替随机发牌,曾经做过类似工作。现在需要将产生的随机数和字牌的大小和花色联系起来,可以通过数组来实现。同时还要达到可以循环发牌,并有发牌信息显示。
(二)方案设计与论证
根据题目要求,我准备在类Card中用数组存储一副牌(52张),考虑到扑克牌有花色和大小并都是固定的,所以用了两个字符串数组分别初始化花色和大小,再利用下标操作把花色和大小组合在一起,存放另在一个数组里(最终的纸牌组)。这样就有了一副完整纸牌了。
再创建另一个类DeskOfCard创建两个Card对象,通过在循环里的条件判断对对象进行操作:洗牌时就将纸牌数组和剩余牌数重新初始化(利用多余的那个对象)。发牌时用到随机数产生器,产生从0到51的整数和数组小标对应,每个元素代表一张牌。
测试过程中出现了无法显示牌面的问题,通过对象引用找不到具体的纸牌,后来在Card类中添加了getCard(int i)方法返回一张牌,实现了发牌和剩余牌数,并可以多次发牌。
(三)程序框图或流程图,程序清单与调用关系
(四)程序运行的测试与分析
从测试过程中达到了分析时的目的要求,实现了洗牌和发牌(显示牌面和剩余数量)。最终结果如下图:
实验结果截图:
(五)结论心得
实验过程中,开始没有将纸牌的大小和花色分开来定义,导致需要初始化52张牌,后俩采用了循环体将花色和大小进行组合达到了目的的同时又简化了代码,提高了可读性。本来希望最后的结果可以通过图片的方式显示纸牌,但纸牌的原图片两太大,实现过于繁琐,最终采用了简单的文字表示。希望今后有机会近一步完善,达到预期效果。
任务三
计算器
(一)设计任务与目标
任务:
参考第六章的实验题Telephone Keypad界面设计一个计算器。要求目标:
实现输入数字和运算字符并输出结果
结果由对应的运算得出,实现基本运算能力 分析论证:
通过设计一个界面展示一个计算器的功能,包括输入数字和符号并进行准确的运算得出理想的结果。在第六章中的Telephone Keypad实验中做过类似的界面只是实现的功能不一样,可在这个基础上加入运算功能即可实现要求。
(二)方案设计与论证
根据题目的具体要求,我设想通过之前的Telephone Keypad实验进行改进,除了需要加入一些按钮外,还要对具体的按钮功能进行设计。在Calculator类中进行了面板的设计,之间加入了需要的各个控件,并且加了ActionListener()类来做事件的触发类。
此类中通过event.getSource()方法与相应的按键进行对应,以此为判断条件来决定做什么操作。其中包括了被运算数、运算类型、运算数还有等号的事件。
为了可以输出信息还要加入JTextField控件来显示信息,信息通过一个字 6 符串变量来存取。两个JTextField控件分上下,上面显示最后的运算式(包括每次输入时均要逐步显示输入内容),下面显示最后的结果并以一定的格式输出。最后还要满足多次输入,因此设计了清楚按键,每次清楚后可以进行下一次的运算。
在程序的调试的过程中出现了,输出内容的错误。不能逐一的输出输入的内容,最后也没有在上面显示框中显示完整的运算式。通过检查,发现是字符串的添加位置和没有将内容在原有基础上增加,而是每次更新字符串。最终通过修改解决了问题。其间,还出现了按键功能的一些的错乱,都是小问题,多次调试后基本达到了一个简单运算器的功能。
(三)程序框图或流程图,程序清单与调用关系
(四)程序运行的测试与分析
测试过程中进行了多次的运算,包括加、减、乘、除。每次都可以逐一输出输入的内容并能得出正确的结果并输出。清除后可以再次运算,基本达到了预期要求。最终结果如下图: 实验结果截图:
(五)结论心得
本程序因为涉及的控件很多,所以排版和引用都要十分注意,不然容易引用错误,导致引用不到你所点击的那个按键等。还要注意在监听器里的条件判断时相应的操作要考虑清楚。为了界面美观和人性化,要将按键的顺序按一定的顺序排列不能随机添加。
本程序不足的地方在于运算类型只有加减乘除,并且不能再完成一次运算后立即进行下一次运算,必须清楚后重新开始。这些不足还有待改善。相信如果改进过后,这个计算器会达到更加完善的功能和实用性。
任务四
愤怒的小鸟
(一)设计任务与目标
任务:
愤怒的小鸟是一款“亿人迷”的游戏,据说大家喜欢它的原因在于大家喜欢抛物线胜过直线。例题8.15-8.16是笑脸图片直线运动的例子,请修改它在X轴和Y轴的运动轨迹,将它改成抛物线运动。
要求目标:
实现界面中小鸟打击目标
有准确的抛物线
可以多次并操作简单 分析论证:
在例题笑脸的运动中实现了图片按照一定的像素进行平移,到达一个目标地。所以可以以此为基础进行改进。对运动中的函数进行改进,将直线运动改成抛物线。并有效开始时出现提示。用户可以对图片的出发位置进行控制。
(二)方案设计与论证
为了达到预期的目标,我将创建了一个BirdPanel类来存放各种组件,主要是存入多张图片和一个十分重要的也是这个程序的核心——定时器Timer。这个游戏最终可以看到的效果是图片的移动,所以需要通过控制图片在面板中的位置来实现移动。
所以定时器就十分重要了,有了定时器就可以在间隔一段时间中多次触发事件,看到的也就是图片在不停地移动,最终到达目标。
在编写程序过程中,发现需要实现客户对图片初始位置的控制比较困难。所以为了节省时间就将图片的触发地限制在了固定位置。每次都将从这一位置触发,并进行抛物运动后,打中目标。这虽然使程序简单了,可在一定程度上牺牲了部分的功能。今后还有需要改进。
(三)程序框图或流程图,程序清单与调用关系
(四)程序运行的测试与分析
实验测试过程完成了游戏开始提示和小鸟图片的抛物运动,目标被打击后会场上变化。只是不能多次操作和随意拖拽小鸟的起始位置,这是一段的局限。最终结果如下图:
实验结果截图:
(五)结论心得
本题目中涉及的核心内容是定时器和图片坐标改变在(运动)的配合使用。通过对坐标的改变,并结合定时器功能达到动画效果。
本程序的不足在于未能达到预期的人性化,没法随意开始游戏,和市场上的愤怒的小鸟存在巨大差距,这也是这个程序不成熟的地方,但是总算达到了能将图片以抛物线运动到目的地。基本上完成了目的要求。今后还需继续改进完善。
任务五
石头剪刀布
(一)设计任务与目标
任务:
参考第五章的实验题Rock, Paper, Scissors设计并实现一个和计算机交互的剪刀、石头、布游戏。人和计算机各选择一项,然后决出胜负。程序必须随机选取一项但不表示出来,然后提示用户选择。当用户选择后,程序同时显示出计算机和用户的选择并且输出游戏结果。游戏一直进行直到用户退出为止,并且输出双方输赢次数和总局数。要求目标:
能够直观显示用户和电脑的出拳
可以多次进行游戏,知道用户确认退出
每次都给出目前胜负情况
游戏具有随机性和准确性 分析论证:
由于第五章中已经编译过类似的程序,其是通过随机数模拟电脑出拳,在通过用户输入模拟自己出拳,最终来比较电脑和用户的胜负。只要将原程序改成界面形式并加入具体相应的图片和用户胜负情况的提示,其他的游戏比较与原来一致就行。
(二)方案设计与论证
根据题目要求需要建立一个Panel’类Fight用于存储图片和组件。在类 12 中申请了3个panel,第一个用于存放图片,第二个用于存放按键,最后将这两个放进panel3中。在panel1中的图片需要根据panel2中按键触发的事件进行相应的改变。电脑和用户都有石头、剪刀和布三张图片进行变化。每次在用户点击按键石头或剪刀或布后电脑会根据随机数产生器发出的随机数进行相应的“出拳”,然后和用户选择的“出拳”进行比较输赢。当用户选择后,两者的出拳图会显示在panel1中,并出现信息说明当前游戏总次数和用户和电脑各自的胜出次数。用户可以再一次游戏介绍后继续点击按键进行多次游戏,每次重复上面功能。
因为本程序是在原有基础上进行的改进,前面又做过小鸟的程序,所以问题不是很大,最不应该的是在图片引用过程中因为图片命名格式的原因耽误了大量时间,导致实验用时较长。最终完成的游戏还是比较完善的,几乎达到了预期的所有要求。
(三)程序框图或流程图,程序清单与调用关系
(四)程序运行的测试与分析
本程序运行正常,实现了用户点击按键尝试相应的图片,同时电脑也会产生相应的回应发出它的“猜拳”,每一次都会给出当前的游戏总局数和用户和电脑各自的胜利局数。并且可以随意进行多次,每次的随机性和准确性良好。界面也较清楚好看。最终结果如下图: 实验结果截图:
(五)结论心得
本题经过较长时间的调试和完善,达到了预期要求和运行目标。这是本次设计用时最长的题目花了大量时间,最后总算有所回报,到达了一个比较满意的成果。
任务六
学生考勤管理系统
(一)设计任务与目标
任务:
考勤信息记录了学生的缺课情况,它包括:缺课日期、第几节课、课程名称、学生姓名、缺课类型(迟到、早退、请假及旷课)。试设计考勤管理系统,使之能提供以下功能: 要求目标:
(1)录入学生的缺课记录;
(2)修改某个学生的缺课记录;(3)查询某个学生的缺课情况;
(4)统计某段时间内,旷课学生姓名及旷课次数;(5)统计某段时间内,有学生旷课的课程及旷课人次; 分析论证:
本题需要通过用户界面来直观的实现操作,操作尽量简单方便,可以实现上述基本功能。主要以之前的对话框等GUI组件来实现用户的交互。可以输入和查询相应的信息以及提示信息,并可以实现简单统计。
(二)方案设计与论证
本题我设计了一个主面板来承载多个
panel;其中最重要的是JTabbedPane组件,它先承载了主要的按键及菜单和各个文本输入框。其他的面板主要是安放在JTabbedPane上,并且要求面板中的组件按一定规律排列,用到了布局管理器。
需要实现的功能主要是录入、修改、查询和统计信息。程序中我分块编写了各个功能的代码,每个功能都将用到相应监听器,通过按键实现功能。并且在panel类中用到了student类,用于保存基本的学生信息。
在程序的编译和调试过程中出现了许多问题。开始时面板布局凌乱,输入信息没有反应,并且还会出现报错。在布局问题上后来用到了布局管理器,编程时将各个功能的版式按照一定的样式统一设计,达到界面简洁美观。输入信息没反应主要是事件反应器的逻辑错误,经过调整判断条件等改正了错误。最后,根据老师提出的要求最程序提出了完善,可以通过姓名和学号查 询信息,以及不会重复输入同一个人的信息。基本达到实验目的。
(三)程序框图或流程图,程序清单与调用关系
(四)程序运行的测试与分析
经过调试,程序可以正常运行。可以实现信息的输入和查询以及修改和统计信息数量。界面布局较合理,实验截图如下:
实验结果截图:
(五)结论心得
本题设计时涉及很多的组件和方法,需要将大量的组件安排到合适的位置,并且要实现相应的功能。工作量较大,在完善过程中问题也很多。不过通过自己的努力和思考,最终成功的完成了实验。实验收获众多,了解了一个较复杂和大段的代码编写时需要耗费很大精力。
参考资料
【1】 【美】John lewis,William Loftus 著《Java程序设计教程》(第六版)——电子工业出版社
【2】 【美】Y.Daniel Liang 著《Java语言程序设计》(基础篇)——机械工业出版社 【3】 百度知道——http://zhidao.baidu.com/question/33715635.html
【4】 百度文库——http://wenku.baidu.com/view/c1be6c19c281e53a5802fff1.html
致谢
本次可是设计能够完成的这样顺利需要感谢很多人,这其中就包括软件班的王浩同学,愤怒的小鸟这个程序借鉴了他的设计。还有就是本班的黄康杰的同学,他在我调试程序时给出一些好的建议,帮我解决了问题。特别需要感谢的事我们的崔剑锋老师,是您一个学期以来的严格要求和教导,给我传授知识,今天才能完成这个课程设计。在这里衷心的对这些给过帮助的人们表示感谢!
附录:全部源程序清单
源代码一:手机号码检测器 import java.util.Scanner;//手机号码检测器 public class Phone { public static void main(String[] args){ 17 String phone,str;char y;int x,m,a;Scanner scan=new Scanner(System.in);do { System.out.println(“请输入电话号码:”);phone=scan.next();x=phone.length();if(x<11)System.out.println(“输入错误,位数不足!”);else if(x>11)System.out.println(“输入错误,位数过多!”);if(x==11){ for(int i=0;i<11;i++){
y=phone.charAt(i);
if(y>='0'&&y<='9')
{ a++;
m=0;a=0;
else
}
else
m=i+1;
}
if(a==11)
System.out.println(“输入完成!”);else {
System.out.println(“输入错误!”);
System.out.println(“第 ”+m+“ 位输入错误字符 ”
+phone.charAt(m-1));} }
System.out.print(“继续输入吗(Y/N): ”);str = scan.next();}while(str.equals(“Y”));System.out.println(“退出输入!”);} } 源代码二:扑克牌
//************************************* // Card.java // 主类定义纸牌的花色和大小
//************************************* 19
public class Card {
private String[] card,bao;private int a=0;public Card(){ String[] card1 = { “黑桃”, “红桃”, “梅花”, “方块” };//定义两个数组用于组
String[] card2 = { “A”, “2”, “3”, “4”, “5”, “6”, “7”, “8”, “9”, “10”,“J”, “Q”, “K” };
card=new String[52];bao=new String[52];for(int i = 0;i < 4;i++){ for(int j = 0;j < 13;j++){ card[a]=card1[i].concat(card2[j]);bao[a]=card[a];a++;} } } public String getCard(int i){
return card[i];}
}
import java.util.Scanner;public class DeskOfCard { private static int count=52;public static void main(String[] args){
String string,string2;
Card m=new Card();
Card n=new Card();//这里设定52张牌
Scanner scan =new Scanner(System.in);
do
{
System.out.println(“输入您要的操作(xipai or fapai):”);
string = scan.next();if(string.equals(“xiapi”)){
m=n;//初始化牌组
count=52;//重新设定计数器
System.out.println(“剩余牌数:”+count);
} else if(string.equals(“fapai”))
{
if(count!=0)//判定牌是否发完
{
count--;
int r =(int)(Math.random()* 52);// 获取随即数
System.out.println(“抽取的牌为: ”+m.getCard(r)+“,剩余扑克牌数为: ”+count);// 输出扑克牌
} // 从ArrayList中去掉已抽到了扑克牌
else
System.out.println(“牌已经抽完”);
}
System.out.println(“Want to again(Y/N): ”);
string2=scan.next();}while(string2.equals(“Y”));
}
}
源代码三:计算器 import java.awt.*;import java.awt.event.*;import java.text.DecimalFormat;import javax.swing.*;import javax.swing.border.BevelBorder;
//创建Calculator类,继承自JFrame,实现接口ActionListener public class Calculator extends JPanel { //声明相关变量、对象,具体作用下面再逐行讲解
private DecimalFormat df;private JTextField jieguo,jieguo2;private JButton[] button;private JPanel panel1,panel2,panel3;private double result,num1,num2;private int yunsuan,kong1 = 0;private String s = “", s1 = ”“,s2= ”“;public Calculator()//构造方法
{
df = new DecimalFormat(”0.0000“);//设置结果小数点位数
jieguo = new JTextField(20);
jieguo.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
jieguo.setBackground(new Color(240,245,254));
jieguo.setEditable(false);22
jieguo2 = new JTextField(20);
jieguo2.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
jieguo2.setBackground(new Color(240,245,254));
jieguo2.setEditable(false);
panel1 = new JPanel();
panel1.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
panel1.setLayout(new BoxLayout(panel1,BoxLayout.Y_AXIS));
panel1.setBackground(new Color(240,245,254));
panel1.add(jieguo);
panel1.add(jieguo2);
panel2 = new JPanel();
panel2.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
panel2.setBackground(new Color(229,238,250));
panel2.setLayout(new GridLayout(5,4,4,4));
//各个按钮的名字
String name[] ={”1“,”2“,”3“,”+“,”4“,”5“,”6“,”-“,”7“,”8“,”9“,”*“,”0“,”.“,”=“,”/“,”C“};
button = new JButton[name.length];
for(int i = 0;i < name.length;i++)//实例化各个按钮
{
button[i] = new JButton(name[i]);
button[i].setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
button[i].setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
button[i].setPreferredSize(new Dimension(5,35));
button[i].addActionListener(new ButtonListener());
panel2.add(button[i]);
}
panel3 = new JPanel();
panel3.setBackground(new Color(229,238,250));//设置布局管理
panel3.setLayout(new BoxLayout(panel3,BoxLayout.Y_AXIS));
panel3.add(panel1);
panel3.add(Box.createRigidArea(new Dimension(0,30)));
panel3.add(panel2);
add(panel3);
} private class ButtonListener implements ActionListener 23 { public void actionPerformed(ActionEvent event){
//没有输入加减乘除时空=0,记录被运算数
if(kong1 == 0)
{
if(event.getSource()== button[0])
s1 += 1;
if(event.getSource()== button[1])
s1 += 2;
if(event.getSource()== button[2])
s1 += 3;
if(event.getSource()== button[4])
s1 += 4;
if(event.getSource()== button[5])
s1 += 5;
if(event.getSource()== button[6])
s1 += 6;
if(event.getSource()== button[8])
s1 += 7;
if(event.getSource()== button[9])
s1 += 8;
if(event.getSource()== button[10])
s1 += 9;
if(event.getSource()== button[12])
s1 += 0;
if(event.getSource()== button[13])
s1 += ”.“;
//当键入加减乘除后,设置kong=1
if(event.getSource()== button[7] || event.getSource()== button[3] ||event.getSource()== button[15] || event.getSource()== button[11])
{
num1 = Double.parseDouble(jieguo.getText());
//记录运算类型
if(event.getSource()== button[3])
{
yunsuan = 1;
s1 += ”+“;
} 24
if(event.getSource()== button[7])
{
yunsuan = 2;
s1 += ”-“;
}
if(event.getSource()== button[11])
{
yunsuan = 3;
s1 += ”*“;
}
if(event.getSource()== button[15])
{
yunsuan = 4;
s1 += ”/“;
}
kong1 = 1;}
s = s1;jieguo.setText(s);} //此时记录运算数 if(kong1 ==1){ if(event.getSource()== button[0])
s2 += 1;if(event.getSource()== button[1])
s2 += 2;if(event.getSource()== button[2])
s2 += 3;if(event.getSource()== button[4])
s2 += 4;if(event.getSource()== button[5])
s2 += 5;if(event.getSource()== button[6])
s2 += 6;if(event.getSource()== button[8])
s2 += 7;if(event.getSource()== button[9])
s2 += 8;if(event.getSource()== button[10])
s2 += 9;if(event.getSource()== button[12])
s2 += 0;
误
if(event.getSource()== button[13])
s2 += ”.“;s =s1+ s2;jieguo.setText(s);//重复出现运算数???? } if(event.getSource()== button[14])//当按下等号时,设置结果label的内容 { s += ”=“;jieguo.setText(s);num2 = Double.parseDouble(s2);switch(yunsuan){ case 1:
result = num1 + num2;
break;
case 2:
result = num1-num2;
break;
case 3:
result = num1 * num2;
break;
case 4:
if(s2.length()==1 && s2.charAt(0)=='0')//当初数为零时提示错
jieguo2.setText(”0不能做除数“);
else
result = num1/num2;
break;}
jieguo.setText(s);//输出算式
jieguo2.setText(df.format(result));//格式化输出结果 }
if(event.getSource()== button[16])//将当前文本框内数据清除 { jieguo.setText(”“);jieguo2.setText(”“);s = ”“;s1 = ”“;s2 = ”“;yunsuan = 0;kong1 = 0;26
}
} } } import javax.swing.JFrame;public class TestCal { public static void main(String[] args){
Calculator calculator = new Calculator();
JFrame frame =new JFrame(”Calculator“);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().add(calculator);frame.pack();frame.setVisible(true);
} } 源代码四: 愤怒的小鸟 import java.awt.*;import java.awt.event.*;import javax.swing.*;
public class BirdPanel extends JPanel { private final int WIDTH = 1020, HEIGHT = 620;private final int DELAY = 90, IMAGE_SIZE = 40;private ImageIcon image,image2,image3;private Timer timer;private int x, y, moveX, moveY;//---// 设置面板,包括为了动画引用计时器
//---public BirdPanel(){ timer = new Timer(DELAY, new AListener());
image = new ImageIcon(”鸟.png“);image2 = new ImageIcon(”目标.gif“);image3 = new ImageIcon(”birds1.jpg“);x = 0;y = 500;moveX = 30;27 moveY =-30;//竖直方向向上,做抛物线需要
setPreferredSize(new Dimension(WIDTH, HEIGHT));setBackground(Color.WHITE);
timer.start();} //---// 面板中显示该有的图片
//---public void paintComponent(Graphics page){ super.paintComponent(page);image3.paintIcon(this, page, 330, 0);image.paintIcon(this, page, x, y);image2.paintIcon(this, page, 900, 550);} //***************************************************************** // 定时器的操作监听程序
//***************************************************************** private class AListener implements ActionListener { // // 更新图像的位置和可能的运动方向每当计时器触发操作事件 // // public void actionPerformed(ActionEvent event){ moveY +=2;//为了做抛物线每次少提高2个像素,最终才会下落 x += moveX;//以设定好的像素移动 y += moveY;
//判断达到目标后停止,并产生相应的变化效果 if(x >= WIDTH-IMAGE_SIZE){ x = WIDTH-IMAGE_SIZE;} if(y >= HEIGHT-IMAGE_SIZE){ y= HEIGHT-IMAGE_SIZE;image2 = new ImageIcon(”变身.jpg“);image = new ImageIcon(”...“);//小鸟消失 } repaint();28 } } } //************************************************************* // Bird.java // // Angry birds!//************************************************************* import java.awt.*;import java.awt.event.*;import javax.swing.*;
public class Bird { public static void main(String[] args){ String x;x = ”开始 愤怒的小鸟游戏?“;JOptionPane.showMessageDialog(null,x);
JFrame frame = new JFrame(”Angry birds“);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().add(new BirdPanel());frame.pack();frame.setVisible(true);} } 源代码五: 剪刀石头布 import java.awt.*;import java.awt.event.*;import java.util.Random;import javax.swing.*;import javax.swing.border.BevelBorder;
public class Fight extends JPanel { private JPanel panel1,panel2,panel3;private JLabel computer,bi,person;private ImageIcon ShiTouP,JianZiP,BuP,kong;private JButton shitouB,jianziB,buB;private Random generator;private int total = 0,c=0,p=0;public Fight(){
generator = new Random();//定义图片
ShiTouP = new ImageIcon(”石头.jpg“);JianZiP = new ImageIcon(”剪刀.jpg“);BuP = new ImageIcon(”布.jpg“);kong = new ImageIcon(”VS.jpg“);
//引用图片给电脑和用户
person = new JLabel(new ImageIcon(”客户.gif“));bi = new JLabel(kong);computer =new JLabel(new ImageIcon(”电脑.jpg“));
panel1 = new JPanel();panel1.setBackground(Color.BLUE);panel1.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));panel1.setLayout(new BoxLayout(panel1,BoxLayout.X_AXIS));panel1.add(person);panel1.add(bi);panel1.add(computer);panel1.setPreferredSize(new Dimension(450,180));shitouB = new JButton(”石头“);shitouB.addActionListener(new Mouse());jianziB = new JButton(”剪刀“);jianziB.addActionListener(new Mouse());
buB = new JButton(”布“);buB.addActionListener(new Mouse());panel2 = new JPanel();panel2.setLayout(new BoxLayout(panel2,BoxLayout.X_AXIS));panel2.add(jianziB);panel2.add(shitouB);panel2.add(buB);panel2.setPreferredSize(new Dimension(450,50));panel2.setBackground(new Color(200,218,235));
panel3 = new JPanel();panel3.setBackground(new Color(200,218,235));panel3.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));30 panel3.setLayout(new BoxLayout(panel3,BoxLayout.Y_AXIS));panel3.add(panel1);panel3.add(Box.createRigidArea(new Dimension(0,50)));panel3.add(panel2);
add(panel3);panel3.setPreferredSize(new Dimension(500,350));}
{ {
int ran = generator.nextInt(3);if(event.getSource()== jianziB){
person.setIcon(JianZiP);//当产生比较后根据结果变换图片
if(ran == 0)
{
total += 1;
bi.setIcon(kong);
computer.setIcon(JianZiP);
}
if(ran == 1)
{
total += 1;
c += 1;
bi.setIcon(kong);
computer.setIcon(ShiTouP);
}
if(ran == 2)
{
total += 1;
p += 1;
bi.setIcon(kong);
computer.setIcon(BuP);
} } if(event.getSource()== shitouB){
person.setIcon(ShiTouP);
if(ran == 0)
{
private class Mouse implements ActionListener public void actionPerformed(ActionEvent event)
total += 1;
bi.setIcon(kong);
p += 1;
computer.setIcon(JianZiP);} if(ran == 1){
total += 1;
bi.setIcon(kong);
computer.setIcon(ShiTouP);} if(ran == 2){
total += 1;
c += 1;
bi.setIcon(kong);
computer.setIcon(BuP);} }
if(event.getSource()== buB){ person.setIcon(BuP);if(ran == 0){
total += 1;
bi.setIcon(kong);
c += 1;
computer.setIcon(JianZiP);} if(ran == 1){
total += 1;
bi.setIcon(kong);
p += 1;
computer.setIcon(ShiTouP);} if(ran == 2){
total += 1;
bi.setIcon(kong);
computer.setIcon(BuP);
}
}
if(event.getSource()== jianziB || event.getSource()== shitouB
|| event.getSource()== buB)
{
int again = JOptionPane.showConfirmDialog(panel2,”比赛进行了:“
+total+”次--您赢了“+p+”次--电脑赢了:“+c+”次 还要继续玩吗?“
,”提示“,JOptionPane.YES_NO_OPTION);
if(again==JOptionPane.NO_OPTION)
System.exit(0);
} }
}
} //********************************** // TestFight.java // //********************************** import javax.swing.JFrame;public class TestFight {
public static void main(String[] args){
Fight fight = new Fight();
JFrame frame =new JFrame(”石头剪刀布“);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().add(fight);frame.pack();frame.setVisible(true);} }
源代码六:
//******************************************** // Student.java // 学生类,包括了各种属性的设置和取值方法
//********************************************** public class Student 33 { int xuehao,keshi;String xingming,kemu,leixing,riqi;public Student(String xingming,int xuehao,String riqi,int keshi,String kemu,String leixing){ //构造函数
this.xingming=xingming;
this.xuehao=xuehao;
this.riqi=riqi;
this.kemu=kemu;
this.keshi=keshi;
this.leixing=leixing;} //各个属性的get和set方法
public String getXingMing(){ return xingming;} public void setXingMing(String xingming){
this.xingming=xingming;} public int getXueHao(){ return xuehao;} public void setXueHao(int xuehao){
this.xuehao=xuehao;} public String getRiQi(){ return riqi;} public void setRiQi(String riqi){
this.riqi=riqi;} public int getKeShi(){
return keshi;} public void setKeShi(int keshi){ 34
this.keshi=keshi;} public String getKeMu(){ return kemu;} public void setKeMu(String kemu){
this.kemu=kemu;} public String getLeiXing(){ return leixing;} public void setLeiXing(String leixing){
this.leixing=leixing;} }
//************************************ // 运行类
//************************************
import java.awt.Dimension;import javax.swing.JFrame;
public class TestKaoQing { public static void main(String[] args){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new kaoqin());
frame.pack();
frame.setVisible(true);
} }
//****************************************** // kaoqin.java // 考勤类,定义了主要的面板和功能实现
//******************************************* import java.awt.*;import java.awt.event.*;import javax.swing.*;
import java.util.ArrayList;import javax.swing.border.BevelBorder;
public class kaoqin extends JPanel { JLabel jieguo;//统计功能的组件定义
JButton xAt,kAr;JTextArea JieGuo;JPanel jieguoP,panelB,account;
JLabel background1,background2,background3,background4;ArrayList
JTextField xingming11,xuehao11,riqi11,keshi11,kemu11,leixing11;String xingming111,xuehao111,riqi111,keshi111,kemu111,leixing111;JPanel Input,panel11,panel12,panel13,panel14,panel15,panel16;
JLabel xingming2,xuehao2,riqi2,keshi2,kemu2,leixing2;//修改功能组件的定义
JTextField xingming22,xuehao22,riqi22,keshi22,kemu22,leixing22;String xingming222,xuehao222,riqi222,keshi222,kemu222,leixing222;JPanel Modify,panel21,panel22,panel23,panel24,panel25,panel26,panel27;
JLabel xingming3,xuehao3,riqi3,keshi3,kemu3,leixing3;//查找功能组件的定义
JTextField xingming33,xuehao33,riqi33,keshi33,kemu33,leixing33;String xingming333,xuehao333,riqi333,keshi333,kemu333,leixing333;JPanel Find,panel31,panel32,panel33,panel34,panel35,panel36;
JButton tijiao1,xiugai2,chaxun2,chaxun3;//各个按钮的定义
JTabbedPane tb;Integer cha1 = null,cha2 = null;public kaoqin(){
background1 = new JLabel(”请录入学生信息!“);//提示信息的初始化
background2 = new JLabel(”请使用学号和姓名查询!“);background3 = new JLabel(”请使用学号和姓名查询!“);
student = new ArrayList
xingming1=new JLabel(”学生姓名:“);//录入界面各个组件的安排
xuehao1=new JLabel(”学生学号:“);riqi1=new JLabel(”缺勤日期:“);keshi1=new JLabel(”缺勤课时:“);kemu1=new JLabel(”缺勤科目:“);leixing1=new JLabel(”缺勤类型:“);
xingming11=new JTextField(8);
xingming11.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
xuehao11=new JTextField(8);
xuehao11.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
riqi11=new JTextField(8);riqi11.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
keshi11=new JTextField(8);
keshi11.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
kemu11=new JTextField(8);kemu11.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
leixing11=new JTextField(8);
leixing11.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
panel11 = new JPanel();panel11.setBackground(new Color(230,239,255));panel11.setLayout(new BoxLayout(panel11,BoxLayout.X_AXIS));panel11.add(Box.createRigidArea(new Dimension(30,15)));panel11.add(xingming1);panel11.add(xingming11);
panel12 = new JPanel();panel12.setBackground(new Color(230,239,255));panel12.setLayout(new BoxLayout(panel12,BoxLayout.X_AXIS));panel12.add(Box.createRigidArea(new Dimension(30,0)));panel12.add(xuehao1);panel12.add(xuehao11);
panel13 = new JPanel();panel13.setBackground(new Color(230,239,255));panel13.setLayout(new BoxLayout(panel13,BoxLayout.X_AXIS));panel13.add(Box.createRigidArea(new Dimension(30,0)));panel13.add(riqi1);panel13.add(riqi11);
panel14 = new JPanel();panel14.setBackground(new Color(230,239,255));panel14.setLayout(new BoxLayout(panel14,BoxLayout.X_AXIS));panel14.add(Box.createRigidArea(new Dimension(30,0)));panel14.add(keshi1);panel14.add(keshi11);
panel15 = new JPanel();panel15.setBackground(new Color(230,239,255));panel15.setLayout(new BoxLayout(panel15,BoxLayout.X_AXIS));panel15.add(Box.createRigidArea(new Dimension(30,0)));panel15.add(kemu1);panel15.add(kemu11);
panel16 = new JPanel();panel16.setBackground(new Color(230,239,255));panel16.setLayout(new BoxLayout(panel16,BoxLayout.X_AXIS));panel16.add(Box.createRigidArea(new Dimension(30,0)));panel16.add(leixing1);panel16.add(leixing11);
tijiao1 = new JButton(”提交“);tijiao1.setFont(new Font(”幼圆“, Font.BOLD, 18));tijiao1.setPreferredSize(new Dimension(50,20));tijiao1.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));tijiao1.addActionListener(new ButtonListener());
Input=new JPanel();Input.setBackground(new Color(230,239,255));Input.setLayout(new BoxLayout(Input,BoxLayout.Y_AXIS));Input.add(Box.createRigidArea(new Dimension(30,0)));Input.add(background1);Input.add(Box.createRigidArea(new Dimension(0,10)));Input.add(panel11);//将各个panel添加到Input中
Input.add(panel12);Input.add(panel13);Input.add(panel14);Input.add(panel15);Input.add(panel16);Input.add(Box.createRigidArea(new Dimension(0,10)));Input.add(tijiao1);// 按键的添加
xingming2=new JLabel(”学生姓名:“);//修改界面各个组件的安排
xuehao2=new JLabel(”学生学号:“);riqi2=new JLabel(”缺勤日期:“);keshi2=new JLabel(”缺勤课时:“);kemu2=new JLabel(”缺勤科目:“);leixing2=new JLabel(”缺勤类型:“);xingming22=new JTextField(8);
xingming22.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
xuehao22=new JTextField(8);
xuehao22.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
riqi22=new JTextField(8);riqi22.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
keshi22=new JTextField(8);
keshi22.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
kemu22=new JTextField(8);kemu22.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
leixing22=new JTextField(8);
leixing22.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
panel21 = new JPanel();panel21.setBackground(new Color(230,239,255));panel21.setLayout(new BoxLayout(panel21,BoxLayout.X_AXIS));panel21.add(Box.createRigidArea(new Dimension(30,15)));panel21.add(xingming2);panel21.add(xingming22);
panel22 = new JPanel();panel22.setBackground(new Color(230,239,255));panel22.setLayout(new BoxLayout(panel22,BoxLayout.X_AXIS));panel22.add(Box.createRigidArea(new Dimension(30,0)));panel22.add(xuehao2);panel22.add(xuehao22);
panel23 = new JPanel();panel23.setBackground(new Color(230,239,255));panel23.setLayout(new BoxLayout(panel23,BoxLayout.X_AXIS));panel23.add(Box.createRigidArea(new Dimension(30,0)));panel23.add(riqi2);panel23.add(riqi22);
panel24 = new JPanel();panel24.setBackground(new Color(230,239,255));panel24.setLayout(new BoxLayout(panel24,BoxLayout.X_AXIS));panel24.add(Box.createRigidArea(new Dimension(30,0)));panel24.add(keshi2);panel24.add(keshi22);
panel25 = new JPanel();panel25.setBackground(new Color(230,239,255));panel25.setLayout(new BoxLayout(panel25,BoxLayout.X_AXIS));panel25.add(Box.createRigidArea(new Dimension(30,0)));panel25.add(kemu2);panel25.add(kemu22);
panel26 = new JPanel();panel26.setBackground(new Color(230,239,255));panel26.setLayout(new BoxLayout(panel26,BoxLayout.X_AXIS));panel26.add(Box.createRigidArea(new Dimension(30,0)));panel26.add(leixing2);panel26.add(leixing22);
xiugai2 = new JButton(”修改“);xiugai2.setFont(new Font(”幼圆“, Font.BOLD, 18));xiugai2.setPreferredSize(new Dimension(50,20));xiugai2.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));xiugai2.addActionListener(new ButtonListener());
chaxun2 = new JButton(”查询“);chaxun2.setPreferredSize(new Dimension(50,20));chaxun2.setFont(new Font(”幼圆“, Font.BOLD, 18));chaxun2.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));chaxun2.addActionListener(new ButtonListener());
panel27 = new JPanel();panel27.setLayout(new BoxLayout(panel27,BoxLayout.X_AXIS));panel27.add(xiugai2);panel27.add(chaxun2);
Modify = new JPanel();Modify.setBackground(new Color(230,239,255));Modify.setLayout(new BoxLayout(Modify,BoxLayout.Y_AXIS));Modify.add(Box.createRigidArea(new Dimension(30,0)));Modify.add(background2);Modify.add(Box.createRigidArea(new Dimension(0,10)));Modify.add(panel21);Modify.add(panel22);Modify.add(panel23);Modify.add(panel24);Modify.add(panel25);Modify.add(panel26);Modify.add(Box.createRigidArea(new Dimension(0,10)));Modify.add(panel27);
xingming3=new JLabel(”学生姓名:“);//查找界面各个组件的安排
xuehao3=new JLabel(”学生学号:“);riqi3=new JLabel(”缺勤日期:“);keshi3=new JLabel(”缺勤课时:“);kemu3=new JLabel(”缺勤科目:“);leixing3=new JLabel(”缺勤类型:“);
xingming33=new JTextField(8);
xingming33.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
xuehao33=new JTextField(8);
xuehao33.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
riqi33=new JTextField(8);riqi33.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
keshi33=new JTextField(8);
keshi33.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
kemu33=new JTextField(8);kemu33.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
leixing33=new JTextField(8);
leixing33.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
panel31 = new JPanel();panel31.setBackground(new Color(230,239,255));panel31.setLayout(new BoxLayout(panel31,BoxLayout.X_AXIS));panel31.add(Box.createRigidArea(new Dimension(30,10)));panel31.add(xingming3);panel31.add(xingming33);
panel32 = new JPanel();panel32.setBackground(new Color(230,239,255));panel32.setLayout(new BoxLayout(panel32,BoxLayout.X_AXIS));panel32.add(Box.createRigidArea(new Dimension(30,0)));panel32.add(xuehao3);panel32.add(xuehao33);
panel33 = new JPanel();panel33.setBackground(new Color(230,239,255));panel33.setLayout(new BoxLayout(panel33,BoxLayout.X_AXIS));panel33.add(Box.createRigidArea(new Dimension(30,0)));panel33.add(riqi3);42
panel33.add(riqi33);
panel34 = new JPanel();panel34.setBackground(new Color(230,239,255));panel34.setLayout(new BoxLayout(panel34,BoxLayout.X_AXIS));panel34.add(Box.createRigidArea(new Dimension(30,0)));panel34.add(keshi3);panel34.add(keshi33);
panel35 = new JPanel();panel35.setBackground(new Color(230,239,255));panel35.setLayout(new BoxLayout(panel35,BoxLayout.X_AXIS));panel35.add(Box.createRigidArea(new Dimension(30,0)));panel35.add(kemu3);panel35.add(kemu33);
panel36 = new JPanel();panel36.setBackground(new Color(230,239,255));panel36.setLayout(new BoxLayout(panel36,BoxLayout.X_AXIS));panel36.add(Box.createRigidArea(new Dimension(30,0)));panel36.add(leixing3);panel36.add(leixing33);
chaxun3=new JButton(”查询“);chaxun3.setPreferredSize(new Dimension(50,20));chaxun3.setFont(new Font(”幼圆“, Font.BOLD, 18));chaxun3.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));chaxun3.addActionListener(new ButtonListener());
Find = new JPanel();Find.setBackground(new Color(230,239,255));Find.setLayout(new BoxLayout(Find,BoxLayout.Y_AXIS));Find.add(Box.createRigidArea(new Dimension(30,5)));Find.add(background3);Find.add(Box.createRigidArea(new Dimension(0,10)));Find.add(panel31);Find.add(panel32);Find.add(panel33);Find.add(panel34);Find.add(panel35);43
Find.add(panel36);Find.add(Box.createRigidArea(new Dimension(0,10)));Find.add(chaxun3);
jieguo = new JLabel(”统计结果:“);//统计功能各个组件的安排 background4 = new JLabel(”统计“);xAt= new JButton(”学生和次数“);xAt.setPreferredSize(new Dimension(50,20));xAt.setFont(new Font(”幼圆“, Font.BOLD, 10));xAt.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));xAt.addActionListener(new ButtonListener());
kAr= new JButton(”课程和人数“);kAr.setPreferredSize(new Dimension(50,20));kAr.setFont(new Font(”幼圆“, Font.BOLD, 10));kAr.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));kAr.addActionListener(new ButtonListener());
JieGuo=new JTextArea();JieGuo.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
jieguoP = new JPanel();jieguoP.setBackground(new Color(230,239,255));jieguoP.setLayout(new BoxLayout(jieguoP,BoxLayout.X_AXIS));jieguoP.add(Box.createRigidArea(new Dimension(10,0)));jieguoP.setPreferredSize(new Dimension(40,20));jieguoP.add(jieguo);jieguoP.add(JieGuo);panelB= new JPanel();panelB.setBackground(new Color(230,239,255));panelB.setLayout(new BoxLayout(panelB,BoxLayout.X_AXIS));panelB.add(Box.createRigidArea(new Dimension(30,0)));panelB.add(xAt);panelB.add(kAr);44
account=new JPanel();
account.setBackground(new Color(230,239,255));
account.setLayout(new BoxLayout(account,BoxLayout.Y_AXIS));
account.add(Box.createRigidArea(new Dimension(30,5)));
account.add(background4);
account.add(Box.createRigidArea(new Dimension(0,10)));
account.add(jieguoP);
account.add(Box.createRigidArea(new Dimension(0,10)));
account.add(panelB);
tb = new JTabbedPane();tb.setBackground(new Color(230,239,255));tb.setBounds(0,0,400,400);
tb.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
tb.addTab(”录入“,Input);//将各个功能模块加到tb中
tb.addTab(”修改“,Modify);tb.addTab(”查询“,Find);tb.addTab(”统计“,account);setLayout(new BorderLayout());add(tb,BorderLayout.CENTER);
setSize(new Dimension(400,400));
}
private class ButtonListener implements ActionListener //监听器类
{ public void actionPerformed(ActionEvent event){
xingming111=xingming11.getText();//录入功能监听
xuehao111=xuehao11.getText();
riqi111=riqi11.getText();
keshi111=keshi11.getText();
kemu111=kemu11.getText();
leixing111=leixing11.getText();if(event.getSource()== tijiao1)//判断是否已经存在输入的学生信息
{
for(int j = 0;j { 45 if(Integer.toString(student.get(j).getXueHao()).equals(xuehao111) || student.get(j).getXingMing().equals(xingming111)) { cha1=j; } } if(cha1 == null)//无此学生信息则录入信息 { student.add(new Student(xingming111,Integer.parseInt(xuehao111),riqi111,Integer.parseInt(keshi111),kemu111,leixing111)); background1.setText(”录入信息成功!“); xingming11.setText(null); xuehao11.setText(null); riqi11.setText(null); keshi11.setText(null); kemu11.setText(null); leixing11.setText(null); } else { background1.setText(”学生已有信息存在,有需要请修改!“); xingming11.setText(null); xuehao11.setText(null); riqi11.setText(null); keshi11.setText(null); kemu11.setText(null); leixing11.setText(null); } } if(event.getSource()==chaxun2)//修改功能监听 { if(student.size()== 0) background2.setText(”暂无任何学生信息,请先录入!“); else { for(int j = 0;j { xuehao222=xuehao22.getText(); xingming222=xingming22.getText(); if(Integer.toString(student.get(j).getXueHao()).equals(xuehao222) ||student.get(j).getXingMing().equals(xingming222)) { cha1 = j; } } if(cha1==null) { background2.setText(”无该学生信息,请重新查询!“); xingming22.setText(”“); xuehao22.setText(”“); riqi22.setText(”“); keshi22.setText(”“); kemu22.setText(”“); leixing22.setText(”“); } } xingming22.setText(student.get(cha1).getXingMing());xuehao22.setText(Integer.toString(student.get(cha1).getXueHao()));riqi22.setText(student.get(cha1).getRiQi());keshi22.setText(Integer.toString(student.get(cha1).getKeShi()));kemu22.setText(student.get(cha1).getKeMu());leixing22.setText(student.get(cha1).getLeiXing());} if(event.getSource()== xiugai2)//当查到信息后开始修改 { student.remove(cha1); student.get(cha1).setKeMu(kemu22.getText()); student.get(cha1).setKeShi(Integer.parseInt(keshi22.getText())); student.get(cha1).setLeiXing(leixing22.getText()); student.get(cha1).setRiQi(riqi22.getText()); student.get(cha1).setXingMing(xingming22.getText()); student.get(cha1).setXueHao(Integer.parseInt(xuehao22.getText())); cha1 = null; xingming22.setText(null);//改后将文本框信息置空 xuehao22.setText(null); riqi22.setText(null); keshi22.setText(null); kemu22.setText(null); leixing22.setText(null); background2.setText(”修改成功!“); } if(event.getSource()== chaxun3)//查询功能监听 { if(student.size()== 0) background3.setText(”暂无任何学生信息,请先录入!“); else { for(int j = 0;j { xuehao333=xuehao33.getText(); xingming333=xingming33.getText();// 通过比较输入的学号或是姓名进行查询 if(Integer.toString(student.get(j).getXueHao()).equals(xuehao333) || student.get(j).getXingMing().equals(xingming333)) { cha2 = j; } } if(cha2==null) { background3.setText(”无该学生信息,请重新查询!“); xingming33.setText(”“); xuehao33.setText(”“); riqi33.setText(”“); keshi33.setText(”“); kemu33.setText(”“); leixing33.setText(”“); } } xingming33.setText(student.get(cha2).getXingMing());48 xuehao33.setText(Integer.toString(student.get(cha2).getXueHao())); riqi33.setText(student.get(cha2).getRiQi()); keshi33.setText(Integer.toString(student.get(cha2).getKeShi())); kemu33.setText(student.get(cha2).getKeMu()); leixing33.setText(student.get(cha2).getLeiXing()); background3.setText(”查询成功!“); cha2 = null;} if(event.getSource()== xAt)//统计功能的监听,按学生名和课时统计 { int sum=0; String str=”“; if(student.size()==0) background4.setText(”无任何学生信息!“); else for(int i=0;i { if(student.get(i).getKeShi()!=0) { sum += student.get(i).getKeShi();//统计学生缺勤总课时 str += student.get(i).xingming+”>“;//统计学生的名字 } JieGuo.setText(” 缺勤人:n“+str +”n总共缺勤 “+ sum+”次!“); // 输出统计结果 } } if(event.getSource()== kAr)//按课程名和缺勤人数统计 { int sum2=0; String str2=”“; if(student.size()==0) background4.setText(”无任何学生信息!“); else for(int j=0;j { 49 if(student.get(j).getKeShi()!=0){ sum2 ++;str2 +=student.get(j).getKeMu()+”>“; } JieGuo.setText(” 有学生缺勤科目:n“+str2+”n缺勤人数为: "+sum2); } } } } } 课 程 设 计 课程名称 Java语言课程设计 题目名称 人事管理系统的设计与实现 学生学院 应用数学学院 专业班级 学 号 学生姓名 指导教师 刘科峰 2014 年 10 月 29 日 一.设计内容 自学Swing图形界面设计和数据库程序设计。开发用于某单位的人事管理系统。该系统要求实现以下功能: 1.员工信息管理包括:员工信息一览表、新员工的建立、修改 2.薪资福利管理:考勤与薪资的连动计算、薪资与福利的设置 3.考勤假期管理:考勤项目录入, 实现考勤信息的查询、统计、汇总 4.人事报表管理:按照员工性别,数目,薪酬自动生成相关报表, 可自定义统计分析条件并可对历史报表进行管理。 设计亮点 1.null布局方式 Swing图形界面设计中有很多布局方式,通过本次学习了解到了FlowLayout,BorderLayout,GridLayout以及null布局,就这四种布局方式而言,null布局的优点在于可以将组建的位置精准到坐标值,可以把组件放到任意想放置的位置,另外可以通过null去设置组件的大小,相较于其他布局方式来说是一个很大的优势。但同时它的缺点在于不能根据Frame的大小变化而改变位置。 2.组件部分属性的设计 Swing中有很多方法是用来实现组件属性设置的,比如button.setVisible(false);按钮通过调用这个方法实现不可见,这是我此次课程设计中的一个亮点,因为组件是没有设置大小的方法的,只有依靠于相应的布局方式才能改变它的大小,通过设置多几个按钮设为不可见,将所要可见按钮实现大小以及位置的控制是一种很好的方法。 二、设计方案 1主界面(只列出界面设计方面的代码) JPanel panel=new JPanel();JTable table=null;JButton ibtn=new JButton(“员工信息”);JButton cbtn=new JButton(“考勤管理”);JButton mbtn=new JButton(“薪资管理”);JButton tbtn=new JButton(“人事报表”);ImageIcon rtou = new ImageIcon(“rentou.jpg”); JLabel imgLabel=new JLabel(rtou); //上面代码定义了一个面板与四个标签,并引入了一个图片 panel.setLayout(new FlowLayout());//设置面板为流布局 panel.add(ibtn);panel.add(cbtn);panel.add(mbtn);panel.add(tbtn);panel.setBackground(Color.GRAY); //将按钮加到面板中,设置面板为灰色 this.add(imgLabel,BorderLayout.CENTER);this.add(panel,BorderLayout.SOUTH);this.setBounds(300, 180, 600, 350);this.setVisible(true);this.getContentPane().setBackground(Color.GRAY);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/*图片标签以边框布局放置在中间,将面板也以边框布局放置在下面,可见,灰色,点击关闭程序*/ (2)查询员工界面(只列出界面设计方面的代码) Label idlabel = new JLabel(“ID”);JLabel namelabel = new JLabel(“姓名”);JLabel bumenlabel = new JLabel(“部门”);JLabel zhiweilabel = new JLabel(“职位”); JTextField idfiled = new JTextField(8);JTextField namefield = new JTextField(8);JComboBox bumenbox =new JComboBox();JComboBox zhiweubox = new JComboBox(); JButton btn=new JButton(“查询”);JButton ibtn=new JButton(“添加”) JPanel spanel=new JPanel();JPanel vpanel=new JPanel(); /*定义和各个组件,4个标签,两个文本框,两个复选框,两个按钮,两个面板容器*/ spanel.setLayout(new FlowLayout()); vpanel.setLayout(new FlowLayout(FlowLayout.CENTER,45,25)); bumenbox.addItem(“"); bumenbox.addItem(”管理部“); bumenbox.addItem(”生产部“); bumenbox.addItem(”业务部“); zhiweubox.addItem(”“); zhiweubox.addItem(”部长“); zhiweubox.addItem(”副部长“); zhiweubox.addItem(”普工“); spanel.add(idlabel); spanel.add(idfiled); spanel.add(namelabel); spanel.add(namefield); spanel.add(bumenlabel); spanel.add(bumenbox); spanel.add(zhiweilabel); spanel.add(zhiweubox); spanel.add(btn); vpanel.add(ibtn); spanel.setBackground(Color.GRAY); vpanel.setBackground(Color.GRAY); //将各个组件放进对应面板,设置相关属性 this.add(spanel,BorderLayout.NORTH); this.add(vpanel,BorderLayout.SOUTH); this.setBounds(300, 180, 600, 350); this.setVisible(true); this.getContentPane().setBackground(Color.GRAY); //将面板以边框布局放入框架中,设置属性(3)增加员工信息界面 JPanel panel=new JPanel(); JLabel timeLabel=new JLabel(”时间“);JLabel allnumLabel=new JLabel(”员工总数“); JLabel staffMoLabel=new JLabel(”考勤“);JLabel entryLabel=new JLabel(”全勤“); JLabel quitLabel=new JLabel(”缺勤“);JLabel mwLabel=new JLabel(”性别比例“); JLabel manLabel=new JLabel(”男“); JLabel womanLabel=new JLabel(”女“);JLabel proportionLabel=new JLabel(”男女比例“);JLabel distributionLabel=new JLabel(”人员部门分布“);JLabel mdpLabel=new JLabel(”管理部“); JLabel pdpLabel=new JLabel(”生产部“);JLabel bdpLabel=new JLabel(”业务部“);JLabel xmLabel=new JLabel(”项目“);JLabel xzLabel=new JLabel(”细则“);JLabel stLabel=new JLabel(”数据统计“); JTextField timeFiled = new JTextField(8); JTextField allnumFiled = new JTextField(8);JTextField entryFiled = new JTextField(8);JTextField quitFiled = new JTextField(8);JTextField manFiled = new JTextField(8);JTextField womanFiled = new JTextField(8);JTextField proportionFiled = new JTextField(8);JTextField mdpFiled = new JTextField(8);JTextField pdpFiled = new JTextField(8);JTextField bdpFiled = new JTextField(8);// 定义所需组件 public Selectrenshi(String tablename){ super(”人事管理“); panel.setLayout(null); panel.setBackground(Color.GRAY); panel.add(xmLabel); panel.add(xzLabel); panel.add(stLabel); panel.add(timeLabel); panel.add(timeFiled); panel.add(allnumLabel); panel.add(allnumFiled); panel.add(staffMoLabel); panel.add(entryLabel); panel.add(entryFiled); panel.add(quitLabel); panel.add(quitFiled); panel.add(mwLabel); panel.add(manLabel); panel.add(manFiled); panel.add(womanLabel); panel.add(womanFiled); panel.add(proportionLabel); panel.add(proportionFiled); panel.add(distributionLabel); panel.add(mdpLabel); panel.add(mdpFiled); panel.add(pdpLabel); panel.add(pdpFiled); panel.add(bdpLabel); panel.add(bdpFiled); //将组件加到相应面板中 xmLabel.setBounds(120,20,100,30); xzLabel.setBounds(240,20,100,30); stLabel.setBounds(360,20,100,30); timeLabel.setBounds(120,50,100,30); timeFiled.setBounds(360,50,100,30); allnumLabel.setBounds(120,100,100,30); allnumFiled.setBounds(360,100,100,30); staffMoLabel.setBounds(120,150,100,30); entryLabel.setBounds(240,150,100,30); entryFiled.setBounds(360,150,100,30); quitLabel.setBounds(240,200,100,30); quitFiled.setBounds(360,200,100,30); mwLabel.setBounds(120,250,100,30); manLabel.setBounds(240,250,100,30); manFiled.setBounds(360,250,100,30); womanLabel.setBounds(240,300,100,30); womanFiled.setBounds(360,300,100,30); proportionLabel.setBounds(240,350,100,30); proportionFiled.setBounds(360,350,100,30); distributionLabel.setBounds(120,400,100,30); mdpLabel.setBounds(240,400,100,30); mdpFiled.setBounds(360,400,100,30); pdpLabel.setBounds(240,450,100,30); pdpFiled.setBounds(360,450,100,30); bdpLabel.setBounds(240,500,100,30); bdpFiled.setBounds(360,500,100,30); //采用null布局,设置组建坐标值 this.add(panel,BorderLayout.CENTER); this.setBounds(300, 100, 600, 600); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.getContentPane().setBackground(Color.GRAY); //将面板放入框架,设置相应属性(4)员工考勤界面 JLabel idlabel = new JLabel(”ID“);JComboBox idbox =new JComboBox();CheckTable model = null; JButton wbtn=new JButton(”修改“); JButton cbtn=new JButton(”查询“);JButton mbtn=new JButton(”创建薪资表“);JButton rbtn=new JButton(”创建人事表“); JScrollPane scrollpane = null;JPanel spanel=new JPanel();JPanel vpanel=new JPanel();JTable table=null;spanel.add(idbox);panel.add(wbtn);spanel.add(cbtn);vpanel.add(mbtn);vpanel.add(rbtn);spanel.setBackground(Color.GRAY);vpanel.setBackground(Color.GRAY);this.add(spanel,BorderLayout.NORTH);this.add(vpanel,BorderLayout.SOUTH);this.setBounds(300, 180, 600, 350);this.setVisible(true);this.getContentPane().setBackground(Color.GRAY); (5)选择考勤表界面 JLabel checklabel = new JLabel(”选择考勤表“);JLabel newlabel = new JLabel(”创建考勤表“);JComboBox timebox =new JComboBox();JTextField newfield = new JTextField();JButton btn=new JButton(”确认“);JButton nbtn=new JButton(”创建");JPanel spanel=new JPanel();spanel.add(checklabel); spanel.add(timebox); spanel.add(btn); spanel.add(newlabel); spanel.add(newfield); spanel.add(nbtn); checklabel.setBounds(30,90,100,30); timebox.setBounds(180,90,100,30); btn.setBounds(360,90,100,30); newlabel.setBounds(30,200,100,30); newfield.setBounds(180,200,100,30); nbtn.setBounds(360,200,100,30); this.add(spanel); this.setBounds(300, 180, 600, 350); this.setVisible(true); 三、结果和数据处理 四、结论 1.Swing图形界面 图形用户界面(GUI)是程序不可或缺的一部分,它便于用户和程序的交互。在Swing界面中是以Frame为框架,采用合理的布局方式(FlowLayout,BorderLayout,GridLayout,null),将Panel加入框架之中,而实现界面的各个组件将调用各种方法设置自身属性实行可视化界面以及加入到面板之中。再通过事件监听器实现事件的监听预处理机制。 2.数据库 在这次课程设计中哦我主要负责Swing图像界面,对于数据库只做了最简单的了解。程序中采用了最流行的关系型数据库mysql,雪化了mysql的建立,删除,与修改以及使用sql语言对数据库进行一些简单的操作,将按钮等设置的监听事件与数据库相连接。 五、问题与讨论 1.组件的方法调用 在这次课程设计中,用到了很多的组件,例如Button,Jlabel,TextField,ComBox,等。Swing图形界面也确实提供了很多方法去设置相关组件的属性,例如label.setVisible(false);设置标签不可见等很多方法,只要查看API文档几乎就能实现很多功能,但是对于按钮等最常见的组件来说设置大小如果不依靠相关布局方式很难设置,我在程序中之所以运用了很多的bull布局方式就是为了实现组件大小的设置,如果说能有一个方法直接设置组件大小而不受其他组件或容器影响就能使代码很简洁了。2.相对布局 在编写图像界面的程序的时候,我用了很多的布局方式,有FlowLayout,BorderLayout,GrirLayout,null等,其中null布局用的最多。null布局的优点在于可以将组建的位置精准到坐标值,可以把组件放到任意想放置的位置,另外可以通过null去设置组件的大小,相较于其他布局方式来说是一个很大的优势。但同时它的缺点在于不能根据Frame的大小变化而改变位置。其他三种布局方式虽然实现了岁Frame大小变动而改变组件大小及位置但是不容易控制,如果null布局能实现相对布局就是很好的一种布局方式了。 《Java语言程序设计》 题 目:指导老师:姓 名:专 业:班 级:日 期:课程设计报告 目 录 一、系统总体设计.......................................1 (一)设计目标及完成功能..............................1 (二)系统结构设计...................................1 二、数据库设计........................................1 三、详细设计..........................................1(一)界面设计........................................1(二)系统设计........................................2(三)关键技术及算法..................................2 四、测试..............................................2 五、安装使用说明.......................................2 总结(体会)..........................................2 参考文献:............................................2 《Java语言程序设计》课程设计报告 一、系统总体设计 (一)设计目标及完成功能 此部分可以包括如下内容: 1.窗口功能说明:设计了几个窗口,分别实现什么功能.2.菜单栏或工具栏说明:如果设计了菜单或工具栏,分别说明包括哪些项及其各自实现什么操作.…… (二)系统结构设计 说明:要绘出系统结构图 二、数据库设计 必须包含以下内容:E-R图(说明所有实体及其属性)、表结构列表(字段名、类型、主键、备注等)。 没有用到数据库的不用写此部分 三、详细设计 (一)界面设计 界面抓图,图要有编号和标题(格式:图1 主界面图),位于图的下方居中对齐。 《Java语言程序设计》课程设计报告 (二)系统设计 1.共设计了几个类或接口,是否有继承关系,各实现什么功能,绘图(列表)说明。 2.列表说明各类的方法及其功能。 (三)关键技术及算法 使用的主要算法分析、关键技术说明。如数据库连接技术、加密解密算法等。 四、测试 五、安装使用说明 1.系统配置说明。是否需要配置数据源或安装补丁包、导入数据库等。 2.登录的用户名、密码。3.其他特殊说明。 总结(体会) (谈谈本次课程设计的心得体会) 参考文献: [1] 窦万峰.软件工程方法与实践[M].机械工业出版社,2009 [2] 李兆锋,张得生.Java Web项目开发案例精粹[M].电子工业出版社,2010 [3] 沈泽刚,秦玉平.Java Web编程技术[M].清华大学出版社,2009 《Java语言程序设计》课程设计报告 包括书籍、网站、论坛等。 说明:(以下内容作为要求) 正文部分一律用小四号字,宋体,1.5倍行距。一级大标题黑体四号字靠左,加粗。二级大标题黑体四号靠左,不加粗。 参考文献: (要求:五号字,宋体,左对齐,悬挂缩进,单倍行距。按作者、书名、出版社、出版时间格式逐一列出) 《Java课程实习》报告 题目 学号 学生姓名 音乐播放器 201011621335 201011621329 200811621320 朱剑峰 薛文博 刘彬 联系方式 *** *** *** 所在专业 所在班级 指导教师 成绩 教师签字 计算机科学与技术 1103 刘思凤 课程设计时间:2013年6月1日 至 2013年6月25日 评语: 广东海洋大学本科生课程设计报告 目 录 摘要......................................................................................................................................2 1 绪论..............................................................................................................................3 1.1 1.2 1.3 1.4 2 2.1 2.2 3 3.1 3.2 课题背景..............................................................................................................3 课程设计目的......................................................................................................3 课程设计实验环境..............................................................................................3 课程设计要求......................................................................................................4 程序界面布局设计..............................................................................................4 功能分析..............................................................................................................4 系统功能结构图..................................................................................................5 模块功能设计......................................................................................................5 课程系统分析..............................................................................................................4 系统设计与实现..........................................................................................................5 3.2.1 “菜单栏”功能设计......................................................................................5 3.2.2 “动态音频播放进度显示”功能设计..........................................................9 3.2.3 “歌曲搜索”功能实现..................................................................................9 3.2.4 “歌曲播放/停止”功能实现......................................................................10 3.2.5 “列表展示”功能实现................................................................................11 4 系统优点与缺点........................................................................................................13 4.1 4.2 5 系统优点...............................................................................................................13 系统缺点...............................................................................................................13 系统开发过程............................................................................................................14 Myeclipse平台开发版本...............................................................................................14 NetBeans开发平台版本................................................................................................15 设计总结....................................................................................................................16 参考文献.............................................................................................................................17 附 录.................................................................................................................................18 关键代码..........................................................................................................................18 1、音乐解码函数(decodeMusic)........................................................................18 2、播放线程类(class PlayThread).....................................................................20 3、控制滚动条类(class RunSlider)...................................................................21 广东海洋大学本科生课程设计报告 摘要 JAVA是目前最流行的软件开发语言之一,称为网络上的“世界语”。JAVA适合开发基于多媒体、与平台无关、用面向对象的方法进行的基于Internet、Intranet、Extranet的Applet和应用程序。它具有简单高效、面向对象、不依赖于机器结构的特点,支持多线程、分布和并发机制。用JAVA开发的应用软件在可移植性、健壮性、安全性等方面大大优于已存在的其他编程语言。 JAVA是一门包含多种知识的学科,提供了丰富的类库,能最大限度地利用网络。JAVA可广泛用于面向对象的事件描述、处理面向对象的企业型的应用开发,还应用于Internet系统管理、Web页面设计、Internet可视化软件开发等方面。在学习的过程中我学到了许多以前没有学到的概念和新鲜资讯。运用这些知识可以完成老师交给我的课程设计任务。这次老师让我们自己拟订题目,给了我们很大的想象空间。我们自选了一个音乐播放器的课程设计题目。 本小组之所以选择做音乐播放器,全赖于本小组成员均对音乐有浓厚的兴趣,虽热衷于听音乐,但现在网上流传的音乐播放器还不能满足我们这些发烧友,像高清音乐等,这些高品质的作品若在现流行的播放器上运行,这只能做普通音乐文件“享用”。话说如此,因本小组开发能力有限,课程比较多,时间所限,以至暂且把音乐播放器开发到version0.9。主要功能还未能达到我们想要的境界。 小结一下,本小组的播放器所具备的功能有如下,添加音乐,删除音乐,搜索音乐,更换播放器皮肤,更改播放模式等。(详见2.2节) 本次设计的播放器在具备基本功能的基础上,还具有很强的扩展性,如歌词导入,可播放音乐类型的增加等等这些还未实现的地方我们都提供了许多接口,以便日后做修改或增加功能所用。 能够具备一个属于自己的播放器确实是一件非常高兴的事情,能够一边开发一边享受音乐的熏陶更是一件难得可贵的经历,愿此摘要能让读者感受得到笔者的兴奋与成功。 广东海洋大学本科生课程设计报告 音乐播放器 任务分工 系统设计与代码实现:朱剑峰 系统测试与维护:薛文博 需求与功能分析:刘彬 指导教师:刘思凤 绪论 1.1 课题背景 随着社会电子音乐文件的与日俱增,作为现在最流行的音乐文件*.mp3,*.wav文件的数量和规模也在比以往的任何时候要多,不论是电台DJ需要使用方便而有效地管理自己所使用的音乐文件,还是个人。在计算机日益普及的今天,若采用一套有效的音乐播放器。将自己所收藏的大量的音乐文件能随时随地的播放,这将方便于众用户听音乐的需求。通过使用本音乐播放器能为音乐爱好者带来意想不到的收获。 1.2 课程设计目的 《应用软件开发实习》是计算机相关专业的必修专业基础课程,其实践性、应用性很强。实践教学环节是必不可少的一个重要环节。本课程的程序设计专题实际是计算机相关专业学生学习完《应用软件开发实习》课程后,进行的一次全面的综合训练,程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。 1.3 课程设计实验环境 程序运行在安装有windows操作系统的计算机上(台式机和笔记本),兼容windows 2K/XP/Vista/7/8 计算机硬件基本要求(仅供参考): 1.2.3.CPU:1G; 内存:512M.; 显卡:256M显存; 文件播放:需要安装有声卡、要求安装有语音库。 JAVA程序设计语言及相应的集成开发环境,Myeclipse和Netbeans开发工具。 广东海洋大学本科生课程设计报告 1.4 课程设计要求 按课程设计指导书提供的课题,要求学生在自行完成各个操作环节,并能实现且达到举一反三的目的,完成一个项目解决一类问题。要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够较好地理解和掌握,能够进行简单分析和判断;能编写出具有良好风格的程序;掌握JAVA程序设计的基本技能和面向对象的概念和方法;了解多线程、安全和网络等编程技术。同时培养学生进行分析问题、解决问题的能力;培养学生进行设计分析、设计方法、设计操作与测试、设计过程的观察、理解和归纳能力的提高。课程系统分析 2.1 程序界面布局设计 (1)创建一个JFrame类,类名为MyPlayer类。 (2)向对话框中添加JSlider控件、JList控件、JLabel控件、JJToggleButton控件、MenuBar菜单、JPanel容器、JToolBar容器以及JScrolPanel容器。 (3)设置所添加的控件的属性,以及使用Java的界面风格,本设计共使用了6种Java 的不同界面风格。 2.2 功能分析 MyPlayer播放器主要对常用Windows音频格式的文件实现播放控制: 主界面功能 菜单栏功能 添加音乐; 添加音乐文件(即导入一个或多个音乐文件至列表当中); 添加音乐目录(即导入文件夹中所有的音乐文件至列表当中); 控制; 随机播放; 顺序播放; 单曲循环; 设置歌词(有待开发); 更换皮肤; 默认、深海世界、迷人金属、香韵咖啡、骇客帝国、浪漫满屋(均为java的界面风格) 关于; 广东海洋大学本科生课程设计报告 帮助(记录作者的相关信息以及软件开发的日期); 动态音频播放进度显示; 正在播放歌曲在顶层的显示 播放歌曲的时间长度的显示以及正在播放时间的长度的显示 滚动条随播放状态改变显示 歌曲搜索功能; 根据关键字搜索对应的歌曲; 歌曲播放/停止功能; 上一首;(播放上一首歌曲并根据播放模式来选择) 下一首;(播放下一首歌曲并根据播放模式来选择) 播放/停止;(播放或停止歌曲) 双击播放/双击停止;(在列表中对指定歌曲的操作) 列表展示功能; 隐藏/显示列表; 移除单个音乐文件; 移除所有音乐文件; 显示当前歌曲数目,播放模式,皮肤情况; 系统设计与实现 3.1 系统功能结构图 MyPlayer播放器的功能结构图如图3-1。 主界面功能菜单栏功能动态音频播放进度显示歌曲搜索功能歌曲播放/停止功能列表展示功能 图3-1 主界面功能图 3.2 模块功能设计 3.2.1 “菜单栏”功能设计 “菜单栏”功能结构图如图3-2-1。 广东海洋大学本科生课程设计报告 菜单栏功能添加音乐添加音乐文件添加音乐目录控制更换皮肤关于随机播放顺序播放单曲循环种皮肤图3-2-1菜单栏功能结构 6帮助 3.2.1.1 “添加音乐”功能实现 当点击“添加歌曲/文件夹”选择“添加本地歌曲”或“添加本地歌曲文件夹”的时候,这时候会触发这两个JMenuItem事件,调用了open()函数(opendir()函数),即将选中的音乐文件(或文件夹内所有音乐文件)的信息(名称与路径)放入nameVector 和 urlVector 当中。并修改listCount的值,显示歌曲的总数,最后将nameVector的所有内容放入list列表当中。如图3-2-1-1。 图3-2-1-1(左上)选择操作,(左下)选择目录,(右下)列表显示 广东海洋大学本科生课程设计报告 3.2.1.2 “控制”功能实现 当选择“控制”功能的任意一项,则会使全局的chosenMethod整型变量的值根据选择的项赋对应的值,值域为1(随机播放)、2(顺序播放)、3(单曲循环)。因播放器的播放功能是一个while(true)的循环,每当播放歌曲时候,播放前会由函数chooseNextSong()根据chosenMethod的值来选择下一首歌是那一首。 如果值是1,则会由[0,listCount(列表歌曲总数)],获取随机数,再根据play()函数播放;如果值是2,则根据chosenIndex(当前播放歌曲号),直接加一,再根据play()函数播放;如果值是3,则chosenIndex(当前播放歌曲号)的值不再修改,再根据play()函数播放;如图3-2-1-2。 图3-2-1-2(左上)选择操作;(左下)随机播放后歌曲序号,(此处为后台显示),起始播放第1首歌,下一首歌为第295首歌曲;(右侧)为列表显示,指向对应歌曲,并且列表底下显示“随机播放” 3.2.1.3 “更换皮肤”功能实现 当选择“更换皮肤”功能的任意一项,则会触发对应事件的发生,调用函数loadskin1()或loadskin2()等等。此时会调用LookAndFeel的类,指定java包含的皮肤风格。Loadskin1()对应“默认”,loadskin2()对应“深海世界”等等。 选择皮肤后,主界面底下会显示对应的提示,如选择了“浪漫满屋”,地下就会显示 “皮肤:浪漫满屋”。如图3-2-1-3所示。 广东海洋大学本科生课程设计报告 图3-2-1-3 (左)选项显示,(右)换肤后主 界面情况。 3.2.1.4 “关于”功能实现 当选择“帮助”功能时,则弹出信息窗口,提示本软件的开发时间与开发人员相关信息。如图3-2-1-4所示。 图3-2-1-4 广东海洋大学本科生课程设计报告 3.2.2 “动态音频播放进度显示”功能设计 当歌曲播放正在播放时,则顶层“正在播放”处会显示歌曲的名称,当歌曲名称过长时候,超长部分会用省略号显示。 同时会根据歌曲的格式,得到歌曲的长度,并显示在歌曲的右侧的JLabel fileTime中;另外会另起一个线程RunSlider来控制计时功能,每1秒钟,滚动条左侧JLabel runningTime 会根据播放的时间来修改,滚动条PlayerSlider则会每秒钟根据runingTime的值来移动。如图3-2-2所示 图3-2-2 正在播放歌曲中的动态播放进度显示。 3.2.3 “歌曲搜索”功能实现 在搜索栏中输入关键字,在回车确认,系统就会调用seachMusic()来搜索与关键字吻合的歌曲,并将其放入临时的Vector tmpName当中,并显示其到list列表当中。如图3-2-3-1 在临时的列表中选择所需要播放的歌曲,双击播放,同时临时列表消失,回复原来的列表,即导入nameVector的数据到list当中。 当点击“X”按钮,若还在临时列表当中,则会清除临时列表并且恢复原来的列表;若已经恢复到临时列表,则搜索框中会返回提示“请输入搜索关键字...”。 图3-2-3-1(上)搜索“陈奕迅”的歌曲 (下)取消搜索后,搜索框的内容 广东海洋大学本科生课程设计报告 3.2.4 “歌曲播放/停止”功能实现 “歌曲播放/停止”功能结构图如图3-2-4。 歌曲播放/停止功能上一首下一首播放/停止双击播放/停止 图3-2-4 “歌曲播放/停止”功能结构 3.2.4.1 “上一首”“下一首”功能实现 当点击“上一首”的按钮时,会根据按钮事件,若chosenMethod(播放方式)的值为1(即随机播放)则系统会调用chooseNextSong()来随机选择歌曲号来播放下一首歌;若chosenMethod不为1,则会调用previousMusic(),对chosenIndex(当前播放歌曲号)减一,再调用play()函数播放上一首歌曲。 当点击“下一首”的按钮时,会根据按钮事件,若chosenMethod(播放方式)的值为1(即随机播放)则系统会调用chooseNextSong()来随机选择歌曲号来播放下一首歌;若chosenMethod不为1,则会调用nextMusic(),对chosenIndex(当前播放歌曲号)加1,再调用play()函数播放下一首歌曲。 3.2.4.2 “播放/停止”“双击播放/停止”功能实现 当点击“播放/停止”的按钮时候,若点击了“播放”,则会显示“停止”,同时会对列表正在选中的歌曲进行播放。同时会触发“动态音频播放进度显示”功能(3.2.2节所介绍),更改或增加播放信息; 若点击了“停止”,则会显示“播放”,同时会对当前播放的歌曲进行停止,同样会触发“动态音频播放进度显示”功能,清除对应的显示。如图3-2-4-2 广东海洋大学本科生课程设计报告 图3-2-4-2(左)“播放” (右)“停止” 3.2.5 “列表展示”功能实现 “列表展示”功能结构图如图3-2-5。 列表展示功能隐藏/显示列表移除音乐文件显示列表信息 图3-2-5 “列表展示”功能结构 3.2.5.1 “隐藏/显示列表”功能实现 当点击“显示列表/隐藏列表”的按钮时候,若点击了“显示列表”,则会显示“隐藏列表”,同时触发该事件,将原来的JFrame大框架的长度减少440个单位; 若点击了“隐藏列表”,则会显示“显示列表”,同时触发该事件,将原来的JFrame大框架的长度增加440个单位。 隐藏与显示列表这一功能虽然非常简单,但其重要性不可忽视,对于现在许多用户对音乐播放器的要求,就如自己的手机或着MP3一样,小巧、灵活、精致,至此这一项功能对于本小组一开始的设计就算是一个亮点。如图3-2-5-1所示。 广东海洋大学本科生课程设计报告 图3-2-5-1(左)隐藏列表,(右)显示列表 3.2.5.2 “移除歌曲”功能文件实现 当用鼠标对着列表的音乐文件右键的时候,会弹出两个选项“移除歌曲/移除所有歌曲”。 当选择“移除歌曲”,则对所选择的音乐文件从列表中移除,即事件的触发调用了deleteSingle()函数,将对应的项从列表中移除,从nameVector中移除,从urlVector中移除; 同理当选择“移除所有歌曲”的时候,事件触发调用deleteAll()函数,将列表清空,将nameVector中的元素清除。 以上两者运行过后均会更新主界面底层“歌曲数目”,并且停止正在播放的歌曲。 图3-2-5-2右键列表后出现的选择项 广东海洋大学本科生课程设计报告 3.2.5.3 “显示列表信息”功能实现 由“添加音乐”功能(3.2.1.1节)调用的open()、opendir()函数,会将保存在nameVector中的内容导入列表当中。当双击列表中的歌曲的时候,如果歌曲正在播放则会停止,如果播放器没有进行播放,则双击后就进行播放。 当我们对着列表右键时,则会弹出列表,“移除歌曲/移除所有歌曲”,详见(3.2.5.2节)系统优点与缺点 4.1 系统优点 1、windows界面风格可选择性,如上如所述,本音乐播放器具有6种皮肤可以更换。这大大满足了一个娱乐性的软件的需要,并且皮肤起名也符合用户的感官需求,像“深海世界”、“浪漫满屋”这些贴切而休闲的词汇更能吸引用户对播放器的使用。 2、播放方式可选择性,对于喜欢听音乐的用户,会根据自己的需要选择一定的顺序来听音乐。 3、列表隐藏的功能,符合大众播放器的功能,将播放器的界面弄得小巧而精致,即使隐藏了列表也不妨碍主要的播放器功能。 4、搜索功能,随着网络的发达,音乐歌曲随处下载,人均播放列表的歌曲数目数以百计,这时候搜索功能就显得十分重要。本播放器根据关键字可以对列表进行搜索,并可以显示搜索后的列表,同时临时的列表不会缩减播放器功能。 4.2 系统缺点 1、本系统主要代码均在一个文件当中MyPlayer.java当中,由于本小组是用netBeans7.2.1开发平台开发的,对开发平台尚未了解,故暂且没有将代码弄得更具有可读性。 2、本播放器还缺少暂停功能,在开发的最后版本(Music_Player0.9fornetBeans)还在改进当中。期待1.0版本对此功能的实现。 3、本播放器对音乐文件的选择,仅仅.mp3文件以及.wav文件可播放。针对decodeMusic()解码函数的改善,尚未能解决。 4、本播放器缺少歌词设置、显示功能。由于本小组对播放器的主界面还未想到一个满意的设计,所以歌词的实现暂且没有实现,待界面设计得灵活的时候,再添加歌词的功能。 广东海洋大学本科生课程设计报告 系统开发过程 Myeclipse平台开发版本 Version 0.1 1、菜单栏 *文件包括“打开文件”“打开目录”“退出程序” *控制-随机播放-顺序播放-单曲循环-设置歌词 *更换皮肤 *帮助-关于 2、上一首、下一首、停止/播放、隐藏列表4个button 3、帮助显示-关于 消息框。 Version0.2 1、能打开文件,显示文件名称在下面的框内,多个文件显示在框内! 2、文件-退出程序 实现 3、能够显示列表与隐藏列表 Version0.3 1、双击能够播放 2、暂停 跟 继续 新增 1、双击整个title 换成为歌曲名称 问题 1、隐藏列表/显示列表 list 会缩水 2、filedialog 没有选择任何文件 直接关闭会出现错误!(verson0.4中已解决) 3、双击空的列表也可以开始(version 0.6for netBeans 已经解决) Version0.31(Version0.3崩溃) Version0.4 1、上一首,下一首 能够在列表中显示 2、上一首 下一首播放功能 新增: 1、打开文件可以多选 2、打开目录 可以把整个目录里面的MP3、wav文件导出在列表中。 问题: 1、双击 第一次 是开始,第二次 是停止(相对于同一首歌,相对于其它歌会停止,也不播放)(version 0.6for netBeans 已经解决) 2、播放完一首歌后,不能自动往下播放。(version 0.5forneatBeans 已经解决) 歌曲不能删除(version 0.6for netBeans 已经解决)修改: 1、“打开文件”“打开目录”分别换成 添加本地歌曲,添加本地歌曲文件夹 Version0.5 1、皮肤(简单的颜色或者图片) 2、更换皮肤-可供选择 修改: 1、项目已经转至netbeans平台上开发,并明明为Music_Player0.5forneatBeans 新增: 1、快捷键 添加歌曲/文件夹 添加了快捷键 和 关于 加了快捷键 广东海洋大学本科生课程设计报告 Version 0.6 1、播放模式 2、删除功能 问题: 1、播放列表可以拉出来,播放到名字比较长的歌曲,list会变宽!(已经完全解决,删 除正在播放的label) 2、播放按钮,双击 未解决(version0.6已经修复),上一首 下一首 置顶时候,以及 随机播放时候 下一首上一首序号问题!(version0.6已经修复)。 3、菜单项 选中后,没有特别标志(解决办法 1、换另外一种菜单项 2、选中菜单项后 字 体等改变) selected 方法!是改变修改字体的!(version0.7添加1中 解决) 4、删除 单首歌,序号不能改变(version0.7已经修复)NetBeans开发平台版本 Version0.7 for netbeans 1、添加底下: 歌曲数目、播放模式、皮肤的显示 2、歌曲名前面有序号 3、音乐时间,以及滚动条 4、”正在播放“显示的问题 Version0.8 for netbeans 1、添加搜索模块 2、添加搜索功能 3、搜索功能->搜索列表播放功能 Version0.9fornetbeans 1、修改播放器软件运行时的图标(将java的图标换成“射手”图标) 广东海洋大学本科生课程设计报告 设计总结 JAVA是目前最流行的软件开发语言之一,称为网络上的“世界语”。JAVA适合开发基于多媒体、与平台无关、用面向对象的方法进行的基于Internet、Intranet、Extranet的Applet和应用程序。它具有简单高效、面向对象、不依赖于机器结构的特点,支持多线程、分布和并发机制。用JAVA开发的应用软件在可移植性、健壮性、安全性等方面大大优于已存在的其他编程语言。 JAVA是一门包含多种知识的学科,提供了丰富的类库,能最大限度地利用网络。JAVA可广泛用于面向对象的事件描述、处理面向对象的企业型的应用开发,还应用于Internet系统管理、Web页面设计、Internet可视化软件开发等方面。在学习的过程中我学到了许多以前没有学到的概念和新鲜资讯。运用这些知识可以完成老师交给我的课程设计任务。这次老师让我们自己拟订题目,给了我们很大的想象空间。我们自选了一个音乐播放器的课程设计题目。 课程设计的过程虽然是艰难而辛苦的,但是我却从中感到了快乐与欣慰。快乐是因为我以前对于JAVA的知识可以说是孤陋寡闻,但是通过这次课程设计我使自己的知识更加的丰富了,加大了自己的知识面。让自己的实力扩大了。所以我感到非常的快乐。欣慰是因为看着自己做出的课程设计得到了老师的认同,取得了成功。这次课程设计的整体过程是充实而满足的。 广东海洋大学本科生课程设计报告 参考文献 [1](美)埃克尔(Eckel , B.)著,《Java编程思想》(第四版)陈昊鹏译.一北京: 机械工业出版社,2007.6 [2] 刁成嘉 著,《UML系统建模与分析设计》,机械工业出版社,2007.6 [3] 朱喜福 著,《Java程序设计》(第2版),清华大学出版社, 2009.10 [4] 辛运帏 著,《Java语言程序设计》(第1版),人民邮电出版社, 2009.10 [5] 叶核亚 著,《Java程序设计实用教程》(第3版),电子工业出版社,2010.2 [6] 耿祥义,张跃平编著,《Java面向对象程序设计》.一北京:清华大学出版社,2010.1 广东海洋大学本科生课程设计报告 附 录 关键代码 1、音乐解码函数(decodeMusic) 解析:由于java applet播放声音,对应的格式只有一些原始格式如.au、.Wav、.Midi、.rfm格式,因此一下的解码函数就非常必要了,即将MP3等其它格式文件的音频等格式修改成系统能够实现的格式,并写入内存由此来实现播放功能。详细实现请阅读如下代码。 public void decodeMusic(AudioInputStream in){// 开始解码 MP3 AudioFormat format = in.getFormat(); AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,// 音频编码技术 format.getSampleRate(),// 每秒的样本数 16,// 每个样本中的位数 format.getChannels(),// 声道数(单声道 1 个,立体声 2 个,等等) format.getChannels()* 2,// 每帧中的字节数 format.getSampleRate(), false);// 每秒的帧数和是否以 big-endian // 字节顺序存储单个样本中的数据 // 然后重新获取一个新的输入流,AudioInputStream decodeIn = AudioSystem.getAudioInputStream(decodedFormat, in);/** * 源数据行是可以写入数据的数据行。它充当其混频器的源。应用程序将音频字节写入源数据行,这样可处理字节缓冲并将它们传递给混频器。 * 混频器可以将这些样本与取自其他源的样本混合起来,然后将该混合物传递到输出端口之类的目标(它可表示声卡上的音频输出设备)。 * */ SourceDataLine sdl = null;// 然后 DataLine.Info info = new DataLine.Info(SourceDataLine.class,decodedFormat);try { /** * AudioSystem :类充当取样音频系统资源的入口点。此类允许查询和访问安装在系统上的混频器 * **/ sdl =(SourceDataLine)AudioSystem.getLine(info); sdl.open(decodedFormat); } catch(Exception e){ 广东海洋大学本科生课程设计报告 e.printStackTrace();} /** 指示该行是否支持特定类型的控件。*/ if(sdl.isControlSupported(FloatControl.Type.PAN)){ // FloatControl 对象提供对浮点值范围的控制 FloatControl pan =(FloatControl)sdl .getControl(FloatControl.Type.PAN); if(curPosition == Position.RIGHT){ pan.setValue(1.0f); } else if(curPosition == Position.LEFT){ pan.setValue(-1.0f); } } sdl.start();int nBytesRead = 0;byte[] abData = new byte[EXTERANAL_BUFFER_SIZE];try { while(nBytesRead!=-1){ // 文件流的读写 nBytesRead = decodeIn.read(abData, 0, abData.length); if(nBytesRead >= 0){ sdl.write(abData, 0, nBytesRead); } } } catch(Exception e){ e.printStackTrace(); return;} finally { // 通过在清空数据行的内部缓冲区之前继续数据 I/O,排空数据行中的列队数据。 sdl.drain(); sdl.close();} } 广东海洋大学本科生课程设计报告 2、播放线程类(class PlayThread) 解析:本播放器只使用一个线程来实现歌曲播放的功能,若用户要更换歌曲或者停止音乐,则对线程重建,即杀死原线程再建立新的线程,其实现的效果还是跟原来线程一样。同时此线程包含了许多子功能,如更改播放模式,对“上一首”“下一首”显示“正在播放”等功能均在此线程上实现。详细内容请阅读如下代码。 class PlayThread extends Thread{ public void run(){ while(true){ try { setInitShowing();//初始化滚动条以及计时label 的值 isStop = true;//标志状态,说明是停止了 filename =(String)nameVector.get(chosenIndex).toString();//取chosenIndex对应的歌曲名称 filepath =(String)urlVector.get(chosenIndex).toString();////取chosenIndex对应的歌曲路径 System.out.println(“我在播放:”+chosenIndex+“ ”+filename);//后台输出检测 /*设置“正在播放”的值,只输出前23个字符,以免超出长度,后面补...*/ String showName = null; if(filename.length()>23){ showName = filename.substring(0, 23)+ “..”; }else{ showName = filename; } showTileOfMusic.setText(“正在播放:”+showName); File file = new File(filepath); setTitle(filename); list.setSelectedValue(nameVector.get(chosenIndex), true); listIndex = chosenIndex; stporplySongButton.setText(“停止”);//修改 停止/播放button的状态值 AudioInputStream in = AudioSystem.getAudioInputStream(file);//去音乐文件 AudioFileFormat aff = AudioSystem.getAudioFileFormat(file);//去音乐文件的格式(为了得到歌曲长度) musicLength = aff.getFrameLength()/aff.getFormat().getFrameRate();//取音乐文件的长度 System.out.println(“我有那么长:”+musicLength);//后台显示,用于检测 setShowingTime(musicLength,fileTime);//显示总长度到fileTime label中 PlayerSlider.setMaximum((int)musicLength);//并且设置滚动条的最大值 isStop = false;//设置正在播放状态 hasStop = false;//设置正在播放状态 decodeMusic(in);//解码并播放 isStop = true;//播放完毕后设置回非播放状态 hasStop = true; 广东海洋大学本科生课程设计报告 chooseNextSong();//选择下一首歌返回while } catch(Exception e){ //e.printStackTrace(); System.out.println(“刚才那首歌出错了!”);//如果出现错误,则显示直接跳至下一首歌 nextMusic(); } } } } 3、控制滚动条类(class RunSlider) 解析:此类虽然简短,但其能动态实现滚动条以及播放时间的运动。其中setShowingTime()方法提供的接口十分灵活,能够对不同空间进行时间的控制,本播放器只对播放时间的两个JLabel实现了此功能,这大大提高了本播放器的可扩展性。详细内容请阅读如下代码。 class RunSlider extends Thread{ public void run(){ try { musicCouter = 0; while(true){ Thread.sleep(1000);//每秒钟滚动一次 musicCouter++; PlayerSlider.setValue((int)musicCouter); setShowingTime(musicCouter, runingTime);//转换时间并显示回去runingTime label } } catch(InterruptedException ex){ Logger.getLogger(MyPlayer.class.getName()).log(Level.SEVERE, null, ex); } } } 1--计算器 Java实习报告 目录 一、课程设计目的.................................................................................................................2 二、课程设计任务..................................................................................................................2 2.1、设计任务................................................................................................................2 2.2、课程设计要求:....................................................................................................2 2.3、需求分析................................................................................................................2 三、开发工具与平台.............................................................................................................3 3.1、开发工具................................................................................................................3 3.2、开发平台................................................................................................................3 四、设计思路..........................................................................................................................4 4.1、界面设计.................................................................................................................4 4.2.1、逻辑设计.............................................................................................................4 4.2.2、程序流程图...........................................................................................................5 4.2.3、主要代码展示及说明............................................................................................5 4.3、程序测试............................................................................................................10 五、实验小结........................................................................................................................11 六、附录(程序代码)..........................................................................................................12 页 第 1--计算器 Java实习报告 一、课程设计目的 1、熟练掌握java面向对象编程。 2、选择合适的数据结构实现需求。 3、熟练使用各种控制结构。 4、GUI组件、事件处理技术。 二、课程设计任务 2.1、设计任务 设计一个简易的计算器,可以进行四则运算:加、减、乘、除等(限于十进制下) 程序要求: (1)应具有相应的界面,可参考Windows操作系统自带的计算器界面。(2)操作符号定为:“+”,“-”,“*”,“/”,“+/-”等。(按国际惯例设计)(3)用户通过点击程序界面上按钮,实现数字、运算符的输入操作。(4)以上部分为必须完成的内容。选作部分: (1)具有操作符号“1/x”,“sqrt”(开方),“.”(小数功能)等。 2.2、课程设计要求: (1)应用自己所学课程知识完成对计算器的基本任务。 (2)查阅相关资料,学习和掌握项目中涉及的新知识,提高自学能力。 (3)通过应用java程序编写计算器来提升自己对简单的图形界面有一定的掌握和了解。 2.3、需求分析 1.设计的计算器可以完成加法、减法、乘法、除法的简单运算。2.实现一些简单的扩展运算,如:正负号、倒数、退格、清零等功能。 页 第 2--计算器 Java实习报告3.添加小数点功能,用以实现浮点型数据的计算。 4.使用布局管理器设计一个计算器的界面,使用事件监听器处理数据的输入,并完成相关的计算。 三、开发工具与平台 3.1、开发工具 Microsoft Windows 7旗舰版 3.2、开发平台 JDK1.6.0-02 和UE编译器 页 第 3--计算器 Java实习报告 四、设计思路 4.1、界面设计:(如图3-1) 图3-1 4.2.1、逻辑设计: (1)根据所设计出来的界面,首先要设计其GUI界面,总体界面有一个文本框,20个按钮,总体界面用BorderLayout布局,文本框放置在最NORTH,然后0到9以及+,-,*,/等按钮放置到一个面板Panel中,完成界面设计。 (2)设计计算流程,首先点击数字按钮时,将按钮数值添加到文本框当中,并将该数值保存到一个字符串中,再次点击数字按钮时,将之前保存的字符串与新的数值拼接起来,再添加到文本框当中,直到点击运算符按钮时,将文本框当中的字符串保存在一个字符串变量中,然后重置文本框内容,将运算符号显示到文本框中,随后输入第二个计算数据时,用同样的办法保存数据,最后通过控制“=”运算符先将字符串数据转化成双精度类型,然后计算出结果并显示到文本框当中。 (3)基本运算设计完成以后则开始考虑其他个别功能的实现,例如倒数、清零、退格等功能的实现,清零直接重置文本框内容,退格功能则采用substring函数截取字符串长度。 页 第 4--计算器 Java实习报告 4.2.2、程序流程图: 4.2.3、主要代码展示及说明: 总体代码的设计: 程序采用继承windowadapter类,新建Jframe窗体,利用数组来定义JBotton按钮,同时利用数组注册监听,采用4行5列网格布局,完成计算器界面的基本设置,在窗体的正常关闭方面,采用匿名类实现窗体的正常关闭。最后对按钮进行计算分析,分别设定输入数据的A类、运算符控制的Opertion类,退格功能的BackSpace类、计算结果的Result类等等,一步步实现计算器的基本功能! (1)类A的设计(数据的输入) class A implements ActionListener { public void actionPerformed(ActionEvent e){ String a = Jtext.getText(); String s = e.getActionCommand(); if(a.equals(“0.”)||a.equals(“+”)||a.equals(“-”)||a.equals(“*”)||a.equals(“/”)) 页 第 5--计算器 Java实习报告 } } Jtext.setText(s);else { if(flag2){ Jtext.setText(s); flag2=false;} else Jtext.setText(a+s);} 功能解释:程序开始时,程序初始化文本框的内容为“0.”,点击数字按钮,则调用类A,首先用a来获取当前文本框内容,s来获取按钮数值,然后进行判断,若a的值为上述代码的值则输出s的值,再次点击数字按钮时,再次调用A类,此时a的值为上次输入的s值,第一个if语句不满足,执行下个if语句if(flag2),flag2初始值为false,该语句的功能是在执行了“=”号按钮时,防止新的数字按钮的值合并到到已经得出的结果上,例如:12+12=24,此时再点击数字按钮3时,则文本框内容被重置,输出数值3,而不是243,如果if(flag2)不满足,则将字符串a和s合并并输出,得出第一个要计算的数据。 (2)类Opertion的设计:(运算符的控制) class Opertion implements ActionListener { public void actionPerformed(ActionEvent e){ cal=e.getActionCommand(); if(flag1==true) x=Jtext.getText(); Jtext.setText(cal); flag1=false;} 页 第 6--计算器 Java实习报告 } 功能解释:当点击运算符控制按钮时,首先将运算符的数值赋值给cal(初值为空),紧接着进行判断,flag1初值为ture,该类的作用为在点击运算符按钮时,将计算的第一个数据保存在x字符串变量当中,然后将文本框内容重置为点击的运算符的数值,类的结尾将flag1赋值为false,防止再次点击运算符按钮时改变了x的值。 (附:此时文本框内容为运算符的值,输入第二个计算数据时,点击数字按钮,则再次调用A类,此时满足A类中第一个if语句,文本框内容被重置为数字按钮的值,接下来与获取第一个计算数据步骤一样,直到点击“=”号运算符为止!) (3)类Result的设计:(计算并输出结果) class Result implements ActionListener //计算并显示结果 { public void actionPerformed(ActionEvent e){ double num1; num1=Double.parseDouble(x); y=Jtext.getText(); double num2; num2=Double.parseDouble(y); double result=0; if(num2!=0) { if(cal.equals(“+”)) result=num1+num2; if(cal.equals(“-”)) result=num1-num2; if(cal.equals(“*”)) result=num1*num2; String s1=Double.toString(result); Jtext.setText(s1); } if(cal.equals(“/”)) 页 第 7--计算器 Java实习报告 } { if(num2==0) Jtext.setText(“除数不能为0”); else { result=num1/num2; String s1=Double.toString(result); Jtext.setText(s1); } } flag1=true; flag2=true;} 功能解释:首先定义两个Double型num1,num2,将之前保存的第一个计算数据x强制转换为Double型后赋值给num1,接着用字符串变量y来获取当前文本框的内容,即第二个计算数据的值,同样再将其强制转换Double型后赋值给num2,然后进行运算符判断,对cal的值进行比较,然后进行相应的计算,将计算的结果转换成字符串后将其输出到文本框中,在类的最后将flag1、flag2赋值为true,作用是将计算的结果当作第二次计算的数据进行再运算,即将结果重新赋值给x作为第一个计算数据!(附:在此类中还考虑了当除数为零的情况。) (4)类BackSpace的设计:(功能类—退格) class BackSpace implements ActionListener { public void actionPerformed(ActionEvent e){ String s = e.getActionCommand(); String s1 = Jtext.getText(); if(s.equals(“退格”)) s1=new String(s1.substring(0,s1.length()-1)); Jtext.setText(s1);} } 页 第 8--计算器 Java实习报告 功能解释:这是计算器附加功能的实现,这里只介绍退格功能,像正负号、求倒数、清零等功能相似,所以就不再一一介绍。首先获取退格按钮的命令值赋给s,然后获取当前文本框的内容,即输入的数据,将其赋给s1,接着进行判断,利用substring函数将s1字符串截取为从第一个字符至倒数第二个字符为止的字符串并重新赋值给s1,再将其输出到文本框,实现退格的功能。 第 9 页 10--计算器 Java实习报告 4.3、程序测试 1.简单的运算:(以加法为例:123+456) 分析:计算的结果为579.0,为双精度型,计算的结果被设置在文本框的最右端,该计算器的一个特点是可直接在文本框中输入数据以及进行更改。 2.倒数的运算:(以123为例) 分析:输出的结果如图所示,倒数功能实现,计算时,不仅是结果,输入的数据同样可以先实现倒数功能后再进行相应的计算,没有影响! 3.退格的运算:(以123为例) 分析:输出的结果如图所示,本计算器退格键有一个特点是,就算是是计算后得出的结果也能实现退格,缺点是不能很好的处理小数点的问题,因为小数点也是字符串的一部分。 页 第 10--计算器 Java实习报告 4.正负号的运算:(以123为例) 分析:输出的结果如图所示,正负号添加能够很好的实现,但可以进行一些改进,比如在计算过程当中直接点击负号运算符输入负数进行计算! 5.总体分析: 该计算器基本运算没有问题,清零、正负号、求倒数、退格功能都能很好的实现,总体能完成一个计算器的基本功能,但仍有许多地方需要改进,比如小数点的实现所存在的一些问题,虽然在基本的运算过程当中不会造成太大影响,但这依然不能认为是一个很好的计算器,同时,在另一方面,该计算器还没能很好的实现连续计算的功能,必须每次按下等号按钮计算出结果后才能用产生的结果接着进行下一次的计算,改进的方法是在运算符上同时注册Result类,让运算符同时拥有计算结果的功能。 五、实验小结 本次课程设计到此算是告一段落了,经过这次的学习,我学到了很多东西,在此基础上更加巩固了自己对java的认识与了解。 在做本项目是时候,会遇到很多小问题,比如说,在整个运算过程中要如何确保输入的计算数据哪个是第一个计算数据的,哪个是第二个计算 页 第 11--计算器 Java实习报告数据的,同时也要区分运算符,因为该计算器程序应用的都是利用字符串来完成计算的,而且不能重复输出运算符,更不能将运算符错误的存储在了第一个计算数据的数值中,也得考虑到万一不小心重复点击了运算符按钮会不会造成第一个计算数据的重新赋值等等问题,最后想到利用布尔类型来很好的控制运算符的应用! 此次课程设计让我更了解熟悉了Java中的图形用户界面和它的编程方式。在完成课题的过程中也不断充实了自己,学习到了很多以前没有学习到的知识,收获很大。最大的收获就是对大学学习的总结和培养了解决困难的信心和能力,使我对所学知识能够融会贯通,又不断丰富了新知识。Java计算器设计使得我们对所学的专业课有了更为深刻的认识,使得知识得到了巩固和提高。 在接下来的时间里,我觉得我要更加努力的往深一层次的方面看齐,了解更多有关java的知识,对java有更深一步的了解,我会一步一步的走下去! 六、附录(程序代码)import java.awt.*;import javax.swing.*;import java.awt.event.*; public class TheCalculator extends WindowAdapter //程序框架继承自WindowAdapter类 { private JTextField Jtext=new JTextField(“0.”);private JFrame f=new JFrame(“计算器-赵磊”);private String x=“";private String y=”“;private String cal=”“;private boolean flag1=true;private boolean flag2=false; public void init()//初始化 { String[] buttonValue = new String[]{”1“,”2“,”3“,”+“,”C“,”4“,”5“,”6“,”-“,”退格 页 第 12--计算器 Java实习报告“,”7“,”8“,”9“,”*“,”1/x“,”0“,”+/-“,”.“,”/“,”=“}; Container contain = f.getContentPane(); JPanel Jpan = new JPanel(); JButton[] Jb=new JButton[20]; contain.setLayout(new BorderLayout());//采用4行5列的网格布局 Jpan.setLayout(new GridLayout(4,5)); Jtext.setHorizontalAlignment(JTextField.RIGHT); contain.add(Jtext,”North“); contain.add(Jpan); A num=new A();//数据 Result re=new Result();//结果 Opertion op=new Opertion();//运算符 Clear cl=new Clear();//清零 BackSpace back=new BackSpace();//退格 CountDown count_d=new CountDown();//倒数 Strains stra=new Strains();//相反数 for(int i = 0;i { Jb[i] = new JButton(buttonValue[i]); Jpan.add(Jb[i]); if(i==3 || i==8 || i==13 || i==18) Jb[i].addActionListener(op); if(i==0 || i==1 || i==2 || i==5 || i==6 || i==7|| i==10 || i==11 || i==12 || i==15 || i==17) Jb[i].addActionListener(num); if((i==3||i==4||i==8||i==9)||((i>12)&&(i<=19))&&i!=15) Jb[i].setForeground(new Color(255, 0, 0)); else Jb[i].setForeground(new Color(0, 0, 255));//控制按钮字体颜色 } Jb[4].addActionListener(cl); Jb[9].addActionListener(back); Jb[14].addActionListener(count_d); Jb[16].addActionListener(stra); Jb[19].addActionListener(re); f.setSize(320,240); f.setVisible(true); f.addWindowListener(//采用匿名类实现窗口的正常关闭 new WindowAdapter() 页 第 13--计算器 Java实习报告 { public void windowClosing(WindowEvent e) { System.exit(0); } });} class A implements ActionListener //输入数据 { public void actionPerformed(ActionEvent e){ String a = Jtext.getText(); String s = e.getActionCommand(); if(a.equals(”0.“)||a.equals(”+“)||a.equals(”-“)||a.equals(”*“)||a.equals(”/“)) Jtext.setText(s); else { if(flag2) { Jtext.setText(s); flag2=false; } else Jtext.setText(a+s); } } } class Opertion implements ActionListener { public void actionPerformed(ActionEvent e){ cal=e.getActionCommand(); if(flag1==true) x=Jtext.getText(); Jtext.setText(cal); flag1=false;} } 页 第 14--计算器 Java实习报告 class Clear implements ActionListener //清零功能 { public void actionPerformed(ActionEvent e){ Jtext.setText(”0.“);} } class CountDown implements ActionListener //求倒数类 { public void actionPerformed(ActionEvent e){ String s = e.getActionCommand(); String s1 = Jtext.getText(); if(s.equals(”1/x“)) s1 = new String(”“+1/Double.parseDouble(s1)); Jtext.setText(s1);} } class Strains implements ActionListener //求相反数类 { public void actionPerformed(ActionEvent e){ String s = e.getActionCommand(); String s1 = Jtext.getText(); if(s.equals(”+/-“)) s1=new String(”“+(0-Double.parseDouble(s1))); Jtext.setText(s1);} } class BackSpace implements ActionListener //退格功能 { public void actionPerformed(ActionEvent e){ String s = e.getActionCommand(); String s1 = Jtext.getText(); if(s.equals(”退格“)) s1=new String(s1.substring(0,s1.length()-1)); Jtext.setText(s1);} 页 第 15--计算器 Java实习报告 } class Result implements ActionListener //计算并显示结果 { public void actionPerformed(ActionEvent e){ double num1; num1=Double.parseDouble(x); y=Jtext.getText(); double num2; num2=Double.parseDouble(y); double result=0; if(num2!=0) { if(cal.equals(”+“)) result=num1+num2; if(cal.equals(”-“)) result=num1-num2; if(cal.equals(”*“)) result=num1*num2; String s1=Double.toString(result); Jtext.setText(s1); } if(cal.equals(”/“)) { if(num2==0) Jtext.setText(”除数不能为0"); else { result=num1/num2; String s1=Double.toString(result); Jtext.setText(s1); } } flag1=true; flag2=true;} } public static void main(String[] args)//main方法 { 页 第 16--计算器 Java实习报告 } } TheCalculator count=new TheCalculator();count.init(); 页 第 17第二篇:Java课程设计报告
第三篇:java课程设计报告
第四篇:Java课程设计报告
第五篇:java课程设计报告—计算器