Java实战 英语单词拼写训练

目录

1 设计概述 

2 总体设计 

2.1 设计思路 

2.2 程序构成 

2.3 类和接口的设计 

3 详细设计 

4 程序测试 

5 总结 

5.1 主要问题和解决办法 

5.2 创新和得意之处

5.3 不足和改进之处 

5.4 心得体会 

6 参考文献 

7 软件实现 


1 设计概述 

       本课题是设计一个英语单词拼写训练系统。主要采用Java的窗口设计,主要涉及的知识点是:当某个组件处于激活状态时,如果用户按键盘上的一个键就会导致这个组件触发KeyEvent事件。使用KeyListener接口处理键盘事件。组件可以触发焦点事件。当组件具有焦点监视器后,如果组件从无输入焦点变成有输入焦点都会触发FoucusEvent事件。使用FocusListener接口处理焦点事件。

2 总体设计 

2.1 设计思路 

(1) 主窗口设计思路

      主窗口界面设计主要分为两个个部分:上部和中部。首先用JPanel类上部面板,分为三个部分,从左往右分别为用JLabel类创建文本“输入单词”,用JTextField类创建文本框,提示使用者在文本框区域输入英语单词,用JButton类创建按钮,提示使用者需要按下按钮才能创建随机标签,在中部用JPanel创建一个新面板,用于放置新创建的随机标签。

(2) 标题与窗口底部设计思路

       顶部显示设计标题“英语单词拼写训练”,底部用JLabel类创建一个对象,体现设计报告书的设计要求,提示用户使用方法和显示每次用户移动字母的次数。

2.2 程序构成 

    本程序涉及三个接口和四个类。主类是WordMainClass.java,另外三个类为RondomString.java、LetterLabel.java和SpellingWordFrame.java其中SpellingWordFrame.java类实现KeyListener和ActionListener接口,LetterLabel.java类实现FocusListener接口。SpellingWordFrame.java继承JFrame.java中的类和方法,LetterLabel.java继承JTextField.java中的类和方法。

2.3 类和接口的设计 

图1 FocusListener子接口的结构图

图2 LetterLabel类结构图

图3 KeyListener子接口结构图

图4 ActionListener子接口结构图

图5 SpellingWordFrame类结构图

图6 RondomString类结构图

图7 WordMainClass类结构图

图8 各类以及接口之间关系的UML图

3 详细设计 

3.1 窗口界面的设计 

图14 窗口界面设计1

图15 窗口界面设计2

图16 窗口界面设计3

       窗口界面如图14、15、16所示。窗口分为NORTH、CENTER和SOUTH区,NORTH区有文本输入框和确认按钮,首先创建面板JPanel,依次将JLabel,JTextField,JButton添加到该面板中。CENTER区创建一个新的面板JPanel,将生成的标签置于该面板中,用Box创建一个对象,将随机生成的标签在Box中从左到右排序。在窗口SOUTH区创建JLabel,提示用户使用方法和每个单词拼写成功后用户的移动次数。

3.2 创建标签功能的实现 

       在文本框中输入一个英文单词,按下确认按钮,程序自动生成若干个标签,其个数正好等于英文单词所包含的字母的个数,每个标签上的名字刚好是英文单词中的一个字母(顺序是随机的)。代码如图17,18所示:

图17 创建若干标签的事件处理

图18 函数中调用的getRondomString()函数

3.3 交换相邻标签上字母功能的实现 

       用户用鼠标单击一个标签后,通过按下键盘上左右键交换相邻标签上的字母,使得这些标签上字母的排序顺序与英文单词中字母的顺序相同。具体实现如图19,20所示:

图19 按下<-交换相邻标签上字母的具体实现

图20 按下->交换相邻标签上字母的具体实现

3.4 记录并显示用户移动次数功能的实现 

       用户每按一次<-或->,程序记录一次移动次数,当用户正确拼写英文单词时,计数结束,当用户再次输入英文单词时,重新开始记录移动次数。具体实现如图21,22,23所示:

图21 每按一次键,count加1

图22 每按一次->键,count加1

图23 成功拼写后将count归零

4 程序测试 

打开测试:打开IntelliJ IDEA,如图24所示。

图24 打开IDEA,运行程序

在文本框中输入英文单词:

按下确定按钮:

按下->或<-键交换相邻标签,直到拼写成功,标签显示绿色:

窗口底部显示成功拼写所移动的次数:

5 总结 

5.1 主要问题和解决办法 

       需要实现的第一个功能就是窗口的设计,要让用户用起来方便,窗口的设计必须合理,为解决这个问题需要用到JTextField、JFrame等组件,通过其中的函数实现相应功能。

       第二个问题是实现文本框输入文本后程序创建和字母相应数量的标签。为解决这个问题我创建了getRondomString()和getLetterLabel()方法,再将获得的文本随机排序,在SpellingWordFrame中调用getRondomString()方法,为随机排序的文本创建相应英文字母的标签,调用getLetterLabel()方法,为随机生成的字符串创建标签。将随机生成的标签显示在窗口中主要用到了Box类和JLabel类,实现随机生成主要用到了可变字符串类StringBuffer和Math类中的random()方法。

       第三个问题是实现移动相邻标签,我创建了LetterLabel类,主要运用了addFocusListener()方法,监控用户按下的是哪一个标签,再创建keyPressed()实现按-->或--<键交换相邻字母的功能。具体实现代码下图所示:

        要实现程序记录按下<—或—>键的次数,只需在判断是否按下这两个键的方法体中加入属性count记录该方法执行次数即可,具体实现如图28、29所示。    

5.2 创新和得意之处

         在拼写正确之后,标签的颜色自动变成绿色,提示用户拼写成功。如图所示:

5.3 不足和改进之处 

       实现的功能较少,还可以在此基础上设计出更多的功能,比如记录练习时长,定时训练等,但时间比较紧,暂时只实现了基本功能,今后还可以继续设计。

5.4 心得体会 

       不知不觉Java课设也已经结束了,从刚开始的不知道从何处下手到完成课程,我学到了很多知识。我深刻地体会到什么叫做纸上得来终觉浅,只有真正地把自己学到的知识进行实操,为解决实际的问题想破脑袋才算是真正地学习Java。学习java听老师讲起课来,自己听得明白,但是要自己真的去动手起来做的话,那又是另一回事了,听得明白不一定就可以自己动手做出来,学习java只有听懂了再自己动手去真正的做出一些东西来运用这些代码,让代码在我脑子里转来转去不会忘记,看到有类似的功能就会想起用这些代码来实现功能,那样才是真正的学会了。

       在这次课设中,我主要学习的是Java书上第九章的内容——组件及事件处理。在做课设之前,书上的常用组件和运行代码是我对这一章的第一印象,当时觉得这一章应该挺简单的,毕竟只需要熟悉各种类的功能再去调用就行了,没想到运行起来却出现了许多Bug,要不就是面板无法显示,要不就是布局出了问题。最后通过一遍一遍的调试和修改才完成了这次的课设。现在我可以熟练地运用JTextField、JFrame等组件为我的窗口服务,就算编程中出现问题我也有了解决问题的信心和决心。是维持不变魏晨看见你未成年我拿出而成为警察局我几次哦吴炯成为球会IP出去都维护多为活动和无穷好滴哦维权活动我维护动物求传播我全部从i我全部从我全部从五千

        在 Java 的学习过程中,可能会遇到形形色色的问题不容易解决,应多去专业论坛了解相关的知识,书本上的知识有限。要会从网上搜索有用的信息 加以整理,促进学习的深入和知识水平的提高。为了学好Java,我看了很多网上课程,说学到一定程度要尝试着自己做东西,但觉得自己仅仅经过一学期的学习,还远远不够,希望自己在以后学习中继续努力,能够真真正正拥有一门编程语言,对自己今后的发展起到作用。从另一方面来看,学习编程,其实要先从分析别人的代码开始,明白他们的思路,认真分析,当我们达到一定的水平之后再自己动手编程。在学习的过程中一定要动手做、写代码,比如说老师布置的实验作业,一定要自己做。首先不是为了应付老师,而是要让自己真正懂得java,这样慢慢的,以后的实验自己就有实力去做。是维持不变魏晨看见你未成年我拿出而成为警察局我几次哦吴炯成为球会IP出去都维护多为活动和无穷好滴哦维权活动我维护动物求  播全部从i我全部从我全部从五千

       学习java不是抱一本书看看就行。很多东西和体会必须自己动手才能真正属于自己,实践是最重要的,更何况还可以从实践中体会到编程的乐趣,感受到自己做好一个程序,然后运行出结果,这对我来说是很有成就感的一件事。

6 参考文献 

  1. 耿祥义,张跃平.Java2实用教程(第6版).北京:清华大学出版社
  2. 耿祥义,张跃平.Java2实用教程(第6版)实验指导与习题解答.北京:清华大学出版社
  3. Java程序设计教程(第2版) 雍俊海 编著 清华大学出版社

7 软件实现 

WordMainClass.java
package com.company;

public class WordMainClass {
    public static void main(String args[]) {
        new SpellingWordFrame();
    }
}

RondomString.java
package com.company;

public class RondomString {
    String str="";
    public String getRondomString(String s){
        StringBuffer strBuffer=new StringBuffer(s);//StringBuffer是可变字符串类,对象可以随意修改字符串的内容
        int m=strBuffer.length();//m等于字符串长度
        for(int k=0;k<m;k++){
            int index=(int)(Math.random()*strBuffer.length());
            char c=strBuffer.charAt(index);//返回此序列中指定索引处的char值
            str=str+c;
            strBuffer=strBuffer.deleteCharAt(index);//使用时删除索引为index的字符
        }
        return str;
    }
}

LetterLabel.java
package com.company;

import java.awt.*;
import java.awt.event.*;
import javax.swing.JTextField;
public class LetterLabel extends JTextField implements FocusListener{
    LetterLabel(){
        setEditable(false);//
        addFocusListener(this);//注册焦点事件监听器
        setBackground(Color.white);
        setFont(new Font("Arial",Font.PLAIN,40));//设置标签大小
    }
    public static LetterLabel[] getLetterLabel(int n){//为长度为n的文本创建n个标签
        LetterLabel a[]=new LetterLabel[n];
        for(int k=0;k<a.length;k++)
            a[k]=new LetterLabel();//为每一个字母创建一个标签
        return a;//返回LetterLabel a的引用
    }
    public void focusGained(FocusEvent e){
        setBackground(new Color(192,192,192));
    }//从无输入焦点变成有输入焦点(当前被按下的标签为灰色)
    public void focusLost(FocusEvent e){
        setBackground(Color.white);
    }//从有输入焦点变成无输入焦点(按下标签后,标签变成白色)
    public void setText(char c){//定义要显示的Char
        setText(""+c);
    }
}

SpellingWordFrame.java
package com.company;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SpellingWordFrame extends JFrame implements KeyListener,ActionListener{
    JTextField inputWord;
    JButton button;
    LetterLabel label[];
    JPanel northP, centerP;
    Box wordBox;
    String hintMessage = "                用鼠标单击字母,按左右箭头交换字母,将其排列成所输入的单词";
    JLabel messageLabel = new JLabel(hintMessage);
    String word = "";
    int count=0;
    SpellingWordFrame() {  //构造方法
        inputWord = new JTextField(18);
        button = new JButton("确定");
        button.addActionListener(this);//将button实例加上一个监听器,当鼠标点击button,就会触发这一个监听器
        inputWord.addActionListener(this);//当输入文本,就会触发这一个监听器
        northP = new JPanel();
        northP.add(new JLabel("输入单词:"));
        northP.add(inputWord);
        northP.add(button);
        //northP.setPreferredSize(new Dimension(0,40));
        centerP = new JPanel();
        wordBox = Box.createHorizontalBox();//返回一个 Box 对象,BoxLayout 沿着水平方向放置组件,让组件在容器内从左到右排列。
        centerP.add(wordBox);
        add(northP, BorderLayout.NORTH);
        add(centerP, BorderLayout.CENTER);
        add(messageLabel, BorderLayout.SOUTH);
        northP.setBackground(new Color(253,238,210));
        centerP.setBackground(new Color(253,238,210));
        setTitle("英语单词拼写训练");
        setBounds(370, 210, 500, 380);
        setVisible(true);
        validate();
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);//点击关闭按钮时,隐藏并释放窗体,当最后一个窗口被释放后,程序也随之运行结束
    }
    public void actionPerformed(ActionEvent e) {//事件触发ActionEvent事件后,监视器调用接口中的方法actionPerformed()对发生的事件进行处理
        word = inputWord.getText();//获取inputWord文本框中的文本
        int n = word.length();//文本的长度
        RondomString rondom = new RondomString();
        String randomWord = rondom.getRondomString(word);//将文本框中的文本随机排序
        wordBox.removeAll();//移除之前输入的文本
        messageLabel.setText(hintMessage); //此组件将要显示的hintMessage单行文本
        if (n > 0) {
            label = LetterLabel.getLetterLabel(n);//为label创建n个标签
            for (int k = 0; k < label.length; k++) {
                label[k].setText("" + randomWord.charAt(k));//返回指定k索引处的char值
                wordBox.add(label[k]);//将标签沿水平方向从左到右排布
                label[k].addKeyListener(this);//注册监视器,用户按下键盘上的某个键将触发KeyEvent事件,调用keyPress方法,释放则调用keyReleased方法
            }
            validate();
            inputWord.setText(null);//将文本框中的文本置空
            label[0].requestFocus();//将label[0]设置为焦点
        }
    }

    public void keyPressed(KeyEvent e) {
        LetterLabel sourceLabel = (LetterLabel) e.getSource();//点击一个按钮,获得一个按钮,强制转换成LetterLabel型
        int index = -1;//
        if (e.getKeyCode() == KeyEvent.VK_LEFT) {//判断按下的是否是"<-"键,用getKeyCode()方法返回一个键码值
            for (int k = 0; k < label.length; k++) {
                if (label[k] == sourceLabel) {
                    index = k;
                    break;
                }
            }
         count++;
            if (index != 0) {//移动标签的停止条件
                String temp = label[index].getText();//让temp获得label的文本
                label[index].setText(label[index - 1].getText());
                label[index - 1].setText(temp);
                label[index - 1].requestFocus();
            }
        }
        else if (e.getKeyCode() == KeyEvent.VK_RIGHT)//判断按下的是否是“->”键,用getKeyCode()方法返回一个键码值
        {
            for (int k = 0; k < label.length; k++) {
                if (label[k] == sourceLabel) {//确定被按下标签的位置
                    index = k;
                    break;
                }
            }
        count++;
            if (index != label.length - 1) {//移动标签的停止条件
                String temp = label[index].getText();//检索与temp相关的文本
                label[index].setText(label[index + 1].getText());//将下一个位置处的文本赋给上一个位置处的文本
                label[index + 1].setText(temp);//前后两个位置互换标签
                label[index + 1].requestFocus();//将焦点移动到下一个标签
            }
        }
        validate();
    }

    public void keyTyped(KeyEvent e) {//当键被按下又释放时,调用此方法
    }

    public void keyReleased(KeyEvent e) {
        String success = "";
        for (int k = 0; k < label.length; k++) {
            String str = label[k].getText();
            success = success + str;
        }
        if (success.equals(word)) {
            messageLabel.setText("您一共移动了"+count+"次!");
            count=0;
            for (int k = 0; k < label.length; k++) {
                label[k].removeKeyListener(this);
                label[k].removeFocusListener(label[k]);
                label[k].setBackground(Color.green);
            }
            inputWord.requestFocus();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值