简易计算器-课后程序(JAVA基础案例教程-黑马程序员编著-第十一章-课后作业)

news/2024/4/19 14:12:44/文章来源:https://blog.csdn.net/yw1990128/article/details/129276203

【案例11-2】 简易计算器

【案例介绍】

1.案例描述

本案例要求利用Java Swing 图形组件开发一个可以进行简单的四则运算的图形化计算器。

2.运行结果

运行结果

 

【案例分析】

要制作一个计算器,首先要知道它由哪些部分组成,如下图所示:

一个简单的图形化界面计算器,需要由界面组件、组件的时间监听器和具体的事件处理逻辑组成。

实现一个简易图形化界面计算器可分以下几个步骤:

1.UI组件创建和初始化:包括窗体的创建,显示计算结果文本框、清除按钮、数字按钮、运算符等按钮的初始化。

2.在窗体中添加UI组件:包括放置数字键及运算符面板、放置清除框面板。

3.布局结束之后,就是计算器的难点:编写事件处理程序。

4.按键的响应实现。

5.计算逻辑的实现。

6.注册监听器

【案例实现】

Calculator.java

  1. package chapter1102;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import javax.swing.*;
  5. import java.util.Vector;
  6. import java.math.BigDecimal;
  7. public class Calculator {
  8.           // 操作数1,为了程序的安全,初值一定设置,这里我们设置为0
  9.           String str1 = "0";
  10.          // 操作数2
  11.      String str2 = "0";
  12.      // 运算符
  13.     String signal = "+";  
  14.      // 运算结果
  15.     String result = "";
  16.      // 以下k1k5为状态开关
  17.      // 开关1用于选择输入方向,将要写入str1str2
  18.      // 1 时写入 str1,为 2 时写入 str2
  19.     int k1 = 1;
  20.     // 开关 2 用于记录符号键的次数
  21.      // 如果 k2>1 说明进行的是 2+3-9+8 这样的多符号运算
  22.     int k2 = 1;
  23.      // 开关3用于标识 str1 是否可以被清 0
  24.      // 等于 1 时可以,不等于1时不能被清0
  25.     int k3 = 1;
  26.      // 开关4用于标识 str2 是否可以被清 0
  27.      // 等于 1 时可以,不等于1时不能被清0
  28.     int k4 = 1;
  29.      // 开关5用于控制小数点可否被录入
  30.      // 等于1时可以,不为1时,输入的小数点被丢掉
  31.     int k5 = 1;
  32.      // store的作用类似于寄存器,用于记录是否连续按下符号键
  33.     JButton store;
  34.      //vt 存储之前输入的运算符。
  35.     @SuppressWarnings("rawtypes")
  36.     Vector vt = new Vector(20, 10);
  37.      // 创建一个 JFrame 对象并初始化。JFrame 可以理解为程序的主窗体。  
  38.      JFrame frame = new JFrame("Calculator");
  39.  //创建一个JTextField对象并初始化。JTextField用于显示操作和计算结果的文本框。
  40.      // 参数 20 表明可以显示 20 列的文本内容
  41.     JTextField result_TextField = new JTextField(result, 20);
  42.      // 清除按钮
  43.     JButton clear_Button = new JButton("Clear");
  44.      // 数字键09
  45.     JButton button0 = new JButton("0");
  46.     JButton button1 = new JButton("1");
  47.     JButton button2 = new JButton("2");
  48.     JButton button3 = new JButton("3");
  49.     JButton button4 = new JButton("4");
  50.     JButton button5 = new JButton("5");
  51.     JButton button6 = new JButton("6");
  52.     JButton button7 = new JButton("7");
  53.     JButton button8 = new JButton("8");
  54.     JButton button9 = new JButton("9");
  55.      // 计算命令按钮,加减乘除以及小数点等
  56.     JButton button_Dian = new JButton(".");
  57.     JButton button_jia = new JButton("+");
  58.     JButton button_jian = new JButton("-");
  59.     JButton button_cheng = new JButton("*");
  60.     JButton button_chu = new JButton("/");
  61.     JButton button_dy = new JButton("=");
  62.     public Calculator() {
  63.         button0.setMnemonic(KeyEvent.VK_0);
  64.     result_TextField.setHorizontalAlignment(JTextField.RIGHT);
  65.         // 创建一个 Jpanel 对象并初始化
  66.          JPanel pan = new JPanel();
  67.          // 设置该容器的布局为四行四列,边距为5像素
  68.         pan.setLayout(new GridLayout(4, 4, 5, 5));
  69.          // 将用于计算的按钮添加到容器内
  70.         pan.add(button7);
  71.         pan.add(button8);
  72.         pan.add(button9);
  73.         pan.add(button_chu);
  74.         pan.add(button4);
  75.         pan.add(button5);
  76.         pan.add(button6);
  77.         pan.add(button_cheng);
  78.         pan.add(button1);
  79.         pan.add(button2);
  80.         pan.add(button3);
  81.         pan.add(button_jian);
  82.         pan.add(button0);
  83.         pan.add(button_Dian);
  84.         pan.add(button_dy);
  85.         pan.add(button_jia);
  86.          // 设置 pan 对象的边距
  87.         pan.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
  88.          // 按照同样的方式设置第二个JPanel
  89.         JPanel pan2 = new JPanel();
  90.         pan2.setLayout(new BorderLayout());
  91.         pan2.add(result_TextField, BorderLayout.WEST);
  92.         pan2.add(clear_Button, BorderLayout.EAST);
  93.           // 设置主窗口出现在屏幕上的位置
  94.         frame.setLocation(300, 200);
  95.          // 设置窗体可以调大小
  96.         frame.setResizable(true);
  97.          //窗体中可以放置 JPanel,这里我们将面板pan和面板pan2让如窗体
  98.         frame.getContentPane().setLayout(new BorderLayout());
  99.         frame.getContentPane().add(pan2, BorderLayout.NORTH);
  100.         frame.getContentPane().add(pan, BorderLayout.CENTER);
  101.         frame.pack();
  102.         frame.setVisible(true);
  103.          //Listener类中编写的是数字键的响应逻辑。
  104.         class Listener implements ActionListener {
  105.            @SuppressWarnings("unchecked")
  106.            public void actionPerformed(ActionEvent e) {
  107.                String ss = ((JButton) e.getSource()).getText();
  108.                store = (JButton) e.getSource();
  109.                vt.add(store);
  110.                if (k1 == 1) {
  111.                    if (k3 == 1) {
  112.                        str1 = "";
  113.                        k5 = 1;
  114.                    }
  115.                    str1 = str1 + ss;
  116.                    k3 = k3 + 1;
  117.                    result_TextField.setText(str1);
  118.                } else if (k1 == 2) {
  119.                    if (k4 == 1) {
  120.                        str2 = "";
  121.                        k5 = 1;
  122.                }
  123.                    str2 = str2 + ss;
  124.                    k4 = k4 + 1;
  125.                    result_TextField.setText(str2);
  126.                }                              
  127.            }
  128.         }
  129.           //Listener_signal类中编写了运算符号键的响应逻辑
  130.         class Listener_signal implements ActionListener {
  131.            @SuppressWarnings("unchecked")
  132.            public void actionPerformed(ActionEvent e) {
  133.                String ss2 = ((JButton) e.getSource()).getText();
  134.                store = (JButton) e.getSource();
  135.                vt.add(store);
  136.                if (k2 == 1) {
  137.                    k1 = 2;
  138.                    k5 = 1;
  139.                    signal = ss2;
  140.                    k2 = k2 + 1;
  141.                } else {
  142.                    int a = vt.size();
  143.                    JButton c = (JButton) vt.get(a - 2);
  144.                    if (!(c.getText().equals("+"))
  145.                            && !(c.getText().equals("-"))
  146.                            && !(c.getText().equals("*"))
  147.                            && !(c.getText().equals("/")))
  148.                    {
  149.                        cal();
  150.                        str1 = result;
  151.                        k1 = 2;
  152.                        k5 = 1;
  153.                        k4 = 1;
  154.                        signal = ss2;
  155.                    }
  156.                    k2 = k2 + 1;
  157.                }
  158.            }
  159.         }
  160.      //Listener_clear类中编写了清除键的响应逻辑
  161.     class Listener_clear implements ActionListener {
  162.            @SuppressWarnings("unchecked")
  163.            public void actionPerformed(ActionEvent e) {
  164.                store = (JButton) e.getSource();
  165.                vt.add(store);
  166.                k5 = 1;
  167.                k2 = 1;
  168.                k1 = 1;
  169.                k3 = 1;
  170.                k4 = 1;
  171.                str1 = "0";
  172.                str2 = "0";
  173.                signal = "";
  174.                result = "";
  175.                result_TextField.setText(result);
  176.                vt.clear();
  177.            }
  178.         }
  179.      //Listener_dy类中编写的是等于号键的响应逻辑
  180.     class Listener_dy implements ActionListener {
  181.            @SuppressWarnings("unchecked")
  182.            public void actionPerformed(ActionEvent e) {
  183.                store = (JButton) e.getSource();
  184.                vt.add(store);
  185.                cal();
  186.                k1 = 1;
  187.                k2 = 1;
  188.                k3 = 1;
  189.                k4 = 1;
  190.                str1 = result;
  191.            }
  192.         }
  193. //Listener_xiaos类中编写的是小数点键的相应逻辑
  194. class Listener_xiaos implements ActionListener {
  195.            @SuppressWarnings("unchecked")
  196.            public void actionPerformed(ActionEvent e) {
  197.                store = (JButton) e.getSource();
  198.                vt.add(store);
  199.                if (k5 == 1) {
  200.                    String ss2 = ((JButton) e.getSource()).getText();
  201.                    if (k1 == 1) {
  202.                        if (k3 == 1) {
  203.                            str1 = "";
  204.                            k5 = 1;
  205.                        }
  206.                        str1 = str1 + ss2;
  207.                        k3 = k3 + 1;
  208.                        result_TextField.setText(str1);
  209.                    } else if (k1 == 2) {
  210.                        if (k4 == 1) {
  211.                            str2 = "";
  212.                            k5 = 1;
  213.                        }
  214.                        str2 = str2 + ss2;
  215.                        k4 = k4 + 1;
  216.                        result_TextField.setText(str2);
  217.                    }
  218.                }
  219.                k5 = k5 + 1;
  220.            }
  221.         }
  222.           // 监听等于键
  223.         Listener_dy jt_dy = new Listener_dy();
  224.          // 监听数字键
  225.         Listener jt = new Listener();
  226.          // 监听符号键
  227.         Listener_signal jt_signal = new Listener_signal();
  228.          // 监听清除键
  229.         Listener_clear jt_c = new Listener_clear();
  230.          // 监听小数点键
  231.         Listener_xiaos jt_xs = new Listener_xiaos();
  232.         button7.addActionListener(jt);
  233.         button8.addActionListener(jt);
  234.         button9.addActionListener(jt);
  235.         button_chu.addActionListener(jt_signal);
  236.         button4.addActionListener(jt);
  237.         button5.addActionListener(jt);
  238.         button6.addActionListener(jt);
  239.         button_cheng.addActionListener(jt_signal);
  240.         button1.addActionListener(jt);
  241.         button2.addActionListener(jt);
  242.         button3.addActionListener(jt);
  243.         button_jian.addActionListener(jt_signal);
  244.         button0.addActionListener(jt);
  245.         button_Dian.addActionListener(jt_xs);
  246.         button_dy.addActionListener(jt_dy);
  247.         button_jia.addActionListener(jt_signal);
  248.         clear_Button.addActionListener(jt_c);
  249.           // 窗体关闭事件的响应程序
  250.         frame.addWindowListener(new WindowAdapter() {
  251.            public void windowClosing(WindowEvent e) {
  252.                System.exit(0);
  253.            }
  254.         });
  255.     }
  256.      // calc()方法中编写了计算逻辑的实现。
  257.     public void cal() {
  258.         double a2;
  259.         double b2;
  260.         String c = signal;
  261.         double result2 = 0;
  262.         if (c.equals("")) {
  263.            result_TextField.setText("Please input operator");
  264.         } else {
  265.            if (str1.equals("."))
  266.                str1 = "0.0";
  267.            if (str2.equals("."))
  268.                str2 = "0.0";
  269.            a2 = Double.valueOf(str1).doubleValue();
  270.            b2 = Double.valueOf(str2).doubleValue();
  271.            if (c.equals("+")) {
  272.                result2 = a2 + b2;
  273.            }
  274.            if (c.equals("-")) {
  275.                result2 = a2 - b2;
  276.            }
  277.            if (c.equals("*")) {
  278.                BigDecimal m1 = new BigDecimal(Double.toString(a2));
  279.                    BigDecimal m2 = new
  280.                                     BigDecimal(Double.toString(b2));
  281.                    result2 = m1.multiply(m2).doubleValue();
  282.            }
  283.            if (c.equals("/")) {
  284.                if (b2 == 0) {
  285.                    result2 = 0;
  286.                } else {
  287.                    result2 = a2 / b2;
  288.                }
  289.            }
  290.            result = ((new Double(result2)).toString());
  291.            result_TextField.setText(result);
  292.         }
  293.     }
  294.     @SuppressWarnings("unused")
  295.     public static void main(String[] args) {
  296.     try {  
  297.  //通过 UIManager 来设置窗体的 UI 风格
  298.  UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
  299.         } catch (Exception e) {
  300.            e.printStackTrace();
  301.         }
  302.         Calculator cal = new Calculator();
  303.     }
  304. }

上述代码中,第7-32行代码,定义了一些成员变量,方便响应的逻辑实现。第34-35行代码,创建了一个Vector对象,存储之前输入的运算符。第37行代码,创建了一个 JFrame 对象并初始化。JFrame 可以理解为程序的主窗体。第40行代码,创建了一个JTextField对象并初始化。JTextField用于显示操作和计算结果的文本框。参数 20 表明可以显示 20 列的文本内容。第42行代码,创建了一个清除按钮对象。第44-53行,创建数字键0-9按钮对象。第55-60行,创建计算命令按钮,加减乘除以及小数点等按钮对象。第65-101行代码,是对计算器进行布局。Listener类中编写的是数字键的响应逻辑。Listener_xiaos类中编写的是小数点键的相应逻辑。Listener_signal类中编写了运算符号键的响应逻辑。Listener_dy类中编写的是等于号键的响应逻辑。Listener_clear类中编写了清除键的响应逻辑。calc()方法中编写了计算逻辑的实现。第222-247行代码,创建监听对象,斌对各个按键进行监听。第249-253行代码,为窗体关闭事件的响应程序。第297行代码,通过 UIManager 来设置窗体的 UI 风格。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【原创】java+swing+mysql校园订餐管理系统设计与实现

校园订餐管理系统,主要是为了方便广大学生点餐使用,以往的大多数的校园订餐系统基本使用bs架构,也就是网页系统,但是我们今天不用javaweb,我们主要介绍javaswing同样可以去实现一个校园订餐管理系统。 功能分析&#…

「TCG 规范解读」规范结构

可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alli…

软测入门(一)测试理念及基础知识

软测入门理念 软件的分类 按层次划分:系统软件、应用软件按组织划分:商业软件、开源软件按结构划分:单机软件、 软件缺陷 由来 Grace Hopper发明Cobol计算机语言,也是找出电脑程序中第一个bug的女程序员 BugDefect 定义 软…

带你掌握webSocket 和 socket.io的基本用法

两者的作用和区别 作用:使得前后端可以随时地相互沟通。什么是互相沟通呢?像网络请求这种就是客户端向服务端的单向的沟通,当然,网络请求也可以实现双向的沟通,比如ajax 轮询,就是浏览器开个定时器不断的发…

【Java】Java进阶学习笔记(四)—— 抽象类与接口

【Java】Java进阶学习笔记(四)—— 抽象类与接口一、抽象类1、抽象类的概念抽象类的定义格式2、抽象类的注意点抽象方法的介绍3、抽象类的具体作用4、抽象类实例二、接口(一)、接口的概念1、接口与类的区别2、接口特性3、抽象类和…

如何实现云原生?推荐的几个实用工具

云原生是一种软件开发和部署的方法,它依赖于容器、微服务和自动化运维。它能使应用更高效、可靠和可扩展,并适用于不同的云平台。 如果要更直接、更通俗地解释上述概念的话。 云的本源更准确地说是一种文化,一种潮流,它必然是云…

此网站可能不支持TLS1.2协议

问题描述 火狐浏览器版本:“97.0.1 (64 位)”,打开360网神设备Web管理地址时出现:“此网站可能不支持TLS1.2协议,而这是Firefox支持的最低版本。”,如下图所示。 原本是默认使用https协议打开的,看起来出问…

蓝桥杯每日一题:不同路径数(dfs深度优先)

给定一个 nm的二维矩阵,其中的每个元素都是一个 [1,9] 之间的正整数。 从矩阵中的任意位置出发,每次可以沿上下左右四个方向前进一步,走过的位置可以重复走。 走了 k 次后,经过的元素会构成一个 (k1) 位数。 请求出一共可以走出…

零基础机器学习做游戏辅助第十五课--原神自动钓鱼(五)完整效果

一、先上效果二、整理思路我们现在已经具备了所有需要的技术,我们梳理出所有技术的流程。判断当前钓鱼状态(未抛竿、已抛竿、上鱼中)。未抛竿,截图并识别图中所有鱼类,选择其中一个种类。根据以选择鱼类选择对应鱼饵。…

从一个实例配置引入Prometheus的PromQL语法

1. PromQL介绍 PromQL提供对时间序列数据进行逻辑运算、过滤、聚合的支持。应用于数据查询、可视化、告警处理 2. 基本用法 2.1 查询时间序列 点击Prometheus图标,进行查询页面。可以点击地图图标查看有哪些metrics name。输入要查询的metrics name和过滤条件,然后点击执行…

2023年功能测试还值得入行吗?

前言 鉴于笔者从13年入行IT行业,经历了只有开发没有测试的阶段,经历了14年只要会基本的功能测试在一线就能薪资过万的阶段,经历了17年只要会一点自动化,会一点性能就能蒙骗过面试官的阶段,更经历了19年所有面试官对于…

基于大规模边缘计算的千万级聊天室技术实践

当前直播成为一种流行趋势,带货直播,网红带货,明星在线演唱会等,进一步使得直播聊天室变成了一个当前必备的能力,面向大型,超大型的直播场景,技术上也在不断的进行迭代更新。 大规模边缘聊天室如…

如何或者无插件Web页面监控播放软件LiveNVR的固定视频流地址,实现大屏上墙、播放、视频分析等目的

1、LiveNVR介绍 LiveNVR的安防监控的视频直播,可以按标准的Onvif/RTSP协议接入监控设备,也可以通过海康、大华、天地伟业等厂家私有SDK接入监控,实现web页面的播放和录像回放。 可以分发HTTP-FLV、WS-FLV、WebRTC、RTMP、HLS(M3U8)、RTSP等多…

全球化趋势下,如何建设稳定高效的技术能力?

如果将全球化比作一场航行,每个期望走出去的企业都是水手,那么是造一艘属于自己的船,还是搭乘已有的船呢?在不同的时间和场景下,相信每个水手都有自己的答案。 近几年,在国际政经环境复杂变幻的形势之下&am…

ImportError: Can not find the shared library: libhdfs3.so解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

活动回顾|中文社区面对面·上海站

回顾来了! 「中文社区面对面」首次线下交流活动,于 2 月 26 日下午在上海德必世纪 WE 成功举办,迎来了 30 位上海小伙伴的热情参与!Jina AI 高级算法工程师王峰博士与大家分享 Jina AI 的“三驾马车”,百万粉丝B站效率…

4.文件管理

文章目录1、初识文件管理1.1、回顾1.2、文件的属性1.3、无结构文件/有结构文件1.4、文件之间应该怎样组织起来?1.5、操作系统应该向上提供哪些功能?1.6、从上往下看,文件应如何存放在外存?1.7、其他需要由操作系统实现的文件管理功…

【蓝桥杯嵌入式】点亮LED灯,流水灯的原理图解析与代码实现——STM32

🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 - 蓝…

实践数据湖iceberg 第四十二课(业界视野)业界的流批一体架构

系列文章目录 实践数据湖iceberg 第一课 入门 实践数据湖iceberg 第二课 iceberg基于hadoop的底层数据格式 实践数据湖iceberg 第三课 在sqlclient中,以sql方式从kafka读数据到iceberg 实践数据湖iceberg 第四课 在sqlclient中,以sql方式从kafka读数据到…

React(三):脚手架、组件化、生命周期、父子组件通信、插槽、Context

React(三)一、脚手架安装和创建1.安装脚手架2.创建脚手架3.看看脚手架目录4.运行脚手架二、脚手架下从0开始写代码三、组件化1.类组件2.函数组件四、React的生命周期1.认识生命周期2.图解生命周期(1)Constructor(2&…