Java课设案例之百行代码实现简易计算器

 更新时间:2023年06月16日 11:19:19   作者:yoke菜籽  
下面这篇文章主要给大家介绍了关于Java课设案例之百行代码实现简易计算器的相关资料,这是一个关于java简单计算器的完整课程设计以及源码,需要的朋友可以参考下

一、 设计简介

1、 设计背景

伴随着日益升高的物质生活水平以及日常生活中对基本的计算需求的提高。如今,网络快速发展,对算力的需求日益增大,计算的效率和性能和人们的生活紧密相关。对此,使用Java语言开发出一个为人们生活带来便利的计算器,以期带来对数据计算的提高。该系统实现了对数的加、减、乘、除的运算。

2、 开发工具及环境

(1)开发工具及介绍

Visual Studio Code(简称“VS Code” )是Microsoft在2015年4月30日Build开发者大会上正式宣布一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代Web和云应用的跨平台源代码编辑器, [2] 可在桌面上运行,并且可用于Windows,macOS和Linux。它具有对JavaScript,TypeScript和Node.js的内置支持,并具有丰富的其他语言(例如C++,C#,Java,Python,PHP,Go)和运行时(例如.NET和Unity)扩展的生态系统。

(2)开发环境:window10系统、Visual Studio Code1.67.2、JDK17.0.2。

二、 相关工作

1、设计基础

使用Java Swing的GUI图形用户界面编程设计编写一个简易的计算器,加入事件监听器可以通过鼠标输入参加运算的数值和运算符,达到四则运算的目的。

2、功能需求

图形化用户界面,设计的简易计算器,用户通过鼠标依次输入参与计算的数值和运算符,进行四则运算,具体如下:

(1) 鼠标单击“计算器”上的数字按钮(0、1、2、3、4、5、6、7、8、9)累次可以设置参与运算的数值

(2) 鼠标单击“计算器”上的运算符按钮(+、-、*、/)选择运算符同时,保存之前的数,并情况输入栏,以便后续输入。

(3) 鼠标单击“计算器”上的“=”按钮,输出运算的结果。

(4) 鼠标单击“计算器”上的“clear”按钮,可以清除输入框内的数字。

3、系统设计

一个简易的计算器,主要由界面组件、组件事件监听器以及处理程序组成,如图2-1。实现其功能具体可分如下几个步骤:

(1) 创建Java项目(此版本为17.0.2的JDK)

(2) 创建框架、面板以及初始化

(3) 创建UI组件,并将其添加到相应面板中

(4) 注册监听器、添加事件响应逻辑

(5) 计算逻辑实现

三、 设计原理

1、包和类的说明

package start;\保存主要功能实现代码的包
package util;\保存常量的包
public class Const\自定义保存常量的类
public class calculator \自定义实现计算器主要功能的类

2、简易计算器的源代码清单

①导入组件

package start;
import javax.swing.*;
import util.Const;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

②创建Const类的部分代码

public class Const {
    public static final int FRAME_W = 300;//得到窗体中心点
    public static final int FRAME_H = 300;
    public static final int SCREEN_W = Toolkit.getDefaultToolkit().getScreenSize().width;
    public static final int SCREEN_H = Toolkit.getDefaultToolkit().getScreenSize().height;
    public static final int Frame_X = (SCREEN_W-FRAME_W)/2;
    public static final int Frame_Y = (SCREEN_H-FRAME_H)/2;
    public static final String TITLE = "计算器";
}

 ③calculator类中的部分代码

public class calculator extends JFrame implements ActionListener{
    /**********************北面的控件***********************/
    private JPanel jp_north = new JPanel();
    private JTextField input_text = new JTextField();
    private JButton c_Btn = new JButton("Clear");
     /**********************中间的控件***********************/
     private JPanel jp_center = new JPanel();
     public calculator() throws HeadlessException{//显示窗体
        this.init();
        this.addNorthComponent();
        this.addCenterButton();
    }
    //初始化的方法
    public void init(){
        this.setTitle(Const.TITLE);
        this.setSize(Const.FRAME_W, Const.FRAME_H);
        this.setLayout(new BorderLayout());
        this.setResizable(false);
        this.setLocation(Const.Frame_X,Const.Frame_Y);//设置框架在屏幕的位置
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭键
    }
    //主方法
    public static void main(String[] args) {
        calculator Calculator = new calculator();
        Calculator.setVisible(true);
    }
}

④添加控件和按钮的代码

    //添加北面的控件
    public void addNorthComponent(){
        this.input_text.setPreferredSize(new Dimension(200,30));//设置文本框大小
        jp_north.add(input_text);//加文本框
        this.c_Btn.setForeground(Color.RED);//设置按钮颜色
        jp_north.add(c_Btn);//加按钮
        c_Btn.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                input_text.setText("");
            }
        });
        this.add(jp_north,BorderLayout.NORTH);//将面板加到框架北侧
    }
    //添加中间按钮
    public void addCenterButton(){
        String btn_text = "123+456-789*0.=/";
        String regex = "[\\+\\-*/.=]";//正则表达式
        this.jp_center.setLayout(new GridLayout(4,4));//4*4的布局
        for(int i=0;i<16;i++){//在面板中加按钮
            String tmp  = btn_text.substring(i,i+1);
            JButton btn = new JButton();
            btn.setText(tmp);//给按钮加文字
            if(tmp.matches(regex)){//如果正则匹配
                    btn.setFont(new Font("粗体",Font.BOLD,20));
                    btn.setForeground(Color.RED);
                }
            btn.addActionListener(this);//添加按钮监听器
            jp_center.add(btn);
        }
        this.add(jp_center,BorderLayout.CENTER);//将面板加载框架布局的中间位置
    }

⑤添加事件监听器和逻辑运算代码

    private String firstInput = null;
    private String operator = null;
    //给按钮添加监听事件
    public void actionPerformed(ActionEvent e){
        String clickStr = e.getActionCommand();
        if(".0123456789".indexOf(clickStr)!=-1){//数字输入
            this.input_text.setText(input_text.getText() + clickStr);
            this.input_text.setHorizontalAlignment(JTextField.RIGHT);
        }
        else if(clickStr.matches("[\\+\\-*/]{1}")){//运算符输入
            operator = clickStr;
            firstInput = this.input_text.getText();
            this.input_text.setText("");
        }
        else if(clickStr.equals("=")){//等号输入
            Double a = Double.valueOf(firstInput);
            Double b = Double.valueOf(this.input_text.getText());
            Double res = null;
            switch (operator){//运算主体
                case "+":
                res = a + b;
                break;
                case "-":
                res = a - b;
                break;
                case "*":
                res = a * b;
                break;
                case "/":
                if(b!=0){
                    res = a/b;
                }
                else{
                    this.input_text.setText("除数不能为0!请清空!");
                }
                break;
            }
            this.input_text.setText(res.toString());
        }
    }

四、 实现结果

1、程序界面

简易计算器运行界面,如图3-1所示。

图3-1 计算器运行界面

2、测试用例

(1)清除当前输入的数值,例如:计算7+23,输出结果为30.0。

(2)清除当前输入的数值,例如:计算7-23,输出结果为-16.0。

(3)清除当前输入的数值,例如:计算7*23,输出结果为161.0。

(4)清除当前输入的数值,例如:计算7/23,输出结果为0.30434782608695654。

3、运行结果

(1)输入7和23,进行加法运算,如图3-2、图3-3和图3-4所示。下面只输出结果。

图3-2 输入 7

图 3-3 输入 23

图3-4 结果显示为 30.0

(2)输入7和23,进行减法运算,如图3-5所示。

图3-5 “7-23”结果显示为 -16.0

(3)输入7和23,进行乘法运算,如图3-6所示

图3-6 “7*3”结果显示为161.9

(4)输入7和23,进行除法运算,如图3-7所示。

图3-7“7/23”结果显示为0.30434782608695654

五、 设计心得

从我的角度出发,课设的目的在于使学生养成综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生在实际场景下能力的具体训练和考察过程。伴随着科学技术的快速发展,当今计算机的应用在生活中可以说是处处都有。

在课程设计过程中我遇到许多的问题,通过网上的查询,和同学的热心帮助,最终我成功的完成了这次课程设计。在这其中我充分理解了Java面对对象的特性,并体会到Java与C\C++语言的不同之处。只有多动手,经常编写程序,才能发现我们学习上的缺陷和自己的不足,并在实践中解决这些问题,不断提高自己转化知识的能力。通过本课程的设计,我了解到理论与实践的结合非常重要,简单的理论知识远远不够,只有将所获得的理论知识与实践相结合,从理论中得出结论,才能真正服务于社会,发展我的实践技能和能力。 这次编写的程序大部分功能是通过调用各包中的方法和类来实现的,这也让我充分理解了包和类之间的关系。

由于这次编写的程序是我初次使用Java编写,会遇到很多小问题,比如说:如何保存输入的数字和下一个数进行加、减、乘、除运算。此次课程设计让我们更了解Java中的图形用户界面和它的编程方式。在完成课题的过程中,查阅了很多关于Java语言开发的资料,不断地充实了自己,学习到了很多以前没有学习到的知识,收获颇多。Java 计算器设计使得我们对所学的课程有了更为深刻的认识,使得知识得到了巩固和提高。

今后,我将会继续努力;我相信,只要有信心,有毅力,人永远不会被打败!

完整源码

package util;
import java.awt.*;
public class Const {
    public static final int FRAME_W = 300;//得到窗体中心点
    public static final int FRAME_H = 300;
    public static final int SCREEN_W = Toolkit.getDefaultToolkit().getScreenSize().width;
    public static final int SCREEN_H = Toolkit.getDefaultToolkit().getScreenSize().height;
    public static final int Frame_X = (SCREEN_W-FRAME_W)/2;
    public static final int Frame_Y = (SCREEN_H-FRAME_H)/2;
    public static final String TITLE = "计算器";
}
package start;
import javax.swing.*;
import util.Const;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class calculator extends JFrame implements ActionListener{
    /**********************北面的控件***********************/
    private JPanel jp_north = new JPanel();
    private JTextField input_text = new JTextField();
    private JButton c_Btn = new JButton("Clear");
     /**********************中间的控件***********************/
     private JPanel jp_center = new JPanel();
     public calculator() throws HeadlessException{//显示窗体
        this.init();
        this.addNorthComponent();
        this.addCenterButton();
    }
    //初始化的方法
    public void init(){
        this.setTitle(Const.TITLE);
        this.setSize(Const.FRAME_W, Const.FRAME_H);
        this.setLayout(new BorderLayout());
        this.setResizable(false);
        this.setLocation(Const.Frame_X,Const.Frame_Y);//设置框架在屏幕的位置
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭键
    }
    //添加北面的控件
    public void addNorthComponent(){
        this.input_text.setPreferredSize(new Dimension(200,30));//设置文本框大小
        jp_north.add(input_text);//加文本框
        this.c_Btn.setForeground(Color.RED);//设置按钮颜色
        jp_north.add(c_Btn);//加按钮
        c_Btn.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                input_text.setText("");
            }
        });
        this.add(jp_north,BorderLayout.NORTH);//将面板加到框架北侧
    }
    //添加中间按钮
    public void addCenterButton(){
        String btn_text = "123+456-789*0.=/";
        String regex = "[\\+\\-*/.=]";//正则表达式
        this.jp_center.setLayout(new GridLayout(4,4));//4*4的布局
        for(int i=0;i<16;i++){//在面板中加按钮
            String tmp  = btn_text.substring(i,i+1);
            JButton btn = new JButton();
            btn.setText(tmp);//给按钮加文字
            if(tmp.matches(regex)){//如果正则匹配
                    btn.setFont(new Font("粗体",Font.BOLD,20));
                    btn.setForeground(Color.RED);
                }
            btn.addActionListener(this);//添加按钮监听器
            jp_center.add(btn);
        }
        this.add(jp_center,BorderLayout.CENTER);//将面板加载框架布局的中间位置
    }
    private String firstInput = null;
    private String operator = null;
    //给按钮添加监听事件
    public void actionPerformed(ActionEvent e){
        String clickStr = e.getActionCommand();
        if(".0123456789".indexOf(clickStr)!=-1){//数字输入
            this.input_text.setText(input_text.getText() + clickStr);
            this.input_text.setHorizontalAlignment(JTextField.RIGHT);
        }
        else if(clickStr.matches("[\\+\\-*/]{1}")){//运算符输入
            operator = clickStr;
            firstInput = this.input_text.getText();
            this.input_text.setText("");
        }
        else if(clickStr.equals("=")){//等号输入
            Double a = Double.valueOf(firstInput);
            Double b = Double.valueOf(this.input_text.getText());
            Double res = null;
            switch (operator){//运算主体
                case "+":
                res = a + b;
                break;
                case "-":
                res = a - b;
                break;
                case "*":
                res = a * b;
                break;
                case "/":
                if(b!=0){
                    res = a/b;
                }
                else{
                    this.input_text.setText("除数不能为0!请清空!");
                }
                break;
            }
            this.input_text.setText(res.toString());
        }
    }
    //主方法
    public static void main(String[] args) {
        calculator Calculator = new calculator();
        Calculator.setVisible(true);
    }
}

总结

到此这篇关于Java课设案例之百行代码实现简易计算器的文章就介绍到这了,更多相关Java简易计算器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java创建一个类实现读取一个文件中的每一行显示出来

    java创建一个类实现读取一个文件中的每一行显示出来

    下面小编就为大家带来一篇java创建一个类实现读取一个文件中的每一行显示出来的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • postgresql 实现16进制字符串转10进制数字

    postgresql 实现16进制字符串转10进制数字

    这篇文章主要介绍了postgresql 实现16进制字符串转10进制数字操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Servlet实现代理文件下载功能

    Servlet实现代理文件下载功能

    这篇文章主要为大家详细介绍了Servlet实现代理文件下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Java使用位运算实现加减乘除详解

    Java使用位运算实现加减乘除详解

    这篇文章主要为大家详细介绍了Java如何使用位运算实现加减乘除,文中的示例代码讲解详细,对我们深入了解Java有一定的帮助,感兴趣的可以了解一下
    2023-05-05
  • Java Spring 事件监听详情解析

    Java Spring 事件监听详情解析

    这篇文章主要介绍了Java Spring 事件监听详情解析,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • 关于Cannot resolve com.microsoft.sqlserver:sqljdbc4:4.0报错问题解决办法

    关于Cannot resolve com.microsoft.sqlserver:sqljdbc4:4.0报错问题解

    这篇文章主要给大家介绍了关于Cannot resolve com.microsoft.sqlserver:sqljdbc4:4.0报错问题的解决办法,这个是在pom文件中添加依赖出现报错问题,需要的朋友可以参考下
    2024-02-02
  • SpringBoot利用注解来实现Redis分布式锁

    SpringBoot利用注解来实现Redis分布式锁

    有些业务请求,属于耗时操作,需要加锁,防止后续的并发操作,同时对数据库的数据进行操作,需要避免对之前的业务造成影响。本文将利用注解来实现Redis分布式锁,需要的可以参考一下
    2022-09-09
  • 详解Java中的ThreadLocal

    详解Java中的ThreadLocal

    ThreadLocal是JDK包提供的,它提供线程本地变量,如果创建一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个副本,在实际多线程操作的时候,操作的是自己本地内存中的变量,从而规避了线程安全问题
    2021-06-06
  • Java http请求封装工具类代码实例

    Java http请求封装工具类代码实例

    这篇文章主要介绍了Java http请求封装工具类代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java中关于控制台读取数字或字符串的方法

    Java中关于控制台读取数字或字符串的方法

    下面小编就为大家带来一篇Java中关于控制台读取数字或字符串的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10

最新评论