Java交互界面实现计算器开发设计【附函数源码】

简介: 使用Java开发的简易计算器,包括加、减、乘、除、平方、立方、小数等运算,适合学习GUI编程实践,
使用Java开发的简易计算器,包括加、减、乘、除、平方、立方、小数等运算,适合学习GUI编程实践,

之前在博客上和大家分享了一篇关于使用C#开发winform计算器的文章“C#还能这么玩?[“诺基亚大屏独显计算器”来咯!”,所以最近在用Java做GUI编程的时候就想着使用Java也实现一个类似的项目。

其实在GUI交互上,Java的计算器和C#开发的计算器思想类似,都是使用函数的形式实现各模块的功能的。但同时毕竟是两种不同的开发语言,所以在具体开发上还是有所不同的。

使用Java和C#开发交互界面,最大的区别就是:

C#的交互界面的实现是可以在设计模块中直接添加控件并设置其属性,同时还会生成与控件所绑定的控件函数的,

而Java则不同,Java的窗体和控件都需要使用代码来设置的,包括控件尺寸、字体、颜色、位置坐标等都是根据特定的函数来写出来的,同时Java中的控件在最开始的时候是没有函数与其绑定的,这就需要我们根据开发需求,为控件设定相应的监听函数。

这些了解过之后,接下来就是Java计算器开发的模块化设计了。

在这里我们需要首先定义私有的全局变量来接收在计算器运行过程中的一些变量,如输入的数值、小数点、操作符、输出框内容、计算结果等,因此对于在计算器使用过程中可能出现的变量要对其进行一一接收。在这里我们使用setOutput表示文本框第一行输出的内容,使用setOutput2表示文本框第二行输出的内容。

    private static String setOutput = "";    //定义文本框输出第一行
    private static String setOutput2 = "";    //定义文本框输出第二行
    private static double INumFirst = 0.0;        //获取第一次输入的数值
    private static double INumSecond = 0.0;    //获取第二次输入的数值
    private static double IResult = 0.0;        //定义结果
    private static String Operation = "";        //定义操作符
    private static boolean OperationCliked = false;        //定义布尔类型判断操作符是否单击
    private static boolean DotCliked = false;    //定义布尔类型判断小数点是否单击
    private static double lastPrecisionNum = 1;        //定义小数点最后一位的精度为1
    private static double ControlNum = 0;    //获取当前控件的数值

同时在进行程序开发前,我们就应该先对项目的整个架构进行设计,考虑到程序在开发过程中需要哪些函数、实现哪些功能、需要用到怎样的方法等。

就比如拿今天开发的这个计算器来说,我们需要有最基本的主函数,控件触发时的集中处理函数(因为我们不可能对计算器上的每一个控件设置一个处理函数,这样会增大程序的复杂度)、操作符触发时的处理函数、实现计算器界面布局的函数。同时还应该对计算器的整个界面布局进行设计,这是大灰狼在这个程序中设计的计算器界面,可以参考:

在这里插入图片描述

在我们有了这样的总体设计之后,就是我们针对于各个函数功能的详细设计了。

.

控件触发时集中处理函数

首先是定义控件触发时的集中处理函数,该函数的功能上可以根据实际情况分为两部分,第一部分是在我们没有点击运算操作符前,点击数字控件所触发的事件,也就是我们在输入一个数值时要做的事情;第二部分是我们在点击了运算操作符之后再点击数字控件时所触发的事件,按照实际情况,这时我们输入的数值应该是要计算的第二个数值。

与此同时,每一部分也需要根据是否点击小数点而分为两种操作,如果点击了小数点,则说明将要输入的数字是小数点后的,则要做相应的处理;若没有点击小数点,则说明此时输入的为整数位,应该让相应的数值乘以10。

该函数的具体实现代码如下:

//定义控件触发时集中处理函数
public static void Numbers_Cliked() {
    //如果点击在运算操作符
    if (OperationCliked) {
        //如果点击了小数点
        if (DotCliked) {
            lastPrecisionNum *=0.1;
            double strDotnum = ControlNum*lastPrecisionNum;
            INumSecond += strDotnum;
        }
        else {
            INumSecond = INumSecond*10 + ControlNum;
        }
        setOutput2 = "";
        setOutput2 +=INumSecond;
        //return setOutput2;
    }
    
    //如果没有点击运算操作符
    else {
        if (DotCliked) {
            lastPrecisionNum *=0.1;
            double strDotnum = ControlNum*lastPrecisionNum;
            INumSecond += strDotnum;
        }
        else {
            INumSecond = INumSecond*10 + ControlNum;
        }
        setOutput = "";
        setOutput +=INumSecond;
        //return setOutput;
    }    
}

.

操作符点击后数据转换赋值函数

当我们点击了运算操作符之后,说明我们的第一个数据已经输入完成了,这个时候,我们将要输入的是第二个数据,这时候我们就需要进行数据的赋值转换,因为我们最开始的时候是使用INumsecand这个变量来接收数据的,所以在点击运算操作符之后,我们需要将INumsecand的值赋给INumfirst,并将INumsecand的值赋于0,重新接收第二个数据。

你可能会问,为什么不直接使用INumfirst接收第一个数据,使用INumsecand接收第二个数据,原因是因为,当你点击数字控件时,我们无法判断你输入的数据是第一个数据还是第二个数据,我们只能将你输入的数据统一的赋值给某一个变量,在这里这个变量就是INumsecand,只有我们判断到当点击了运算操作符之后,说明我们的上一个数据已经输入完成了,这时候才需要我们将INumsecand赋值给INumfirst,来说明我们得到了第一个数据。

该函数的实现代码如下:

//定义操作符点击后数据转换赋值的函数
public static void Operation_Cliked() {
    INumFirst = INumSecond;        //将第一次键入的值赋给第一个数
    INumSecond = 0;                //将接收输入数值的变量赋值于0
    DotCliked = false;            //将布尔型小数点变量赋初值为:未点击
    lastPrecisionNum = 1;
}

.

计算器窗口界面函数

在这两个函数完成之后,就是我们计算器的界面设计函数了,

在该函数中,我们需要对计算器的整体界面进行布局设计,同时还需要对每一个控件添加监控,当我们点击相应的控件的时候,可以触发相应的事件操作。

运算符控件

如我们点击加法按键时,需要将我们第一次输入的数据和加法运算符输出出来,并且调用操作符点击后数据转换赋值的函数,来进行数据的赋值转换。

//设置加法按键+
        JButton add_bt = new JButton("+");
        add_bt.setBounds(5, 110, 80, 40);
        add_bt.setFont(font);
        container.add(add_bt);
        
        //添加单击监控
        add_bt.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent arg0) {
                // TODO Auto-generated method stub
                Operation = "+";
                setOutput += Operation + "\n";
                text.setText(setOutput);    //数值和运算符输出
                OperationCliked = true;
                Operation_Cliked();        //调用操作符点击后数据转换赋值的函数
                
            }
        });

数字控件

当我们点击数字0-9时,说明我们正在进行数值的输入,这个时候就需要获取到相应控件上的数值,并且调用控件触发时集中处理函数,将我们键入的数字进行赋值。

以控件数字7为例,在这里我使用num_7.getText()来获取当前所点击控件的文本,其实这是比较笨的一种方法,需要对每一个控件使用该函数,还有一种方法是获取当前焦点所在的控件,并且获取其文本,对这种方法熟悉的小伙伴可以留言大灰狼一起交流。

下面是数字7控件的相应触发代码:

JButton num_7 = new JButton("7");
num_7.setBounds(5, 200, 80, 40);
num_7.setFont(font);
container.add(num_7);
num_7.addActionListener(new ActionListener() {
    
    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub
        String strNum = num_7.getText();
        ControlNum = java.lang.Double.parseDouble(strNum);
        Numbers_Cliked();    //调用数值控件触发集中处理函数
        text.setText(setOutput + setOutput2);    //文本框输出
    }
});

其他数字控件与其类似。

小数点控件

当我们点击小数点的时候,说明我们输入的数据存在小数位,这个时候我们就需要对其作出相应的操作,如我们在点击运算操作符之前点击的小数点控件,则将小数点显示在文本框的第一行,表示第一个数是一个小数,如果我们是在点击运算操作符之后点击的小数点控件,则需要将小数点显示在文本框的第二行,表示我们输入的第二个数是小数。

具体实现代码如下:

//设置小数点按钮
        JButton num_dot = new JButton(".");
        num_dot.setBounds(175, 335, 80, 40);
        num_dot.setFont(font);
        container.add(num_dot);
        num_dot.addFocusListener(new FocusListener() {
            
            @Override
            public void focusLost(FocusEvent arg0) {
                // TODO Auto-generated method stub
                
            }
            
            @Override
            public void focusGained(FocusEvent arg0) {
                // TODO Auto-generated method stub
                if (OperationCliked) {
                    setOutput2 += ".";
                    text.setText(setOutput + setOutput2);
                    DotCliked = true;
                }
                else {
                    setOutput += ".";
                    text.setText(setOutput + setOutput2);
                    DotCliked = true;
                }
                
            }
        });

等号控件

当我们点击等号控件的时候,说明我们的数据和运算符的输入已经完成了,接下来我们就只需要根据我们键入的运算符进行判断,并进行相应的运算即可,同时在得到结果之后,我们还应将之前定义的所有变量赋予初值,方便我们进行下次输入。

实现代码如下:

//设置等号按钮
JButton num_equ = new JButton("=");
num_equ.setBounds(260, 110, 80, 130);
num_equ.setFont(font);
container.add(num_equ);
num_equ.addActionListener(new ActionListener() {
    
    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub
        switch (Operation) {
        case "+":
            IResult = INumFirst + INumSecond;
            break;
        case "-":
            IResult = INumFirst - INumSecond;
            break;
        case "*":
            IResult = INumFirst * INumSecond;
            break;
        case "/":
            IResult = INumFirst / INumSecond;
            break;
        case "X2":
            IResult = INumFirst * INumFirst;
            break;
        case "X3":
            IResult = INumFirst * INumFirst * INumFirst;
            break;
        default:
            
            break;
        }
        if (Operation == "X2" )
        {
            setOutput = INumFirst + "*" + INumFirst + "\n";
            String strIResult = java.lang.Double.toString(IResult);
            setOutput2 = strIResult;
            text.setText(setOutput + setOutput2);
        }
        if (Operation == "X3" )
        {
            setOutput = INumFirst + "*" + INumFirst + "*" + INumFirst + "\n";
            String strIResult = java.lang.Double.toString(IResult);
            setOutput2 = strIResult;
            text.setText(setOutput + setOutput2);
        }
        else {
            setOutput = INumFirst + " " + Operation + " " + INumSecond + "\n";
            String strIResult = java.lang.Double.toString(IResult);
            setOutput2 = strIResult;
            text.setText(setOutput + setOutput2);
        }
        
        //计算结束,将变量赋予初值
        setOutput = "";    //定义文本框输出
        setOutput2 = "";            
        INumFirst = 0;        
        INumSecond = 0;    
        IResult = 0.0;        //定义结果
        Operation = "";        //定义操作符
        OperationCliked = false;        //定义布尔类型判断操作符是否单击
        DotCliked = false;    //定义布尔类型判断小数点是否单击
        lastPrecisionNum = 1;        //定义小数点最后一位的精度为1
        ControlNum = 0;    //获取当前控件的数值
    }
});

清空按钮

最后一个需要设置的控件就是清空按钮,当我们点击该控件时,之前输入的所有东西都将会被清空,所有的变量都将会被赋予初值。

实现代码如下:

//设置清空按钮
JButton num_empty = new JButton("CE");
num_empty.setBounds(260, 245, 80, 130);
num_empty.setFont(font);
container.add(num_empty);
num_empty.addActionListener(new ActionListener() {
    
    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub
        setOutput = "";    //定义文本框输出
        setOutput2 = "";
        INumFirst = 0.0;        //获取第一次输入的数值
        INumSecond = 0.0;    //获取第二次输入的数值
        IResult = 0.0;        //定义结果
        Operation = "";        //定义操作符
        OperationCliked = false;        //定义布尔类型判断操作符是否单击
        DotCliked = false;    //定义布尔类型判断小数点是否单击
        lastPrecisionNum = 1;        //定义小数点最后一位的精度为1
        ControlNum = 0;    //获取当前控件的数值
        text.setText("0");
    }
});

在计算器的设计界面这些基本的控件操作完成之后,我们的计算器窗口界面函数就基本完成了。之后我们只需要在主方法中调用该函数即可实现Java计算器的运行,

.

主方法调用

主方法调用代码如下:

public static void main(String[] args) {
        // TODO Auto-generated method stub        
        new Calculator_main().window("计算器");        
    }

实现效果:

在这里插入图片描述

觉得不错记得点赞关注哟!
我是灰小猿,我们下期见!

目录
相关文章
|
5天前
|
数据采集 人工智能 Java
Java产科专科电子病历系统源码
产科专科电子病历系统,全结构化设计,实现产科专科电子病历与院内HIS、LIS、PACS信息系统、区域妇幼信息平台的三级互联互通,系统由门诊系统、住院系统、数据统计模块三部分组成,它管理了孕妇从怀孕开始到生产结束42天一系列医院保健服务信息。
19 4
|
10天前
|
Java API Maven
如何使用Java开发抖音API接口?
在数字化时代,社交媒体平台如抖音成为生活的重要部分。本文详细介绍了如何用Java开发抖音API接口,从创建开发者账号、申请API权限、准备开发环境,到编写代码、测试运行及注意事项,全面覆盖了整个开发流程。
53 10
|
11天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
39 2
|
16天前
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
32 3
|
17天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
35 4
|
18天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
48 4
|
21天前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
58 3
|
24天前
|
SQL Java 程序员
倍增 Java 程序员的开发效率
应用计算困境:Java 作为主流开发语言,在数据处理方面存在复杂度高的问题,而 SQL 虽然简洁但受限于数据库架构。SPL(Structured Process Language)是一种纯 Java 开发的数据处理语言,结合了 Java 的架构灵活性和 SQL 的简洁性。SPL 提供简洁的语法、完善的计算能力、高效的 IDE、大数据支持、与 Java 应用无缝集成以及开放性和热切换特性,能够大幅提升开发效率和性能。
|
18天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
31 0
WK
|
24天前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
42 0
下一篇
无影云桌面