【Java】Java使用Swing实现一个模拟计算器(有源码)

这篇具有很好参考价值的文章主要介绍了【Java】Java使用Swing实现一个模拟计算器(有源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Java】Java使用Swing实现一个模拟计算器(有源码),java,python,开发语言

  📝个人主页:哈__

期待您的关注 

【Java】Java使用Swing实现一个模拟计算器(有源码),java,python,开发语言

今天翻了翻之前写的代码,发现自己之前还写了一个计算器,今天把我之前写的代码分享出来。

【Java】Java使用Swing实现一个模拟计算器(有源码),java,python,开发语言

 我记得那会儿刚学不会写,写的乱七八糟,但拿来当期末作业还是不错的哈哈。

直接上源码,后上讲解。

一、源码

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;
import java.util.function.ToDoubleBiFunction;

public class MyCalculator  {
    private JFrame frame=new JFrame("CSDN--哈__");
    private String[] keys = {"%","C","CE","Back","1⁄x","X²","√x","÷","7","8","9",
            "X","4","5","6","-","1","2","3","+","+/-","0",".","="};//计算器的功能键保存
    private JButton [] buttons=new JButton[keys.length];//创建按钮
    private JTextField resultText=new JTextField("0");//结果保存用于在计算器上显示
    private double resultNum =0.0000;//用于保存运算的结果

    private boolean firstDigit=true;//判断是否是第一个输入的数字,或者是运算符后第一个数字
    private String operate ="=";//记录当前的运算符
    private boolean opearteValidFlag =true;//判断当前输入是否合法



    //构造函数
    public MyCalculator(){
        frame.setLocation(300,200);
        frame.setSize(new Dimension(366,439));
        frame.setVisible(true);
        frame.setResizable(true);//窗口大小可修改
        //这里采用awt组件来关闭窗口  事件监听
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosed(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    public void init(){
        //先定义三种颜色 用于背景板的填充  数值为网上查找
        Color c1=new Color(181,181,181);
        Color c2=new Color(126,192,238);
        Color c3=new Color(232,232,232);
        //计算器功能面板初始化
        JPanel pText =new JPanel();//用于保存文本域
        JPanel pKey =new JPanel();//用于保存功能按键
        //对文本域进行初始化
        pText.setLayout(new BorderLayout());
        pText.add(resultText);
        resultText.setFont(new Font("楷体",Font.BOLD,43));//设置文本框中字体的格式
        resultText.setHorizontalAlignment(JTextField.RIGHT);//文本框默认右对齐
        resultText.setEditable(false);//文本域不可编辑
        resultText.setBorder(null);//设置边框为无
        resultText.setBackground(c1);
        //对功能案件进行初始化
        pKey.setLayout(new GridLayout(6,4,2,2)); //六行四列,相邻两个按钮上下间隔均为两个像素
        //开始在按键区加入前八个功能键
        for (int i = 0; i < 8; i++) {
            buttons[i]=new JButton(keys[i]);
            pKey.add(buttons[i]);
            buttons[i].setBackground(c3);
            buttons[i].setForeground(Color.BLACK);
            buttons[i].setFont(new Font(Font.SERIF,Font.PLAIN,18));
            buttons[i].setBorderPainted(false);//设置无边框
            buttons[i].addActionListener(myActionListener);//添加监听器
        }
        for (int i = 8; i < keys.length; i++) {
            buttons[i]=new JButton(keys[i]);
            pKey.add(buttons[i]);
            if((i+1)%4==0)  buttons[i].setBackground(c3);
            else buttons[i].setBackground(Color.white);
            buttons[i].setForeground(Color.BLACK);
            buttons[i].setFont(new Font(Font.SERIF,Font.PLAIN,18));
            buttons[i].setBorderPainted(false);//设置无边框
            buttons[i].addActionListener(myActionListener);//添加监听器
        }
        //最后将=号的背景色改为蓝色,也就是c2
        buttons[keys.length-1].setBackground(c2);
        pKey.setBackground(c1);

        frame.add(pText,BorderLayout.NORTH);
        frame.add(pKey);
       /* pText.setBorder(BorderFactory.createMatteBorder(25,3,1,3,c1));
        pKey.setBorder(BorderFactory.createMatteBorder(6,3,3,3,c1));*/
    }
    public class MyActionListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            String key = e.getActionCommand();
            //对于具有清除删除功能按键的处理(CE C BACK)
            if(key.equals(keys[1])||key.equals(keys[2])||key.equals(keys[3])){
                doDeleteKey(key);
            }
            //对只需要一个数值的按键处理(% 1/x x² √x  +/-  )
            else if(key.equals(keys[0])||key.equals(keys[4])||key.equals(keys[5])||key.equals(keys[6])||
                    key.equals(keys[20])){
                doOperator1(key);

            }
            //对需要两个数值的按键的处理(÷ X - += )
            else if(key.equals(keys[7])||key.equals(keys[11])||key.equals(keys[15])||key.equals(keys[19])||
                    key.equals(keys[23])){
                doOperator2(key);
            }
            //对数字按键进行处理(1 2 3 4 5 6 7 8 9 .)
            else{
                doNumberKey(key);
            }
        }
    }
    private void doDeleteKey(String key){
        if(key.equals("CE")){
            resultText.setText("0");
        }
        else if(key.equals("C")){
            resultText.setText("0");
            resultNum=0.0000;
            firstDigit=true;
            opearteValidFlag=true;
            operate="=";
        }
        else{
            String text=resultText.getText();
            if(text.length()>1){
                resultText.setText(text.substring(0,text.length()-1)); //如果内容长度大于1,那么直接删掉最后一个字符
            }else{
                //内容长度等于1
                resultText.setText("0");
                firstDigit=true;
            }
        }
    }
    private void doOperator1(String key){
        //对只需要一个数值的按键处理(% 1/x x² √x  +/-  )
        operate=key;
        if(operate.equals("%")){
            resultNum=getNumFromText()/100;
        }
        else if(operate.equals("1⁄x")){
            if(getNumFromText()==0){
                //System.out.println("0没有倒数!");
                resultText.setText("零没有倒数!");
                opearteValidFlag=false;
            }else{
                resultNum=resultNum+1.0/getNumFromText();
            }
        }
        else if(operate.equals("√x")){
            if(getNumFromText()<0){
                //System.out.println("负数不能开方!");
                resultText.setText("负数不能开方!");
                opearteValidFlag=false;
            }else{
                resultNum=resultNum+Math.sqrt(getNumFromText());
            }
        }
        else if(operate.equals("X²")){

            resultNum=resultNum+getNumFromText()*getNumFromText();
        }
        else if(key.equals("+/-")){
            resultNum=-getNumFromText();
            firstDigit=true;
            opearteValidFlag=true;
        }
    }
    //两个数进行运算 ÷ X - + =
    private void doOperator2(String key){
        if(operate.equals("÷")){
            if(getNumFromText()==0){
                //System.out.println("零不能做除数!");
                resultText.setText("零不能做除数!");
                opearteValidFlag=false;
            }else{
                resultNum/=getNumFromText();
            }
        }
        else if(operate.equals("X")){
            resultNum*=getNumFromText();
        }
        else if(operate.equals("+")){
            resultNum+=getNumFromText();
        }
        else if(operate.equals("-")){
            resultNum-=getNumFromText();
        }
        else if(operate.equals("=")){
            resultNum=getNumFromText();
        }
        if(opearteValidFlag){
            long t1=(long)resultNum;
            double t2=resultNum-t1;
            if(t2==0){
                resultText.setText(String.valueOf(t1));
            }else{
                resultText.setText(String.valueOf(new DecimalFormat("0.0000").format(resultNum)));
            }
        }
        operate=key;
        firstDigit=true;
        opearteValidFlag=true;

    }
     private void doNumberKey(String key){
        //如果是第一个输入的数字或者符号后第一个数字
        if(firstDigit){
            if(key.equals(".")) /*resultText.setText(resultText.getText()+".");*/{
                //上来直接按.  
                if(resultNum==0&&operate=="=") resultText.setText(resultText.getText()+".");
                //上来先按了个别的运算符 在按.
                else{
                    resultText.setText("0.");
                   // resultText.setText("出错!");
                    //opearteValidFlag=false;
                }
            }
            else resultText.setText(key);
        }else if(key.equals(".")&&resultText.getText().indexOf(".")<0){
            resultText.setText(resultText.getText()+".");
        }else if(!key.equals(".")){
            resultText.setText(resultText.getText()+key);
        }
        firstDigit=false;
    }
   private double getNumFromText(){
       double result = 0;
       try {
           result = Double.valueOf(resultText.getText()).doubleValue();
       } catch (NumberFormatException e) {
       }
       return result;

    }
    MyActionListener myActionListener=new MyActionListener();
    public static void main(String[] args) {
        new MyCalculator().init();
    }
}

二、讲解

1、创建我们所需的变量

计算器上的按键不少,我们都定义在一个keys数组当中,并且初始化一个buttons按钮数组。

除了我们的按钮之外,还有我们的输出显示窗口resultText,输出的结果我们都用resultNum来记录,之后在放到我们的输出窗口上。

其他的都写成注解了。

private JFrame frame=new JFrame("CSDN--哈__");
    private String[] keys = {"%","C","CE","Back","1⁄x","X²","√x","÷","7","8","9",
            "X","4","5","6","-","1","2","3","+","+/-","0",".","="};//计算器的功能键保存
    private JButton [] buttons=new JButton[keys.length];//创建按钮
    private JTextField resultText=new JTextField("0");//结果保存用于在计算器上显示
    private double resultNum =0.0000;//用于保存运算的结果

    private boolean firstDigit=true;//判断是否是第一个输入的数字,或者是运算符后第一个数字
    private String operate ="=";//记录当前的运算符
    private boolean opearteValidFlag =true;//判断当前输入是否合法

2.面板初始化

面板初始化就是init方法,注释我都写了,这里不在讲了,也没啥重要的,就是美化一下面板。

3.添加按钮事件监听机制

当我们点击计算机上的按钮的时候,计算器要给出反馈,这时就需要我们添加一个事件监听机制了。注释写好了,当我们点击不同的按钮的时候要处理不同的功能。

 public class MyActionListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            String key = e.getActionCommand();
            //对于具有清除删除功能按键的处理(CE C BACK)
            if(key.equals(keys[1])||key.equals(keys[2])||key.equals(keys[3])){
                doDeleteKey(key);
            }
            //对只需要一个数值的按键处理(% 1/x x² √x  +/-  )
            else if(key.equals(keys[0])||key.equals(keys[4])||key.equals(keys[5])||key.equals(keys[6])||
                    key.equals(keys[20])){
                doOperator1(key);

            }
            //对需要两个数值的按键的处理(÷ X - += )
            else if(key.equals(keys[7])||key.equals(keys[11])||key.equals(keys[15])||key.equals(keys[19])||
                    key.equals(keys[23])){
                doOperator2(key);
            }
            //对数字按键进行处理(1 2 3 4 5 6 7 8 9 .)
            else{
                doNumberKey(key);
            }
        }
    }

4.处理对于具有清除删除功能按键的处理(CE C BACK)

计算器上有个清空按键C大家都用过吧,点了这个C之后我们所有的输入都会被初始化。倘若点了退格键那我们就把面板上的文字域删掉一个符号。比如我们输入的是111,点了退格之后就是11,当然你会想这只是文字域的变化,那我们保存的要计算的值为什么不变?别着急,真正开始计算是在我们点击了加减乘除这一类的符号的时候才会从面板读取值的。

 private void doDeleteKey(String key){
        if(key.equals("CE")){
            resultText.setText("0");
        }
        else if(key.equals("C")){
            resultText.setText("0");
            resultNum=0.0000;
            firstDigit=true;
            opearteValidFlag=true;
            operate="=";
        }
        else{
            String text=resultText.getText();
            if(text.length()>1){
                resultText.setText(text.substring(0,text.length()-1)); //如果内容长度大于1,那么直接删掉最后一个字符
            }else{
                //内容长度等于1
                resultText.setText("0");
                firstDigit=true;
            }
        }
    }

5.两个数进行运算加减乘除

上来先判断你当前的的符号是什么,并且也进行了一些错误情况的判断,如除数不能为0什么的。

下边你就能看到我们的resultNum被使用了。最后来个操作是否合法判断,如果合法并且输出结果最后是0那我们直接就把0输出到面板上,但是倘若我们的输出结果有精度差,那我们就得自己将0放到面板上了。

注:我使用的浮点数计算并不是BigDecimal,所以存在精度差。

private void doOperator2(String key){
        if(operate.equals("÷")){
            if(getNumFromText()==0){
                //System.out.println("零不能做除数!");
                resultText.setText("零不能做除数!");
                opearteValidFlag=false;
            }else{
                resultNum/=getNumFromText();
            }
        }
        else if(operate.equals("X")){
            resultNum*=getNumFromText();
        }
        else if(operate.equals("+")){
            resultNum+=getNumFromText();
        }
        else if(operate.equals("-")){
            resultNum-=getNumFromText();
        }
        else if(operate.equals("=")){
            resultNum=getNumFromText();
        }
        if(opearteValidFlag){
            long t1=(long)resultNum;
            double t2=resultNum-t1;
            if(t2==0){
                resultText.setText(String.valueOf(t1));
            }else{
                resultText.setText(String.valueOf(new DecimalFormat("0.0000").format(resultNum)));
            }
        }
        operate=key;
        firstDigit=true;
        opearteValidFlag=true;

    }

 剩下的大家自己研究吧。文章来源地址https://www.toymoban.com/news/detail-847748.html

到了这里,关于【Java】Java使用Swing实现一个模拟计算器(有源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java——一个简单的计算器程序

      该代码是一个简单的计算器程序,使用了Java的图形化界面库Swing。具体分析如下: 导入必要的类和包: 代码中导入了用于创建图形界面的类和接口,以及其他必要的类。 定义Calculator类: 代码中定义了一个名为Calculator的类,继承了JFrame类,并实现了ActionListener接口。Calc

    2024年02月04日
    浏览(21)
  • Java设计一个简单的计算器程序

    计算器是一种常见的工具,用于进行基本数学运算。在计算机科学中,我们可以使用编程语言来模拟和实现一个计算器程序。本文将基于Java语言,设计并实现一个简单的计算器程序。 1. 需求分析 在设计计算器程序之前,我们需要明确程序的需求。本文设计的计算器程序应满

    2024年02月05日
    浏览(23)
  • 用代码实现一个简单计算器

    作者主页: paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者: 大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于 《C语言》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将C语言基础知识一网打尽,希望可

    2024年02月08日
    浏览(18)
  • 【C++小项目】实现一个日期计算器

    目录 Ⅰ. 引入 Ⅱ. 列轮廓 Ⅲ. 功能的实现 构造函数 Print 判断是否相等 == | != ➡️==: ➡️!=: 判断大小 | = | | = ➡️: ➡️=: ➡️=: ➡️: 加减天数 + | += | - | -= ➡️+=: ➡️+: ➡️-: ➡️-=: 自增/自减 ++ | -- ➡️前置++ ➡️后置++ ➡️前置-- ➡️后置-- 日期减日期 ➡

    2024年02月11日
    浏览(21)
  • 使用 JavaScript 创建一个简单的计算器

    介绍: JavaScript 是一种广泛应用于网页开发的脚本语言,它具有灵活、动态和强大的特性。本文将演示如何使用 JavaScript 创建一个简单的计算器,并实现基本的加减乘除操作。 正文: javascript 解释: 以上代码是一个简单的 HTML 页面,其中包括两个输入框和四个按钮,用于实

    2024年02月03日
    浏览(28)
  • 使用C语言构造一个简单计算器

    本节我们用小学生知识来制作一个简单的计算器,可以运算加,减,乘,除,以及余数的运算。 在这节代码中用到switch语句,因为要输入运算符,所以注意%c的对应 接下来上代码: 这里的话我们简单演示一下乘法的运算: 如果用其他的计算符号直接更改即可,这里使用双精

    2024年02月12日
    浏览(25)
  • HTML和JavaScript实现一个简单的计算器

    使用HTML和JavaScript实现一个简单的计算器。 这段代码会在浏览器中创建一个标题为\\\"Simple Calculator\\\"的页面。页面顶部有一个 h1 元素,用于显示标题。计算器界面使用了CSS网格布局,将按钮排列为4列。 在JavaScript部分,定义了一些函数来处理计算器的操作。 appendCharacter() 函数用

    2024年02月13日
    浏览(22)
  • 用JavaScript和HTML实现一个精美的计算器

    计算器是我们日常生活中经常使用的工具之一,可以帮助我们进行简单的数学运算。在本博文中,我将使用JavaScript编写一个漂亮的计算器,并添加加减乘除功能。这个计算器将有一个精美的用户界面,包含9个数字按钮和加减乘除操作符。 HTML:负责构建界面 CSS:负责美化界

    2024年02月15日
    浏览(25)
  • 【Servlet学习三】实现一个内存版本的简易计算器~

    目录 一、方式1:使用form表单的形式(不推荐) 🌈1、前端代码:HTML文件 🌈2、后端代码:Calculator_form.java文件 🌈3、最终效果 二、方式2:使用ajax形式(最常用重点!!!) 🌈1、前端代码:HTML文件 🌈2、后端代码:Calculator_ajax.java文件 🌈3、最终效果  注意: (1)前端

    2024年02月12日
    浏览(19)
  • Java 实现计算器

    *使用Java语言编写一个能实现“加、减、乘、除”四则运算的计算器程序。* 要求: (1)在程序中要体现面向对象编程语言的三大特征:封装、继承和多态。 (2)该程序要易于扩展和复用。以后可以方便地增加新的运算;程序的业务逻辑与界面部分要实现分离,便于业务逻

    2024年02月12日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包