《java程序大作业 - 记忆测试系统》 - 图文

更新时间:2024-03-26 16:53:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

成绩: 评语:

华南理工大学广州学院 2012-2013学年度第一学期

课程名称: 面向对象程序设计大作业 项目题目: 记忆测试系统 专业班级: 年 级: 2011级 姓 名: 学 号:

1 / 30

目录及程序设计说明书

1.1设计要求?????????????????????? 1.2总体设计??????????????????????3

1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6

MemoryGame.java(主类)??????????????????? MemoryTestArea.java ????????????????????? Block.java ?????????????????????????? Record.java ????????????????????????? ShowRecordDialog.java ???????????????????? People.java ??????????????????????????

1.3 详细设计 ??????????????????????4

1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7

MemoryGame类 ????????????????????????4 MemoryTestArea类 ??????????????????????10 Block类 ??????????????????????????18 ShowRecordDialog类 ?????????????????????19 People类 ??????????????????????????23 Record类 ???????????????????????????25 图像文件 ???????????????????????????28

1.4 课程设计总结 ????????????????????30

(参考文献 ??????????????????????????????)

2 / 30

1.1设计要求

记忆测试系统是通过回忆法测试记忆能力,测试手段分为初、中、高三个级别。 记忆测试系统设计要求如下:

(1)单击“选择级别”菜单可以选择级别。

(2)单击“查看排行榜”菜单可以查看初级、中级、高级记忆排行榜,通过记忆榜存储每个级别的成绩。

(3)选择级别后,将出现相应级别的测试区。测试区由m×n个方块组成,程序通过设置m和n的来确定相应的测试级别。如对于初级级别,m=5,n=6。每个方块上都有一个图标,但该图标默认不可见。用鼠标单击测试区域中的任何一个方块,则计数器开始启动,同时该方块上的图标将显示出来。

(4)m×n个方块组成的测试区域中有m个图标,每个图标出现n次,并且随机分布在测试区中的m×n方块上。用户必须用鼠标连续单击出n个图标相同的方块,也就是说,如果用户已经用鼠标连续单击出p(p

(5)测试区能显示用户的用时,并根据级别的不同,提示用户必须用鼠标连续单击出多少个图标相同的方块。

(6)测试区有提示图标所在位置的功能。用户单击测试区中的“提示”按钮后,测试区将持续1.2秒为用户显示全部的方块上图标。用户每单击一次“提示”按钮,用户的用时将增加10秒。

(7)连续单击出级别所要求的若干图标相同的方块后,将弹出保存成绩对话框,用户可以通过该对话框选择是否将自己的成绩保存到成绩表中。

(8)单击“选择图标”菜单可重新选择方块的图标样式,即可以重新选择m个图标。

1.2总体设计

在记忆测试系统中,可以编写6个java源文件:MemoryGame.java、MemoryTestArea.java、Block.java、ShowRecordDialog.java、Record.java和People.java。

记忆测试系统除了上述6个java源文件产生的类之外,还需要java系统提供一些重要的类。记忆测试系统所用到的一些重要的类以及之间的组合关系如图1.1所示。

MemoryGame String File MemoryTestArea ShowRecordDialog

File TreeSet Record String File Thread Timer ArrayList

3 / 30

图1.1 类之间的组合关系

以下是6个java源文件的总体设计。

1.2.1 MemoryGame.java(主类)

MemoryGame类负责创建记忆测试系统的主窗口,该类含有main方法,记忆测试系统从该类开始执行。MemoryGame类有4种重要类型的对象,分别是String、File、MemoryTestArea和ShowRecordDialog对象。MemoryGame类创建的窗口对象以及其中的主要成员对象如图1.2所示。MemoryGame类的主要成员的作用将在后面的详细设计中阐述。

1.2.2 MemoryTestArea.java

MemoryTestArea类是主类MemoryGame窗口中的一个JPanel容器,所创建的对象称为“测试区”,这个“测试区”被添加到MemoryGame窗口的中心。MemoryTestArea主要有6种类型的成员:ArrayList、String、Record、Timer、File和Thread对象。MemoryTestArea类的主要成员的作用将在后面的详细设计中概述。

1.2.3 Block.java

Block类是JButton的子类,负责为MemoryTestArea类中的Array数组表提供Block对象。

1.2.4 Record.java

Record类是javax.swing包中的JDialog对话框的子类,当用户成功单击出相应级别所要求的图标相同的方块后,Record创建的对象负责保存用用户的名字和成绩到相应的级别文件中。

1.2.5 ShowRecordDialog.java

ShowRecordDialog类是javax.swing包中JDialog对话框的子类,当用户单击“查看排行榜”时,ShowRecordDialog创建的对象负责显示用户的成绩。

1.2.6 People.java

People对象封装用户的名字和成绩,以便ShowRecordDialog对象可以按成绩的高低排序用户。

1.3详细设计

1.3.1 MemoryGame类

1. 效果图如下:

4 / 30

MemoryGame创建的窗口

2. UML图

MemoryGame类是javax.swing包中JFrame的一个子类,并实现了ActionListener接口。该类的主要成员变量和方法如下图:

JFrame ActionListener MemoryGame

bar:JMenuBar imageName:String[]

menuGrade,menuResult,menuIcon:JMenu memoryArea:MemoryArea

oneGradeItem,twoGradeItem,threeGradeItem:JMenuItem showDialog:ShowRecordDialog

oneGradeResult,twoGradeResult,threeGradeResult:JMenuItem m,n:int

carImageIcon,animalImageIcon:JMenuItem

fileOneGrade,fileTwoGrade,fileThreeGrade,gradeFile:File

MemoryGame():无类型

actionPerformed(ActionEvent):void

mian(String[]):void MemoryGame类的UML图

以下是UML图中有关数据和方法的详细说明。

5 / 30

1) 成员变量

bar是JMenuBar类创建的菜单条,可以向bar中添加菜单。

menuGrade、menuResult、menuIcon是JMenu类创建的三个菜单,这三个菜单的名称分别是“选择级别”、“查看排行榜”和“选择图标”。 oneGradeItem、twoGradeItem和threeGradeIte是JMenuItem类创建的三个菜单项,被添加到menuGrade菜单中。这三个菜单项的名称分别是“初级”、“中级”和“高级”。 oneGradeResult、twoGradeResult和threeGradeResult是JMenuItem类创建的三个菜单项,被添加到menuResult菜单中。这三个菜单项的名称分别是“初级排行榜”、“中级排行榜”和“高级排行榜”。 carImageIcon、animalImageIcon、fruitImageIcon和buildingImageIcon是JMenuItem类创建的四个菜单项,被添加到menuIcon菜单中。这四个菜单项的名称分别是“汽车图标”、“动物图标”“水果图标”、“建筑图标”。 fileOneGradeResult、fileTwoGradeResult、fileThreeGradeResult和gardeFile是Fiel类创建的四个文件对象。fileOneGrade、fileTwoGradehe和fileThreeGrade三个文件对象所引用的文件分别是“初级记忆排行榜.txt”、“中级记忆排行榜.txt”和“高级记忆排行榜.txt”,分别用来写入三个级别的成绩。gradeFile可以是fileOneGrade、fileTwoGrade和fileThreeGarde中的某一个。

imageName是String类型的数组,每个单元是一个图像文件的名字。 memoryArea是测试区对象,由MemoryArea类负责创建。

showDialog是负责显示成绩对话框,由ShowRecordDialog类负责创建。

m和n是int型数据,其值可以确定相应级数中测试区中方块的数量,例如,对于中级水平,m=6,n=7,测试区一共有42个方块。

2)方法

actionPerformed(ActionEvent)方法是MemoryGame类来实现的ActionListener接口中的方法,负责执行菜单项发出的有关命令。用户选择菜单中的菜单项可触发ActionEvent事件,导致actionPerformed(ActionEvent)方法执行相应的操作。

MemoryGame()是构造方法,的负责完成窗口的初始化。 main(String[])方法是软件运行的入口方法。

6 / 30

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*;

import java.util.LinkedList;

public class MemoryGame extends JFrame implements ActionListener {

JMenuBar bar;

// 创建 一个菜单栏(条) // 创建三个菜单

// 创建菜单项

JMenu menuGrade,menuResult,menuIcon;

3. 代码(MemoryGame.java)

JMenuItem oneGradeItem,twoGradeItem,threeGradeItem;

JMenuItem oneGradeResult,twoGradeResult,threeGradeResult;

JMenuItem carImageIcon,animalImageIcon,fruitImageIcon,buildingImageIcon; File fileOneGrade,fileTwoGrade,fileThreeGrade,gradeFile; String imageName[];

// 创建四个File类的对// 用于图片名称数组!!!

象,分别引用文件“初级记忆排行榜.txt”等!!!

MemoryTestArea memoryArea;

ShowRecordDialog showDialog = null; int m=5,n=6;

final int imageNumber = 7; MemoryGame() {

fileOneGrade = new File(\初级记忆排行榜.txt\); fileTwoGrade = new File(\中级记忆排行旁.txt\); fileThreeGrade = new File(\高记忆排行榜.txt\); bar = new JMenuBar();

menuGrade = new JMenu(\选择级别\); oneGradeItem = new JMenuItem(\初级\); twoGradeItem = new JMenuItem(\中级\); threeGradeItem = new JMenuItem(\高级\); menuGrade.add(oneGradeItem); menuGrade.add(twoGradeItem); menuGrade.add(threeGradeItem); menuResult = new JMenu(\查看排行榜\);

oneGradeResult = new JMenuItem(\初级排行榜\); twoGradeResult = new JMenuItem(\中级排行榜\); threeGradeResult = new JMenuItem(\高级排行榜\); menuResult.add(oneGradeResult); menuResult.add(twoGradeResult); menuResult.add(threeGradeResult); menuIcon = new JMenu(\选择图标\);

carImageIcon = new JMenuItem(\汽车图标\); carImageIcon.addActionListener(this);

7 / 30

// 创建txt文本文件(对象)

animalImageIcon = new JMenuItem(\动物图标\); animalImageIcon.addActionListener(this); fruitImageIcon = new JMenuItem(\水果图标\); fruitImageIcon.addActionListener(this); buildingImageIcon = new JMenuItem(\建筑图标\); buildingImageIcon.addActionListener(this); menuIcon.add(carImageIcon); menuIcon.add(animalImageIcon); menuIcon.add(fruitImageIcon); menuIcon.add(buildingImageIcon); bar.add(menuGrade); bar.add(menuResult); bar.add(menuIcon); setJMenuBar(bar);

oneGradeItem.addActionListener(this); twoGradeItem.addActionListener(this); threeGradeItem.addActionListener(this); oneGradeResult.addActionListener(this); twoGradeResult.addActionListener(this); threeGradeResult.addActionListener(this); if (!fileOneGrade.exists()) { }

if (!fileTwoGrade.exists()) { }

if (!fileThreeGrade.exists()) { }

setBounds(300,200,620,480); setVisible(true);

//设置组件在容器坐标系(300,200),

try { fileThreeGrade.createNewFile(); }

catch(IOException exp) {}

try { fileTwoGrade.createNewFile(); }

catch(IOException exp) {}

try { fileOneGrade.createNewFile(); }

catch(IOException exp) {}

// 水果、建筑图标实例化!!!

尺寸为:宽620px,高480px !!!

//设置窗户属性为可见

//MemoryTestArea()的一个对象

memoryArea = new MemoryTestArea(); imageName = new String[imageNumber]; for (int i=0; i

8 / 30

——memoryArea

imageName[i] = new String(\ + i + \);

n = 6;

gradeFile = fileOneGrade;

memoryArea.initBlock(m,n,imageName,gradeFile); add(memoryArea,BorderLayout.CENTER); showDialog = new ShowRecordDialog(); validate();

// 确保组件具有有效的布局。此类主

//

initBlock(x,y,m,n); ????????????????

// 边界管理类采用BorderLayout

(边界布局),属性值为“居中”

要适用于在 Container 实例上进行操作。

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public void actionPerformed(ActionEvent event) { if (event.getSource() == oneGradeItem){ // 的值为“oneGradeItem”,则执行方法中的内容!!!

m = 5; n = 6;

gradeFile = fileOneGrade;

memoryArea.initBlock(m,n,imageName,gradeFile);

}

if (event.getSource() == twoGradeItem){ m = 6; n = 7;

gradeFile = fileTwoGrade;

memoryArea.initBlock(m,n,imageName,gradeFile);

}

if (event.getSource() == threeGradeItem){ m = 7; n = 8;

gradeFile = fileThreeGrade;

memoryArea.initBlock(m,n,imageName,gradeFile);

}

if (event.getSource() == carImageIcon){ for (int i=0; i

}

memoryArea.setImageName(imageName);

memoryArea.initBlock(m,n,imageName,gradeFile);

}

if (event.getSource() == animalImageIcon) { for (int i=0; i

}

memoryArea.setImageName(imageName);

memoryArea.initBlock(m,n,imageName,gradeFile);

}

9 / 30

如果事件方法getSource()

}

}

if (event.getSource() == fruitImageIcon){ }

if (event.getSource() == buildingImageIcon){ }

if (event.getSource()==oneGradeResult) { }

if (event.getSource()==twoGradeResult){ }

if (event.getSource()==threeGradeResult) { }

showDialog.setGradeFile(fileThreeGrade); showDialog.showRecord(); showDialog.setVisible(true);

showDialog.setGradeFile(fileTwoGrade); showDialog.showRecord(); showDialog.setVisible(true);

showDialog.setGradeFile(fileOneGrade); showDialog.showRecord(); showDialog.setVisible(true);

for (int i=0; i

memoryArea.setImageName(imageName);

memoryArea.initBlock(m,n,imageName,gradeFile);

imageName[i] = new String(\ + i + \); for (int i=0; i

memoryArea.setImageName(imageName);

memoryArea.initBlock(m,n,imageName,gradeFile);

imageName[i] = new String(\ + i + \);

public static void main (String args[]){ }

new MemoryGame();

1.3.2 MemoryTestArea类

1. 效果图如下:

10 / 30

MemoryTestArea创建的测试区

2. UML图 MemoryTestArea类是javax.swing包中JPanel容器的子类,实现了ActionListener和Runnable接口,所创建的对象:memoryArea是MemoryGame类的最重要的成员之一,作为一个容器添加到MemoryGame窗口的中心。标明MemoryTestGame类的主要成员变量、方法以及和MemoryGame类之间组合关系的UML图如下图所示。

JPanel ActionListener Runnable

MemoryTestArea MemoryGame row,col,usedTime,success:int hintTread:Thread memoryArea: gradeFile:File hintButton:JButton MemoryTestArea allBlockList:ArrayList showUsedTime:JTextFiled imageFileName:String[] hintMessage:JTextFiled openIconList:LinkedList timer:Timer openBlockList:LinkedList record:Record MemoryTestArea():无类型 initBlock(int,int,String[],File):void setImageName(String[]):void actionPerformed(ActionEvent):void run():void

以下是UML图中有关数据和方法的详细说明。

11 / 30

1)成员变量

row和col的值确定测试区中方块的数量。MemoryTestArea类创建的对象memoryArea是MemoryGame中的成员,memoryArea对象通过调用initBlock(int,int,String[],File)方法将MemoryGame类中的m和n值传递给row和col。

usedTime是用户的用时,单位是秒,iconNum是用户鼠标单击的次数,单位是次。 Success的值是用户找到的具有相同的图标方块的个数。

gradeFile是级别文件,memoryArea对象通过调用initBlock(int,int,String[],File)方法见MemoryGame类中的gradeFile的引用传递给memoryArea对象中的gradeFile。

数组表allBlockList单元的个数是row和col的乘积,它的每个单元存放着一个Block对象。memoryArea对象在调用intBlock(int,int,String[],File)方法时完成对allBlockList单元初始化,即创建单元中的Block对象。

字符串数组imageFileName中的每个单元是一幅图像文件的文字。memoryArea对象通过调用setImageName(String[])方法将MemoryGame中存放图像文件名字的imageName数据的引用传递给imageFileName。 链表openIconList用来存放用户找到的图标相同的方块上的图标。 链表openBlockList用来存放用户找到的图标相同的方块。

hintThread是用Thread类创建的线程对象,用来提示测试区中的Block上的图标,提示方式是将测试区中的各个Block上图标持续显示1200毫秒。

hintButton是注册了ActionEvent事件的监视器,当单击它时,启动hintThread线程。

showUsedTime显示用户的用时,即显示usedTime的值,showIconNum是显示用户单击鼠标的次数,即显示showIconNum的值。

record负责提供保存成绩的界面,是一个对话框,默认不见。当用户寻找出级别所要求的相同的图标方块的数目后,该对话框可见,用户可以在该对话框中输入姓名,并保存所输入的姓名和usedTime的值到gradeFile指定的级别文件中。 2) 方法

12 / 30

MemoryTestArea()是构造方法,创建memoryArea对象时需使用该构造方法。

initBlock(int,int,String[],File)方法。memoryArea对象调用该方法将参数的值传递给row、col、imageFileName和gradeFile,并依据这些值设置allBlockList数组表的大小,然后创建allBlockList的单元中的Block对象,并设置Block对象上的图标。

setImageName(String[])方法。memoryArea对象调用该方法可以将MemoryGame中存放图像文件名字的imageName数组的引用传递给imageFileName。当用户单击MemoryGame主类窗口的carImageIcon和animalImageIcon菜单项时,memoryArea对象将调用该方法把存放图像文件名字的imageName数组的引用传递给imageFileName。

actionPerformed(ActionEvent)方法。该方法是MemoryArea类实现的ActionListener接口中的方法。memoryArea中的每个Block对象注册了ActionEvent事件监视器,当用户单击memoryArea中的某个Block对象时,actionPerformed(ActionEvent)方法将被调用执行,所执行的主要操作是:如果该Block对象未显示图标,并且该Block对象设置的图标和openIconList的存放的图标相同,就将该图标添加到链表openIconList中同时将该Block对象上图标显示出来,并将success的值增1;如果该Block对象未显示图标,并且该Block对象设置的图标和OpenIconList的中存放的图标不相同,就将openIconList清空,然后再将该图标添加到链表openIconList中,同时将该Block对象上图标显示出来,并将success的值设置成1。当用户单击hintButton按钮时,actionPerformed(ActionEvent)方法将被调用执行,执行的主要操作是启动hintThread线程。

run()方法。该方法是MemoryArea类实现Runnable接口中的方法,启动hintThread线程后,该方法将执行,其主要操作是将测试区中的未显示图标的各个Block对象上的图标持续显示1200毫秒。

3. (MemoryTestArea.java)

import javax.swing.*; import java.awt.event.*; import java.awt.*; import java.util.*; import java.io.*;

import java.applet.AudioClip; import java.applet.Applet; import java.net.*;

public class MemoryTestArea extends JPanel implements ActionListener,Runnable{ //

Runnbale int row, col;

File gradeFile,musicFile; ArrayListallBlockList; String imageFileName[];

LinkedListopenIconList; LinkedListopenBlockList; int success = 0; Thread hintThread; JButton hintButton;

13 / 30

int usedTime = 0;

int iconNum = 0; JTextField showIconNum;

JTextField showUsedTime,hintMessage; javax.swing.Timer timer; Record record; JPanel center,south; MemoryTestArea(){ }

public void initBlock(int m,int n,String name[],File f){

row = m; col = n; gradeFile = f; center.removeAll(); imageFileName = name;

14 / 30

setLayout(new BorderLayout());

allBlockList = new ArrayList(); openIconList = new LinkedList(); openBlockList= new LinkedList(); hintThread = new Thread(this); hintMessage = new JTextField();

hintMessage.setHorizontalAlignment(JTextField.CENTER); hintMessage.setEditable(false);

hintMessage.setFont(new Font(\宋体\,Font.BOLD,18)); center = new JPanel(); south = new JPanel();

hintButton = new JButton(\提示\); hintButton.addActionListener(this); showUsedTime = new JTextField(8); showUsedTime.setEditable(false); showIconNum = new JTextField(4); showIconNum.setEditable(false);

showIconNum.setHorizontalAlignment(JTextField.CENTER); showUsedTime.setHorizontalAlignment(JTextField.CENTER); south.add(new JLabel(\用时:\)); south.add(showUsedTime);

south.add(new JLabel(\鼠标单击次数:\)); south.add(showIconNum); south.add(hintButton);

add(south,BorderLayout.SOUTH); add(hintMessage,BorderLayout.NORTH); timer = new javax.swing.Timer(1000,this); record = new Record();

//使调用这个函数的控件不能被编辑,

如果设为true或者不调用这个函数,则控件可以编辑

south.add(new JLabel(\提示图标位置(导致用时增加:) \));

}

ImageIcon icon[] = new ImageIcon[imageFileName.length]; for (int i=0; i

if (allBlockList.isEmpty()){ } } }

Collections.shuffle(allBlockList);

//随机排列

for (int i=0; i

allBlockList.clear();

for (int i=0; i

allBlockList.get(i).addActionListener(this);

allBlockList.get(i).setOpenStateIcon(icon[i % row]);

allBlockList.add(new Block()); allBlockList.add(new Block());

icon[i] = new ImageIcon(imageFileName[i]);

else {

for (int i=0; i

allBlockList的中间节点!!!

center.setLayout(new GridLayout(row,col)); for (int i=0; i

add(center,BorderLayout.CENTER); if (timer.isRunning()){ }

hintMessage.setText(\您需要用鼠标单击出 \+col+\个同样图标的方块 \); usedTime = 0;

showUsedTime.setText(null); iconNum = 0; validate();

//这是确保组件具有有效的布局。 不写这句代码,也没有问题的。 面

showIconNum.setText(null);

timer.stop();

center.add(allBlockList.get(i));

板切换时会用到

public void setImageName(String name[]){ }

public void actionPerformed(ActionEvent e){

if (e.getSource() instanceof Block){

if (!timer.isRunning())

timer.start();

15 / 30

imageFileName = name;

// e.getSource() instanceof Block) instanceof的作用是测试它左边的对象是否是它右边的类的实例????

ShowRecordDialog()是构造方法,负责创新showDialog对象。

setGradeFile(File)方法。ShowRecordDialog类创建的ShowrecordDialog对话框是主类MemoryGame窗口中的一个成员。当用户选择窗口上的“查看排行榜”菜单中的菜单项时,ShowrecordDialog对话框调用setGradeFile(File)方法将相应的级别文件传递给gradeFile。

showRecord()方法。ShowrecordDialog对话框调用该方法读取gradeFile文件中的成绩,为了将成绩按高低顺序显示在showArea文本区中,showRecord()方法跟读取的名字和该名字的对应成绩,创建一个People对象,并将该People对象存放在treeSet树集中。

actionPerformed(ActionEvent)是ActionListener接口中的方法,clear注册了ActionEvent事件,当用户单击clear按钮时,actionPerformed(ActionEvent)方法被调用执行,所执行的操作是清除gradeFile文件中的内容。

3. 代码(ShowRecordDialog)

import java.io.*; import java.util.*; import javax.swing.*; import java.awt.*; import java.awt.event.*;

public class ShowRecordDialog extends JDialog implements ActionListener{

File gradeFile; JButton clear;

JTextArea showArea = null; TreeSettreeSet; public ShowRecordDialog(){ }

21 / 30

treeSet = new TreeSet(); showArea = new JTextArea(6,6);

showArea.setFont(new Font(\楷体\,Font.BOLD,20)); clear = new JButton(\清空排行榜\); clear.addActionListener(this);

add(new JScrollPane(showArea),BorderLayout.CENTER); add(clear,BorderLayout.SOUTH); setBounds(250,250,500,250); setModal(true);

addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){ }

setVisible(false);

});

}

public void setGradeFile(File f){ }

public void showRecord(){ }

public void actionPerformed(ActionEvent e) { }

22 / 30

gradeFile = f;

setTitle(f.getName());

showArea.setText(null); treeSet.clear(); try{ }

catch(IOException exp) {System.out.println(exp);}

RandomAccessFile in = new RandomAccessFile(gradeFile,\); long fileLength = in.length(); long readPosition = 0;

while (readPosition < fileLength){ }

in.close();

Iteratoriter = treeSet.iterator(); while(iter.hasNext()){ }

People p = iter.next();

showArea.append(\姓名: \ + p.getName()+ \,成绩 :\ + p.getTime() + \秒\ + \,//showArea.append(\姓名: \,成绩 :\秒\ showArea.append(\); String name = in.readUTF(); int time = in.readInt(); int iconNum = in.readInt();

readPosition = in.getFilePointer();

People people = new People(name,time,iconNum); treeSet.add(people);

鼠标单击次数:\ + p.getIconNum());

if (e.getSource() == clear) { }

try { }

catch(Exception ee){}

File f = gradeFile.getAbsoluteFile(); gradeFile.delete(); f.createNewFile();

showArea.setText(\排行榜被清空\);

1.3.5 People类

1. 效果图 People是我们编写的一个类,该类对象中的数据是用户的姓名和成绩,被显示在ShowRecordDialog对话框中的showArea文本区中(见下图)。

2. UML图 People对象中的数据由ShowRecordDialog对话框从gradeFile文件中读取的用户姓名和成绩所构成。ShowRecordDialog对话框将People对象作为其treeSet树集上的节点,以便按着成绩高低顺序排列People对象。标明People类的主要成员变量、方法以及和ShowrecordDialog类之间关系的UML图如下图 People ShowRecordDialog

name:String treeSet:TreeSet time:int

iconNum:int

getTime():int

getName():String

getIconNum():int

compareTo(Object):int

People类的UML图 以下是UML图中有关数据和方法的详细说明。 1) 成员变量 Name是用户的名字。 Time是用户的用时。

IconNum是用户鼠标单击次数。 2) 方法

23 / 30

getTime()方法返回time。 getName()方法返回name。 getIconNum()方法返回iconNum。

compareTo(Object)是Compareable接口中的方法,其操作是确定People对象的大小关系。 3. 代码(People.java)

import java.io.*;

public class People implements Serializable,Comparable{

String name = null; int iconNum = 0; int time = 0;

public People (String name,int t,int n) { }

//public People(String name2, int time2, int iconNum) {

// TODO Auto-generated constructor stub //}

public int getTime() { }

public String getName(){ }

public int getIconNum(){ } */

if ((this.time+this.iconNum)>=(p.time+p.iconNum))

return 1;

return ((this.time + this.iconNum)-(p.time + p.iconNum));

24 / 30

this.name = name; time = t; iconNum = n;

return time;

return name;

return iconNum;

public int compareTo(Object b) {

People p = (People) b;

return 1;

return (this.time-p.time);

//时间与点击鼠标次数占分数的

/* if ((this.time-p.time) == 0)

else

权重相等,时间与鼠标单击次数之和越小,成绩越靠前!

else

//这句其实不太明

白,效仿上面 “等价”代换而已,而且所期望的结果也能实现!

}

}

1.3.6 Record类

1. 效果图 Record创建的对话框如下图

2. UML图 Record是javax.swing包中JDialog的子类,并实现了ActionListener接口,该类创建的对象record是MemoryTestArea类的成员之一。当用户成功单击出相应级别所要求的图标相同的方块后,程序弹出Record对话框,用户使用对话框提供的界面将成绩保存到相应的级别文件中。标明了Record类的主要成员变量、方法以及和MemoryTestArea类之间关系的UML图如下图所示。

JDialog ActionListener

Record MemoryTestAea time:int enter,cancel:JButton record:Record yourName:JTextFiled gradeFile:File lable:JLable Record():无类型 setGradeFile:void setTime(int):void actionPerformed(ActionEvent):void Record类的UML图 以下是UML图中有关数据和方法的详细说明。

25 / 30

1)

time是用户的用时。

成员变量

yourName是用户用来输入名字和文本框。

enter和cancel是按钮对象,用户单击enter按钮可以保存成绩,单击cancel可以放弃保存成绩。 gradeFile是级别文件。

2) 方法

Record()是构造方法,负责创建record对象。

setGradeFile(File)方法。Record类创建的Record对话框时测试区MemoryTestArea中一个成员。当用户成功单击出相应级别所要求的图标相同的方块后,测试区弹出Record对话框,Record对话框将调用setGradeFile(File)方法将测试区中的级别文件传递给Record对话框gradeFile。

setTime(int)方法。当用户成功单击出相应的级别所要求的图标相同的方块后,测试区弹出对话框,Record对话框将调用setTime(int)方法将测试区记录的用户用时传递给Record对话框中的time。

actionPerformed(ActionEvent)是ActionListener接口中的方法,enter和cancel按钮注册了ActionEvent事件,当用户单击enter时,actionPerformed(ActionEvent)方法被调用执行,其操作是将用户在文本框yourName中输入的名字以及time的值保存到gradeFiel文件中,然后关闭当前对话框;当用户单击cancel按钮时,actionPerformed(ActionEvent)方法被调用执行,其操作是关闭当前对话框。

import java.io.*; import java.util.*; import javax.swing.*; import java.awt.*; import java.awt.event.*;

public class Record extends JDialog implements ActionListener {

3. 代码(Record.java)

int time = 0; int iconNum = 0; JLabel label;

JButton enter,cancel; File gradeFile = null;

26 / 30

JTextField yourName;

public Record() { }

public void setGradeFile(File f) {

gradeFile = f;

setTitle(\保存成绩到\ + gradeFile.getName()); label.setText(\成绩保存到\ + gradeFile.getName()); validate();

// public void validate()验证此容器及其

setBounds(200,200,360,160); setResizable(false); setModal(true);

//false就是窗口大小不可改变,true当然就是能改变了,用鼠//此方法指定对话框是否是模式对话框。模式对话框包含发送

标可以拉伸窗口,设置为false之后,就固定大小不能改变

setVisible(false);

到父框架的所有用户输入内容。

enter = new JButton(\确定\); cancel = new JButton(\取消\); yourName = new JTextField(8); yourName.setText(\匿名\); enter.addActionListener(this); cancel.addActionListener(this); setLayout(new GridLayout(2,1)); label = new JLabel(); add(label);

JPanel p = new JPanel(); p.add(yourName); p.add(enter); p.add(cancel); add(p);

所有子组件。 使用 validate 方法会使容器再次布置其子组件。已经布置容器后,在修改此容器的子组件的时候应该调用上述方法。 // 将对话框设置为标准型(在没被关闭之前不可以进行其他操作)

} }

public void setIconNum(int iconNum) { }

public void actionPerformed(ActionEvent e) {

if (e.getSource()==enter){

LinkedListlist = new LinkedList(); try{

RandomAccessFile out = new RandomAccessFile(gradeFile,\); out.seek(out.length());

out.writeUTF(yourName.getText()); out.writeInt(time); out.writeInt(iconNum); out.close();

27 / 30

public void setTime(int time) {

this.time = time;

this.iconNum = iconNum;

}

}

}

}

catch(Exception event) { } setVisible(false);

if (e.getSource() == cancel) { }

setVisible(false);

1.3.7 图像文件

创建图标对象需使用如下四组图像文件:

(1) car0.jpg、car1.jpg、car2.jpg、car3.jpg、car4.jpg、car5.jpg、car6.jpg、car7.jpg、car8.jpg;

(2) animal0.jpg、animal1.jpg、animal2.jpg、animal3.jpg、animal4.jpg、animal5.jpg、animal6.jpg、

animal7.jpg、animal8.jpg;

(3) fruit0.jpg、 fruit1.jpg、fruit2.jpg、fruit3.jpg、fruit4.jpg、fruit5.jpg、fruit6.jpg、

fruit7.jpg、fruit8.jpg;

(4) building0.jpg、building1.jpg、building2.jpg、building3.jpg、building4.jpg、building5.jpg、

building6.jpg、building7.jpg、building8.jpg。

28 / 30

29 / 30

1.4 课程设计总结

这个程序设计大作业——记忆测试系统由自己独立耗时两周半完成,第一次敲代码这么长的程序设计,开始时,eclipse软件还不太会用,以致于给每一类都新建了一个“java项目”,结果软件老是提示找不到类的对象,被卡在这里两三天,后来问同学才解决。还有添加音乐那些,起初是在百度知道提问了数次,效仿着来做,不过在MemoryTestArea()方法中添加URI、URL类的对象等局部变量总是报错,几天后问了振朋,借鉴他的方法很简单的就解决了,省下了很多的时间。在增加成绩判断标准——鼠标单击次数中,也参考过他的方法,不过将用户鼠标单击次数也间接地通过用户时间去表现并不是很理想,于是自己开始尝试在MemoryTestArea区域中增加“鼠标单击次数”这一项,但这样修改会涉及People类、ShowRecordDialog类、Record类中较大范围代码的改动。而且,改动后,成绩判断的标准又是什么呢?这个也想了一两天,最后决定采用最简单的、最直接的“时间、次数等权(时间+次数的和最小成绩最好)”判断法,而不是“时间优先法则(时间最短高分,排在前面,无论次数是多少)”或“次数优先法则”,后两种方法在排名实现方面有点棘手,逻辑大小比较还好,但对于返回值的选择方面还是不知道怎样去选择、设置。在完成之前,总担心着实现不了,因为开始时里面有很多代码行看不明白,虽然通过网上找资料解决了一部分,但由于百度知道里回答问题的人水平参差不齐,同一个问题有不同的答案。在缺乏专业参考书籍的情况下(里面有些语句在以前学的java教程上根本没有出现过,如语句:validate();、setModal(true); 、File f = gradeFile.getAbsoluteFile();)只能通过网络等去了解。这事给我最大的感受是,要充分利用手上的资源去学习新知识,要大胆敢于去尝试,实在不明白,暂且模仿也好(如语句:return ((this.time + this.iconNum)-(p.time + p.iconNum)); )现在还不是很明白,但通过尝试着去模仿竟然一下子就实现了,不然还得想很久才行。

(参考文献):

《Java面向对象程序设计》(2011.6 清华大学出版社 ? 董小圆 编著)

《Java课程设计(第二版)》(2008.11 清华大学出版社 ? 耿祥义 张跃平 编著) 30 / 30

本文来源:https://www.bwwdw.com/article/mtcr.html

Top