目 录
课程设计情况概述 I
目 录 II
第1章 课题介绍 1
1.1 课程设计的目的 1
1.2 课程设计的要求 1
第2章 总体设计 2
2.1 程序流程图 2
2.2 软件模块图 3
2.3 子模块介绍 3
第3章 详细设计及程序实现 5
3.1 系统界面设计 5
3.1.1 用户显示界面的设计 5
3.1.2类型选择界面的设计 5
3.1.3 打字输入界面的设计 7
3.2 主要组件的事件监听 8
3.2.1 用户显示界面的事件监听 8
3.2.2 类型选择界面的事件监听 9
3.2.3 打字输入界面的事件监听 10
第4章 程序测试 13
第5章 总 结 16
参考文献 18
答辩记录及评分 19
第2章 总体设计
2.1 程序流程图
程序启动后进入用户显示界面,输入用户名后可进入类型选择界面,设置完成后就进入打字模块,按任意键就进入打字练习并开始启动及计时线程进行计时及打字状态的显示。详细的程序流程图如图2-1所示:
图2-1 程序流程图
2.2 软件模块图
要实现对用户结果的记录,需要设置用户名及一些类型选择(如用户自定义文章和自定义时间),将此两点与最终的打字界面单独分割开,确定要设计三个界面模块,用户显示模块、类型选择模块、打字输入模块。软件模块如图2-2所示:
图2-2 软件模块图
2.3 子模块介绍
1、用户显示模块:此模块设计为一个卡片布局,将加入此模块的面板jp约束在中间,并在面板上添加控件。此模块可进行用户名的设置,默认以随机的游客身份进入。点击“提交”按钮后进入打字测速练习软件,点击“重置”按钮可重新输入用户名。
2、类型选择模块:此面板也是一个卡片布局,将jp面板约束在此面板的中间位置,在jp面板里面进行添加控件,jp面板的布局是网格布局,采用四行三列的形式。此模块可以选择测试类型、测试文章、测试时间,及是否选择从本地导入文章。测试类型有“英文练习”和“中文练习”两种选择,“中文练习”功能尚未实现。可通过测试文章的下拉列表选择已导入目录的文章,也可以点击导入文章进行本地导入文本文件作为测试文章。用户可自定义测试时间。之后点击“开始”按钮进入打字界面,开始进行打字测速练习。点击“重置”按钮所有选择返回默认状态用户可重新自定义。点击“返回”按钮返回之前的用户显示模块。
3、打字输入模块:此面板是边框形式布局,中间设计字符的显示与接受用户输入的文本框。此模块可以与用户进行交互,响应用户的输入。本文转载自http://www.biyezuopin.vip/onews.asp?id=15035进入打字模块后直接进行打字训练,按Enter回车键可进入下一行。练习的同时,界面上方的“速度”和“正确率”以秒为单位进行更新。并且有“剩余时间”来提醒用户剩余练习时间。根据用户输入的正确与否,字体显示不同的颜色。打字正确时显示绿色,错误则显示红色。按“暂停”按钮所有的文本框处于不可接受用户输入状态,此时“暂停”按钮将变成恢复按钮,等待用户返回继续练习。“文件”按钮包含“返回”和“退出”两个按钮,用户可分别进行返回上一届面和整体退出程序两个功能的选择。“设置”按钮可进行“重新开始”项的选择,用户之前测试结果被记录到文件的同时,所有的状态会恢复成新的界面。通过“查询”按钮则可以进行之前所有打字记录的查询,包括“用户名”、“速度”、“正确率”、“使用时间”、“测试时间”这五个数据。当点击“帮助”菜单栏里面的“帮助文档”项时,可以查看帮助文档,从而获得帮助提示。点击帮助文档中的“确定”按钮可返回练习。
这三个模块全部放在一个卡片布局的面板里,当用户点击各个按钮时,分别显示不同的模块界面。
import java.awt.CardLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
public class UserJPanel extends JPanel {
TypingTest tt = null;
// 产生1000到9999的随机数
public int random = (int) (Math.random() * 9000) + 1000;
public String userName;
JLabel welcomJLabel, userNameJLabel;
JTextField userNameJTextField;
JButton submitJButton, resetJButton;
public UserJPanel(TypingTest tt) {
this.tt = tt;
// 使显示框位于整个界面的中间位置
CardLayout userCardLayout = new CardLayout(200, 150);
this.setLayout(userCardLayout);
JPanel jp = new JPanel(new GridLayout(3, 1));
welcomJLabel = new JLabel("打字测速练习", SwingConstants.CENTER);
welcomJLabel.setFont(new Font("宋体", Font.BOLD, 20));
jp.add(welcomJLabel);
JPanel jp1 = new JPanel(new FlowLayout(FlowLayout.CENTER));
userNameJLabel = new JLabel("用户名:");
userNameJTextField = new JTextField(12);
userNameJTextField.setText("游客" + random);
userNameJTextField.setToolTipText("默认以随机产生的游客登陆,可以设定用户名");
jp1.add(userNameJLabel);
jp1.add(userNameJTextField);
jp.add(jp1);
JPanel jp2 = new JPanel(new FlowLayout(FlowLayout.CENTER, 30, 0));
submitJButton = new JButton("提交");
resetJButton = new JButton("重置");
jp2.add(submitJButton);
jp2.add(resetJButton);
jp.add(jp2);
this.add(jp);
setListenerForSubmitJButton();
setListenerForResetJButton();
}
public void setListenerForSubmitJButton() {
submitJButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (userNameJTextField.getText() != null
&& !userNameJTextField.getText().trim().equals("")) {
userName = userNameJTextField.getText();
} else {
JOptionPane.showMessageDialog(null, "你没有输入用户名,或用户名为空!",
"提示", JOptionPane.OK_OPTION);
return;
}
SetJPanel setJPanel = new SetJPanel(UserJPanel.this);
tt.mainJPanel.add("setJPanel", setJPanel);
tt.cardLayout.show(tt.mainJPanel, "setJPanel");
}
});
}
public void setListenerForResetJButton() {
resetJButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
random = (int) (Math.random() * 9000) + 1000;
userNameJTextField.setText("游客" + random);
}
});
}
public void paint(Graphics g) {
super.paint(g);
g.drawRect(220, 150, 400, 300);
// 重画,解决组件之间的相互影响
repaint();
}
}