Java实现简单图形界面计算器

 更新时间:2022年04月26日 09:09:49   作者:Jivan2233  
这篇文章主要为大家详细介绍了Java实现简单图形界面计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前言

因为这两天我们的Java实验课程需要做两个小的图形化界面,其中就有一个图形界面的计算器,所以稍微花了点时间做了一个,同时复习了一下Java的基础内容和GUI编程。因为代码中的注释特别详细,所以这里就不讲解怎么实现的了。

代码

package zuoye;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Stack;

class MyException extends Exception{
    public MyException() {
        super();
    }
    public MyException(String message) {
        super(message);
    }
}

public class MyCalculator extends JFrame{
    /*
     * 
     */

    private JTextField textField;    //输入文本框
    private String input;      //结果
    private String operator;    //操作符

    public MyCalculator() {
        input = "";
        operator = "";

        JPanel panel = new JPanel();
        textField = new JTextField(30);
        textField.setEditable(false);                       //文本框禁止编辑
        textField.setHorizontalAlignment(JTextField.LEFT);
        //textField.setBounds(100, 100, 20, 20);            //在容器布局为空情况下生效
        textField.setPreferredSize(new Dimension(200,30));//设置该组件的初始大小

        //将textField加入本JFrame中,布局为边界布局,位置为north
        this.add(textField, BorderLayout.NORTH);

        String[] name= {"7","8","9","+","4","5","6","-","1","2","3","*","0","C","=","/"};

        //将这个panel的布局设置为网格布局,有四行四列,行间距和列间距为1
        panel.setLayout(new GridLayout(4,4,1,1));

        for(int i=0;i<name.length;i++) {

            JButton button = new JButton(name[i]);

            //设置按钮的时间监听
            button.addActionListener(new MyActionListener());
            //将按钮加入到panel中
            panel.add(button);
        }
        //将panel加入到本JFrame中,布局为边界布局,位置为centre
        this.add(panel,BorderLayout.CENTER);
    }

    class MyActionListener implements ActionListener{   //内部类实现按钮响应

        @Override
        public void actionPerformed(ActionEvent e) {
            int cnt=0;
            String actionCommand = e.getActionCommand();   //获取按钮上的字符串
            if(actionCommand.equals("+") || actionCommand.equals("-") || actionCommand.equals("*")
                || actionCommand.equals("/")) {
                input += " " + actionCommand + " ";
            }
            else if(actionCommand.equals("C")) {   //清除输入
                input = "";
            }
            else if(actionCommand.equals("=")) {   //按下等号
                try {
                    input+= "="+calculate(input);
                } catch (MyException e1) {
                    if(e1.getMessage().equals("被除数不能为0"))
                        input = e1.getMessage();
                    else
                        input = e1.getMessage();
                }
                textField.setText(input);
                input="";
                cnt = 1;
            }
            else
                input += actionCommand;     //按下数字

            //因为如果不按“=”按钮cnt一直未0,所以可以保证显示输入的数字和操作键
            if(cnt == 0)
                textField.setText(input);
        }
    }
    //这里需要借助栈来完成表达式的计算,首先将字符串分割成字符串数组,
    //由中缀的定义知数组奇数位为运算符(从第0位开始),偶数位为操作数,
    // 因此可将偶数为操作数进栈,遇见+(-)运算符,则将下一个数以正(负)的形式压人栈中,
    // 遇见*或/运算符,则将栈顶元素出栈与数组后一元素进行计算,并将其结果重新压入栈中,
    // 直至遍历至数组最后一个元素。

    private String calculate(String input) throws MyException{    //计算函数
        String[] comput = input.split(" ");
        //System.out.println(input);
        Stack<Double> stack = new Stack<>();
        Double m = Double.parseDouble(comput[0]);
        stack.push(m);       //第一个操作数入栈

        for(int i = 1; i < comput.length; i++) {
            if(i%2==1) {
                if(comput[i].equals("+"))
                    stack.push(Double.parseDouble(comput[i+1]));
                if(comput[i].equals("-"))
                    stack.push(-Double.parseDouble(comput[i+1]));
                if(comput[i].equals("*")) {   //将前一个数出栈做乘法再入栈
                    Double d = stack.peek();   //取栈顶元素
                    stack.pop();
                    stack.push(d*Double.parseDouble(comput[i+1]));
                }
                if(comput[i].equals("/")) {   //将前一个数出栈做乘法再入栈
                    double help = Double.parseDouble(comput[i+1]);
                    if(help == 0)
                        throw new MyException("被除数不能为0");    //不会继续执行该函数
                    double d = stack.peek();
                    stack.pop();
                    stack.push(d/help);
                }
            }
        }

        double d = 0d;

        while(!stack.isEmpty()) {   //求和
            d += stack.peek();
            stack.pop();
        }

        String result = String.valueOf(d);
        return result;
    }

    public static void main(String[] args) {
        JFrame f = new MyCalculator();
        f.setTitle(f.getClass().getSimpleName());
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setBounds(400, 200, 500, 300);
        f.setVisible(true);
    }
}

实现效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • java的三种IO模型详解(BIO、NIO、AIO)

    java的三种IO模型详解(BIO、NIO、AIO)

    本文介绍了BIO、NIO和AIO三种不同的IO模型,分别分析了它们的工作机制、实现方式以及与BIO的对比,BIO是阻塞的,每个连接需要一个线程;NIO是同步非阻塞的,通过缓冲区和选择器实现I/O多路复用;AIO是异步的,操作系统处理IO操作,完成后通知应用程序
    2024-11-11
  • Mybatis流式查询并实现将结果分批写入文件

    Mybatis流式查询并实现将结果分批写入文件

    这篇文章主要介绍了Mybatis流式查询并实现将结果分批写入文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Java中stream是什么及如何使用

    Java中stream是什么及如何使用

    在Java中,Stream(流)是一种用于操作集合(Collection)、数组等数据源的API,Stream的主要作用是进行数据的转换、筛选、聚合等操作,可以极大地简化对数据的处理,本文给大家介绍Java中stream是什么?有什么作用?如何使用?感兴趣的朋友一起看看吧
    2023-10-10
  • SpringBoot自定义注解解决公共字段填充问题解决

    SpringBoot自定义注解解决公共字段填充问题解决

    修改时间,修改人等字段时,这些字段属于公共字段,本文主要介绍了SpringBoot自定义注解解决公共字段填充问题解决,使用它的好处就是可以统一对这些字段进行处理,感兴趣的可以了解一下
    2024-07-07
  • 详解Java的Spring框架下bean的自动装载方式

    详解Java的Spring框架下bean的自动装载方式

    这篇文章主要介绍了Java的Spring框架下bean的自动装载方式,Spring是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12
  • Spring中Bean注入源码示例解析

    Spring中Bean注入源码示例解析

    这篇文章主要为大家介绍了Spring中Bean注入源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • QueryWrapper中or的使用技巧分享

    QueryWrapper中or的使用技巧分享

    在日常的开发工作中,处理数据库查询是一个非常常见的任务,尤其是当我们需要在复杂条件下筛选数据时,如何编写高效、简洁且可维护的查询逻辑显得尤为重要,本文给大家介绍了QueryWrapper中or的使用技巧,需要的朋友可以参考下
    2024-10-10
  • MyBatis中#{}和${}有哪些区别

    MyBatis中#{}和${}有哪些区别

    大家好,本篇文章主要讲的是MyBatis中#{}和${}区别,感兴趣的同学赶快来看一看,对你有帮助的话记得收藏一下,方向下次浏览
    2021-12-12
  • ReentrantReadWriteLock不能锁升级的原因总结

    ReentrantReadWriteLock不能锁升级的原因总结

    今天给大家带来的是关于Java并发的相关知识,文章围绕着为什么ReentrantReadWriteLock不能锁升级展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • spring boot集成mongodb的增删改查的示例代码

    spring boot集成mongodb的增删改查的示例代码

    这篇文章主要介绍了spring boot集成mongodb的增删改查的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论