自己用Java写的打字练习小程序,请参考界面及源码:
下图为打字练习主界面截图:
http://s6/mw690/002OXMuIgy6EENY1HDfc5&690
主界面主要有以下几部分组成:
1.下落字符串。
2.用户输入文本框。
3.计分显示。
4.速度、字符长度、大小写控制。
5.“重新开始”、“继续”、“暂停”按钮。
类RollWordInput.java的源代码
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
@SuppressWarnings("serial")
public class RollWordInput extends JFrame implements Runnable{
String[] words = {"A","B","C","D","E",
"F","G","H","I","J",
"K","L","M","N","O",
"P","Q","R","S","T",
"U","V","W","X","Y","Z",
"a","b","c","d","e",
"f","g","h","i","j",
"k","l","m","n","o",
"p","q","r","s","t",
"u","v","w","x","y","z"};//定义26个英文字母(包含大小写)数组。
private StringBuffer rollWords;//存放下落字符串
private int wordCount = 5;//存放下落字符串个数
private int dropSpeed = 100;//字符串下落速度
private int y = 0;//字符串y轴坐标
private int score = 0;//得分
private Thread currentThred = null;//java线程,用于控制下落字符串速度,“继续”,“暂停”。
private Mypanel draw = null;//绘制字符串内部类
private JTextField inputText = null; //输入文本框
private JTextField scoreText = null; //显示得分文本框
private JSpinner speedSpinner = null; //调整字符窜下落速度的组件
private JSpinner wordCountSpinner = null; //调整字符串长度的组件
private JRadioButton ignoreCase = null; //忽略大小写单选框
private JRadioButton noIgnoreCase = null; //区分带、小写单选框
private boolean isPause = false; //是否暂停flag
public RollWordInput (){
draw = new Mypanel();
y = -5;
score = 0;
}
public void init() {
Container con = this.getContentPane();
BorderLayout layout = new BorderLayout();
con.setLayout(layout);
con.add(draw, BorderLayout.CENTER);//添加下落字符串面板
con.add(this.getSouthPanel(), BorderLayout.SOUTH); //添加设置面板
this.validate();
}
public void start(){
if(null == currentThred){
currentThred = new Thread(this);
currentThred.start();
}
}
public void run() {
while (y < 250) {
y = y+10;
if(y >= 250){
rollWords = new StringBuffer(15);
for(int i=0; i< wordCount; i++){
rollWords.append(words[(int)(Math.random()*51)+1]);//随即产生wordCount个字母并组成下落字符串
}
}
y = y%0;
draw.repaint();//重新绘制字符串
try {
currentThred.sleep(dropSpeed); //线程暂停dropSpeed毫秒
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private JPanel getSouthPanel(){
JPanel southPanel = new JPanel();
southPanel.setLayout(new BorderLayout());
southPanel.add(this.getInputTextPanel(), BorderLayout.NORTH);//加载输入文本框按钮
southPanel.add(this.getBottomPanel(), BorderLayout.SOUTH);//加载下面部分面板(设置与按钮)
return southPanel;
}
private JPanel getInputTextPanel(){
JPanel returnPanel = new JPanel();
returnPanel.setLayout(new BorderLayout());
JLabel inputLabel = new JLabel("请输入下落字符串:");
if(null == inputText){
inputText = new JTextField();
inputText.addKeyListener(new MyKeyReleased());//添加键盘事件(即当输入文本框中字母数量相同时判断是否加分或减分)
}
returnPanel.add(inputLabel, BorderLayout.WEST);//标签
returnPanel.add(inputText, BorderLayout.CENTER);//文本框
return returnPanel;
}
private JPanel getBottomPanel(){
JPanel southPanel = new JPanel();
southPanel.setLayout(new BorderLayout());
southPanel.add(this.getSetPanel(), BorderLayout.CENTER);//加载设置面板
southPanel.add(this.getButtonPanel(), BorderLayout.SOUTH);//加载最先面按钮面板
return southPanel;
}
private JPanel getSetPanel(){
JPanel setPanel = new JPanel();
setPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
setPanel.add(this.getScoreTextPanel());//得分
setPanel.add(this.getSpeedSpinnerPanel());//速度
setPanel.add(this.getWordCountSpinnerPanel());//字符串长度
setPanel.add(this.getIgnorePanel());//区分大小写
return setPanel;
}
private JPanel getButtonPanel(){
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
buttonPanel.add(this.getReStartButton());//重新开始
buttonPanel.add(this.getStartButton());//继续
buttonPanel.add(this.getPauseButton());//暂停
return buttonPanel;
}
private JPanel getScoreTextPanel(){
JPanel returnPanel = new JPanel();
returnPanel.setLayout(new BorderLayout());
JLabel scoreLabel = new JLabel("得分:");
if(null == scoreText){
scoreText = new JTextField();
scoreText.setText(""+score);
scoreText.setEditable(false);
scoreText.setColumns(5);
}
returnPanel.add(scoreLabel, BorderLayout.CENTER);
returnPanel.add(scoreText, BorderLayout.EAST);
return returnPanel;
}
private JButton getReStartButton(){
JButton reStartButton = new JButton("重新开始");
reStartButton.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e) {//点击该按钮时重置所有组件
reSet();
scoreText.setText("0");
ignoreCase.setSelected(true);
noIgnoreCase.setSelected(false);
speedSpinner.setValue(100);
wordCountSpinner.setValue(5);
}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
});
return reStartButton;
}
private JButton getStartButton(){
JButton startButton = new JButton("继续");
startButton.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e) {
currentThred.resume();//点击此按钮唤醒进程
isPause = false;
System.out.println("start");
}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
});
return startButton;
}
private JButton getPauseButton(){
JButton pauseButton = new JButton("暂停");
pauseButton.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e) {
currentThred.suspend();//点击此按钮阻塞进程
isPause = true;
System.out.println("pause");
}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
});
return pauseButton;
}
private JPanel getSpeedSpinnerPanel() {
JPanel returnPanel = new JPanel();
returnPanel.setLayout(new BorderLayout());
JLabel speedLabel = new JLabel("速度:");
if(null == speedSpinner){
speedSpinner = new JSpinner(new SpinnerNumberModel(100, 0, 500, 1));
speedSpinner.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent e){//处理变动事件
int spinnerValue = Integer.parseInt(""+speedSpinner.getValue());//获取设置的值
if(spinnerValue == 0){
currentThred.suspend();//如果设置速度为0,我们通过阻塞进程来实现是字符串暂停下落。
} else {
if(!isPause){//只有当没有点击“暂停”按钮时我们才唤醒进程。
currentThred.resume();
}
dropSpeed = 500 - spinnerValue;//为了实现用户设置值越大,下落速度越快(即进程阻塞期越短)。
}
}
});
}
returnPanel.add(speedLabel, BorderLayout.WEST);
returnPanel.add(speedSpinner, BorderLayout.EAST);
return returnPanel;
}
private JPanel getWordCountSpinnerPanel() {
JPanel returnPanel = new JPanel();
returnPanel.setLayout(new BorderLayout());
JLabel countLabel = new JLabel("字符长度:");
if(null == wordCountSpinner){
wordCountSpinner = new JSpinner(new SpinnerNumberModel(5, 1, 15, 1));
wordCountSpinner.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent e){
wordCount = Integer.parseInt(""+wordCountSpinner.getValue());//获取用户设置字符串长度并将其赋予wordCount变量
}
});
}
returnPanel.add(countLabel, BorderLayout.CENTER);
returnPanel.add(wordCountSpinner, BorderLayout.EAST);
return returnPanel;
}
private JPanel getIgnorePanel(){
JPanel returnPanel = new JPanel();
returnPanel.setLayout(new BorderLayout());
JLabel ignoreLabel = new JLabel("区分大小写:");
if(null == ignoreCase){
ignoreCase = new JRadioButton("是");
ignoreCase.setSelected(true);//初始状态下忽略大小写
}
if(null == noIgnoreCase){
noIgnoreCase = new JRadioButton("否");
}
ButtonGroup buttonGroup = new ButtonGroup();
buttonGroup.add(ignoreCase);
buttonGroup.add(noIgnoreCase);
returnPanel.add(ignoreLabel, BorderLayout.WEST);
returnPanel.add(ignoreCase, BorderLayout.CENTER);
returnPanel.add(noIgnoreCase, BorderLayout.EAST);
return returnPanel;
}
class Mypanel extends JPanel {
public Mypanel(){
rollWords = new StringBuffer(15);
for(int i=0; i< wordCount; i++){
rollWords.append(words[(int)(Math.random()*51)+1]);
}
}
public void paint(Graphics g) {
g.setColor(Color.orange);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.setColor(Color.red);
Font font = new Font(Font.SERIF, Font.BOLD, 25);
g.setFont(font);
g.drawString(rollWords.toString(), 200, y);
}
}
private class MyKeyReleased extends KeyAdapter {
public void keyReleased(KeyEvent e) {
String inputString = inputText.getText();
if(inputString.length() == wordCount){
boolean isInputRightString = ignoreCase.isSelected() ?
inputString.equalsIgnoreCase(rollWords.toString()) :
inputString.equals(rollWords.toString());//若用户是否输入正确字符串(包括字符串大小写匹配)
if(isInputRightString){//输入正确字符串+1分
System.out.print("you are right!");
score++;
reSet();
} else {//输入正确字符串-1分
System.out.print("you are wrong!");
score--;
reSet();
}
}
else if(inputString.length() > wordCount){
reSet();
}
}
}
private void reSet(){
inputText.setText("");
y = -5;
rollWords = new StringBuffer(15);
for(int i=0; i< wordCount; i++){
rollWords.append(words[(int)(Math.random()*51)+1]);
}
scoreText.setText(""+score);
}
public static void main(String args[]) {
RollWordInput frame = new RollWordInput();
frame.setTitle("打字练习小程序");
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setVisible(true);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
frame.setSize(((screenSize.width)/2)+100, ((screenSize.height)/2)+20);
frame.setLocation((screenSize.width)/4, (screenSize.height)/4);
frame.start();
frame.init();
}
}
类RollWordApplet.java的源代码
import java.applet.Applet;
import java.awt.Dimension;
import java.awt.Toolkit;
@SuppressWarnings("serial")
public class RollWordApplet extends Applet {
public void init() {
GetParameters getparam = new GetParameters();
RollWordInput frame = new RollWordInput(getparam);
frame.setTitle(getparam.getParamValue("title"));
//frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
frame.setSize(((screenSize.width)/2)+100, ((screenSize.height)/2));
frame.setLocation((screenSize.width)/4, (screenSize.height)/4);
frame.start();
frame.init();
}
}
加载中,请稍候......