JAVA实现打字练习软件

news2024/12/23 5:03:03

转眼已经学了一学期的java了,老师让我们根据所学知识点写一个打字练习软件的综合练习。一开始我也不是很有思路,我找了一下发现csdn上关于这个小项目的代码也不算很多,所以我最后自己在csdn查了一些资料,写了这么一个简略版本的打字练习软件(本人菜鸟,大佬勿喷),现在我把我写这个小项目的心路历程进行一下简单的总结。

首先建立TypeFrame包并在包下建立如下类容:

第一步对界面的初始化:

    public TypeFrame(){
        this.setBounds(600,300,950,600);
        this.setLayout(new FlowLayout());
        this.setDefaultCloseOperation(3);
        this.setResizable(false);
        this.setVisible(true);
    }

第二步对界面的组件进行初始化

1.在成员部分进行声明

    JMenuBar Bar;
    JMenu menu;
    JMenuItem item1;
    JMenuItem item2;
    JMenuItem item3;

    JLabel label1;
    JLabel label2;
    JLabel label3;
    JLabel label4;
    JLabel label5;
    JLabel label6;

    JTextField text1;
    JTextField text2;
    JTextField text3;
    JTextField text4;
    JTextField text5;

    JTextArea textArea1;
    JTextArea textArea2;

    int CorrectNum=0;//打字正确数
    int ErrorNum=0;//打字错误数
    int TypeNum=0;//打字总数

    Timer  time;
    int Time=0;//打字时间

    int v=0;//打字速度

    JFileChooser  chooser;

 2.在init函数内对其进行初始化

 public void init(){
        Bar=new JMenuBar();
        menu=new JMenu("菜单");
        item1=new JMenuItem("导入文本");
        item1.addActionListener(this);
        item2=new JMenuItem("保存");
        item2.addActionListener(this);
        item3=new JMenuItem("退出");
        item3.addActionListener(this);

        Bar.add(menu);
        menu.add(item1);
        menu.add(item2);
        menu.add(item3);
        this.getContentPane().add(Bar);



        label1=new JLabel("用时:");
        label2=new JLabel("总字数:");
        label3=new JLabel("正确:");
        label4=new JLabel("错误:");
        label5=new JLabel("每分钟:");
        label6=new JLabel("个字");


        text1=new JTextField(10);
        text1.setHorizontalAlignment(JTextField.CENTER);//设置文本居中显示
        text2=new JTextField(10);
        text2.setHorizontalAlignment(JTextField.CENTER);
        text3=new JTextField(10);
        text3.setHorizontalAlignment(JTextField.CENTER);
        text4=new JTextField(10);
        text4.setHorizontalAlignment(JTextField.CENTER);
        text5=new JTextField(10);
        text5.setHorizontalAlignment(JTextField.CENTER);

        time =new Timer(1000, this);
        time.start();

        //这里比较难--既要控制确定的行数和列数还要保准写入的数字不会缩进
        // 是否自动换行,默认为 false
        //void setLineWrap(boolean wrap)
        //row--行数 columns--列数
        textArea1 = new JTextArea(11, 80);
        textArea1.setLineWrap(true);
        textArea1.setFont(new Font("隶书",Font.BOLD,20));
        textArea1.append("abcdefghijklmnopqrstuvwsyz");

        textArea2 = new JTextArea(11, 80);
        textArea2.setLineWrap(true);
        textArea2.setFont(new Font("隶书",Font.BOLD,20));
        textArea2.addKeyListener(this);
        try {
            BufferedReader br=new BufferedReader(new FileReader("C:\\Users\\略略略\\IdeaProjects\\out\\TypeFrame\\src\\a.txt"));
            String str;
            textArea2.setText(null);
            while ((str=br.readLine())!=null){
                textArea2.append(str);
            }
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }



        //如何对textArea进行监听?

        chooser=new JFileChooser();


        this.add(label1);
        this.add(text1);
        this.add(label2);
        this.add(text2);
        this.add(label3);
        this.add(text3);
        this.add(label4);
        this.add(text4);
        this.add(label5);
        this.add(text5);
        this.add(label6);

        this.getContentPane().add(textArea1);
        this.getContentPane().add(textArea2);

        this.setVisible(true);
    }

 第三步对TextArea,item1,2,3组件进行监听

textArea2.addKeyListener(this);
        try {
            BufferedReader br=new BufferedReader(new FileReader("C:\\Users\\略略略\\IdeaProjects\\out\\TypeFrame\\src\\a.txt"));
            String str;
            textArea2.setText(null);
            while ((str=br.readLine())!=null){
                textArea2.append(str);
            }
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
  @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==item1){
            InitData();
            Time=0;
            InitText();
            textArea2.setText(null);
            int result = chooser.showOpenDialog(null);
            // 如果用户选择了文件或目录,获取用户所选的文件路径并输出
            if (result == JFileChooser.APPROVE_OPTION) {
                String filePath = chooser.getSelectedFile().getAbsolutePath();
                try {
                    BufferedReader br=new BufferedReader(new FileReader(filePath));
                    String str;
                    textArea1.setText(null);
                    while ((str=br.readLine())!=null){
                        textArea1.append(str);
                    }
                    Time=0;
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
                // System.out.println("用户选择的文件路径为:" + filePath);
            }
        }else if(e.getSource()==item2){
            String str=textArea2.getText();
            try {
                BufferedWriter bw=new BufferedWriter(new FileWriter("C:\\Users\\略略略\\IdeaProjects\\out\\TypeFrame\\src\\a.txt"));
                bw.write(str);
                bw.close();//不关流是保存不了文本的
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
            System.out.println(str);
            System.out.println("保存成功");
        } else if(e.getSource()==item3){
            System.exit(0);
        }


        Time++;
        text1.setText(Time+"");

        v=TypeNum*60/Time;
        text5.setText(v+"");

    }

补充一下 InitData(),InitText()两个函数

    public void InitText() {
        text2.setText(TypeNum+"");
        text3.setText(CorrectNum+"");
        text4.setText(ErrorNum+"");
        text5.setText(v+"");
    }

    public void InitData() {
        CorrectNum=0;
        ErrorNum=0;
        TypeNum=0;
        v=0;
    }

完整代码如下:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.*;

public class TypeFrame extends JFrame implements ActionListener, KeyListener {
    JMenuBar Bar;
    JMenu menu;
    JMenuItem item1;
    JMenuItem item2;
    JMenuItem item3;

    JLabel label1;
    JLabel label2;
    JLabel label3;
    JLabel label4;
    JLabel label5;
    JLabel label6;

    JTextField text1;
    JTextField text2;
    JTextField text3;
    JTextField text4;
    JTextField text5;

    JTextArea textArea1;
    JTextArea textArea2;

    int CorrectNum=0;//打字正确数
    int ErrorNum=0;//打字错误数
    int TypeNum=0;//打字总数

    Timer  time;
    int Time=0;//打字时间

    int v=0;//打字速度

    JFileChooser  chooser;


    public TypeFrame(){
        this.setBounds(600,300,950,600);
        this.setLayout(new FlowLayout());
        this.setDefaultCloseOperation(3);
        this.setResizable(false);
        this.setVisible(true);
    }

    public void init(){
        Bar=new JMenuBar();
        menu=new JMenu("菜单");
        item1=new JMenuItem("导入文本");
        item1.addActionListener(this);
        item2=new JMenuItem("保存");
        item2.addActionListener(this);
        item3=new JMenuItem("退出");
        item3.addActionListener(this);

        Bar.add(menu);
        menu.add(item1);
        menu.add(item2);
        menu.add(item3);
        this.getContentPane().add(Bar);



        label1=new JLabel("用时:");
        label2=new JLabel("总字数:");
        label3=new JLabel("正确:");
        label4=new JLabel("错误:");
        label5=new JLabel("每分钟:");
        label6=new JLabel("个字");


        text1=new JTextField(10);
        text1.setHorizontalAlignment(JTextField.CENTER);//设置文本居中显示
        text2=new JTextField(10);
        text2.setHorizontalAlignment(JTextField.CENTER);
        text3=new JTextField(10);
        text3.setHorizontalAlignment(JTextField.CENTER);
        text4=new JTextField(10);
        text4.setHorizontalAlignment(JTextField.CENTER);
        text5=new JTextField(10);
        text5.setHorizontalAlignment(JTextField.CENTER);

        time =new Timer(1000, this);
        time.start();

        //这里比较难--既要控制确定的行数和列数还要保准写入的数字不会缩进
        // 是否自动换行,默认为 false
        //void setLineWrap(boolean wrap)
        //row--行数 columns--列数
        textArea1 = new JTextArea(11, 80);
        textArea1.setLineWrap(true);
        textArea1.setFont(new Font("隶书",Font.BOLD,20));
        textArea1.append("abcdefghijklmnopqrstuvwsyz");

        textArea2 = new JTextArea(11, 80);
        textArea2.setLineWrap(true);
        textArea2.setFont(new Font("隶书",Font.BOLD,20));
        textArea2.addKeyListener(this);
        try {
            BufferedReader br=new BufferedReader(new FileReader("C:\\Users\\略略略\\IdeaProjects\\out\\TypeFrame\\src\\a.txt"));
            String str;
            textArea2.setText(null);
            while ((str=br.readLine())!=null){
                textArea2.append(str);
            }
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }



        //如何对textArea进行监听?

        chooser=new JFileChooser();


        this.add(label1);
        this.add(text1);
        this.add(label2);
        this.add(text2);
        this.add(label3);
        this.add(text3);
        this.add(label4);
        this.add(text4);
        this.add(label5);
        this.add(text5);
        this.add(label6);

        this.getContentPane().add(textArea1);
        this.getContentPane().add(textArea2);

        this.setVisible(true);
    }


    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==item1){
            InitData();
            Time=0;
            InitText();
            textArea2.setText(null);
            int result = chooser.showOpenDialog(null);
            // 如果用户选择了文件或目录,获取用户所选的文件路径并输出
            if (result == JFileChooser.APPROVE_OPTION) {
                String filePath = chooser.getSelectedFile().getAbsolutePath();
                try {
                    BufferedReader br=new BufferedReader(new FileReader(filePath));
                    String str;
                    textArea1.setText(null);
                    while ((str=br.readLine())!=null){
                        textArea1.append(str);
                    }
                    Time=0;
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
                // System.out.println("用户选择的文件路径为:" + filePath);
            }
        }else if(e.getSource()==item2){
            String str=textArea2.getText();
            try {
                BufferedWriter bw=new BufferedWriter(new FileWriter("C:\\Users\\略略略\\IdeaProjects\\out\\TypeFrame\\src\\a.txt"));
                bw.write(str);
                bw.close();//不关流是保存不了文本的
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
            System.out.println(str);
            System.out.println("保存成功");
        } else if(e.getSource()==item3){
            System.exit(0);
        }


        Time++;
        text1.setText(Time+"");

        v=TypeNum*60/Time;
        text5.setText(v+"");

    }

    public void InitText() {
        text2.setText(TypeNum+"");
        text3.setText(CorrectNum+"");
        text4.setText(ErrorNum+"");
        text5.setText(v+"");
    }

    public void InitData() {
        CorrectNum=0;
        ErrorNum=0;
        TypeNum=0;
        v=0;
    }


    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        if(textArea2.getText().length()<=textArea1.getText().length()){
            InitData();
            for (int i=0;i<textArea2.getText().length();i++){
                if(textArea2.getText().charAt(i)==textArea1.getText().charAt(i)){
                    CorrectNum++;
                    TypeNum++;
                    text2.setText(TypeNum+"");
                    text3.setText(CorrectNum+"");

                }else{
                    ErrorNum++;
                    TypeNum++;
                    text2.setText(TypeNum+"");
                    text4.setText(ErrorNum+"");
                }
            }
        }else{
            JOptionPane.showMessageDialog(null, "已超出数字范围!", "提示",JOptionPane.PLAIN_MESSAGE);
        }
        InitText();
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
}
public class APP {
    public static void main(String[] args) {
        TypeFrame app=new TypeFrame();
        app.init();
    }
}

 a.txt

功能简介

导入文本--可以向第一个文本写入数据

保存--可以把“我”写的文本保存进入a.txt中,下一次打开这个软件时会自动写入保存在a.txt文本的内容。

退出--点击退出,app会直接关闭。

事先在桌面建立1.txt文本,并向里面写入数据

 点击第二个Desktop

 

 

 

 希望看到最后的你,如果觉得这篇文章对你有一点点帮助或者启示的话,求点赞,求收藏,求关注,谢谢啦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/617396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】——list的介绍及模拟实现

文章目录 1. 前言2. list的介绍3. list的常用接口3.1 list的构造函数3.2 iterator的使用3.3 list的空间管理3.4 list的结点访问3.5 list的增删查改 4. list迭代器失效的问题5. list模拟实现6. list与vector的对比7. 结尾 1. 前言 我们之前已经学习了string和vector&#xff0c…

Remix IDE已支持Sui Move在线开发

网页版Remix IDE与WELLDONE Code插件结合&#xff0c;让您无需本地设置或安装即可开始构建Sui应用程序。 不熟悉Sui的构建者可能想在正式配置开发环境之前&#xff0c;浅尝一下构建Sui应用程序。Remix IDE与WELLDONE Code插件组合&#xff0c;即可帮助构建者实现从浏览器窗口开…

JavaScript函数的增强知识

函数属性和arguments以及剩余参数 函数属性name与length ◼ 我们知道JavaScript中函数也是一个对象&#xff0c;那么对象中就可以有属性和方法。 ◼ 属性name&#xff1a;一个函数的名词我们可以通过name来访问&#xff1b; // 自定义属性foo.message "Hello Foo"…

Nginx 之 Tomcat 负载均衡、动静分离

一.详细安装及操作实例&#xff08;Nginx 七层代理&#xff09; 首先至少准备三台服务器 Nginx 服务器&#xff1a;192.168.247.131:80 Tomcat服务器1&#xff1a;192.168.247.133:80 Tomcat服务器2&#xff1a;192.168.247.134:8080 192.168.247.134:80811.部署Nginx 负载均…

微信自动回复怎么设置呢?

友友们 你们是否有以下这些烦恼 1、每天要手动点击“添加”按钮多次以通过大量好友? 2、你是否经常需要在多个微信帐号之间来回切换&#xff1f; 3、你的回复速度慢&#xff0c;导致客户流失率高&#xff1f; 4、为了及时回复&#xff0c;你总是需要带着多部手机出门&…

二十一、C++11(中)

文章目录 一、左值&右值&#xff08;一&#xff09;基本概念1.左值是什么2.右值是什么 &#xff08;二&#xff09;左值引用和右值引用1.左值引用2.右值引用 二、右值引用使用场景和意义&#xff08;一&#xff09;引入&#xff08;二&#xff09;左值引用的使用场景&#…

Linux编译器(gcc/g++)调试器gdb项目自动化构建工具(make/Makefile)版本管理git

Linux编译器-gcc/g&&调试器gdb&&项目自动化构建工具-make/Makefile&&版本管理git &#x1f506;gcc/g的使用可执行文件的"生产"过程gcc如何完成预处理编译汇编链接 函数库函数库一般分为静态库和动态库两种静态C/C库的安装 gcc选项gcc选项记…

WPF 学习:如何照着MaterialDesign的Demo学习

文章目录 往期回顾对应视频资源如何照着wpf项目学习找到你想要抄的页面查找对应源码演示示例如何认清页面元素抄袭实战 项目地址总结 往期回顾 WPF Debug运行是 实时可视化树无效&#xff0c;无法查看代码 WPF MaterialDesign 初学项目实战&#xff08;0&#xff09;:github …

【Java】线程池的概念及使用、ThreadPoolExecutor的构造方法

什么是线程池为什么用线程池JDK提供的线程池工厂模式如何使用 自定义线程池ThreadPoolExecutor类的构造方法工作原理拒绝策略 线程池的使用 什么是线程池 在之前JDBC编程中&#xff0c;通过DataSource获取Connection的时候就已经用到了池的概念。这里的池指的是数据库连接池。…

Vue电商项目--uuid游客身份获取购物车数据

uuid游客身份获取购物车数据 获取购物车列表 请求地址 /api/cart/cartList 请求方式 GET 参数类型 参数名称 类型 是否必选 描述 无 无 无 无 返回示例 成功&#xff1a; { "code": 200, "message": "成功", "…

马尔萨斯 ( Malthus)人口指数增长模型Logistic 模型

3.要求与任务 从 1790 — 1990 年间美国每隔 10 年的人口记录如下表所示&#xff1a; 用以上数据检验马尔萨斯 ( Malthus)人口指数增长模型&#xff0c;根据检验结果进一步讨论马尔萨斯 人口模型的改进&#xff0c;并利用至少两种模型来预测美国2010 年的人口数量。 提示 1 &…

自学黑客(网络安全),一般人我还是劝你算了吧

作为从16年接触网络安全的小白&#xff0c;谈谈零基础如何入门网络安全&#xff0c;有不对的地方&#xff0c;请多多指教。 这些年最后悔的事情莫过于没有把自己学习的东西积累下来形成一个知识体系。 后续我也会陆续的整理网络安全的相关学习资料及文章&#xff0c;与大家一…

数据结构与算法练习(三)二叉树

文章目录 1、树2、二叉树3、满二叉树4、完全二叉树5、二叉树的遍历&#xff08;前序、中序、后序&#xff09;二叉树删除节点或树 6、顺序存储二叉树顺序存储二叉树遍历&#xff08;前序、中序、后序&#xff09; 7、线索化二叉树中序线索二叉树前序线索二叉树后序线索二叉树 1…

Matlab 之 Curve Fitting APP 使用笔记

文章目录 Part.I IntroductionPart.II 使用笔记Chap.I 拟合函数Chap.II 注意事项 Part.I Introduction 曲线或曲面拟合获取拟合参数。本篇博文主要记录一下 Matlab 拟合 APP Curve Fitting 的使用方法。 Part.II 使用笔记 这个APP用来做拟合的&#xff0c;包括二维数据的线拟…

常见的样本统计量及其数字特征

常见的样本统计量及其数字特征 下图来自《统计学图鉴》 样本统计量有什么作用&#xff1f; 因为总体特征包含有总体均值、总体方差等特征&#xff0c;我们在用样本推断总体时&#xff0c;其实就是用样本特征去估计总体特征&#xff0c;例如&#xff1a;样本均值这个统计量的期…

案例33:基于Springboot名城小区物业管理系统开题报告设计

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Spark RDD统计每日新增用户

文章目录 一&#xff0c;提出任务二&#xff0c;实现思路三&#xff0c;准备工作1、在本地创建用户文件2、将用户文件上传到HDFS指定位置 四&#xff0c;完成任务1、在Spark Shell里完成任务&#xff08;1&#xff09;读取文件&#xff0c;得到RDD&#xff08;2&#xff09;倒排…

为什么要对实体类进行序列化并且要生成序列化ID?

一、为什么要对实体类进行序列化且要生成序列化ID 在Java开发中&#xff0c;实体类将会被用来与其他对象进行交互。Java语言是面向对象的&#xff0c;所以实体类包含了很多信息和方法。序列化是Java中一种将对象转换为字节流的机制&#xff0c;使得对象可以在网络上传输和存储。…

相机成像模型(一)

相机模组 如上图所示相机模组由多个元件组成,其中比较重要的元件包括镜头、感光芯片、驱动芯片。镜头的作用是聚集光线,确保良好的成像环境;感光芯片将光信号转换为电信号;驱动芯片则负责信号处理(去噪、白平衡等)与格式转换。 相机的成像过程为物体通过镜头聚集…

jvm cpu 高定位

快速的发现线程cpu高, 最终发现是gc线程, 最终去分析jvm top -o %CPU top -Hp108920 jmap -dump:formatb,fileheap.bin 108920 jvm 命令和工具_个人渣记录仅为自己搜索用的博客-CSDN博客 $ jstat -gcold 108920 MC MU CCSC CCSU OC OU YGC FGC FGCT GCT 218368.0 212670.3 253…