当前位置: 首页 > news >正文

java GUI编程实现一个计算器

概述

闲来无事,利用java awt库写个简单的计算器玩玩。

实现

pom.xml

	<dependencies>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.26</version>
        </dependency>
    </dependencies>

com.lovehena.MyCalculator

package com.lovehena;

import cn.hutool.core.util.StrUtil;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MyCalculator {

    private static String firstNum;
    private static String operator;
    private static TextField textField;

    public static void main(String[] args) {

        // 1 构建窗口
        Frame frame = new Frame("计算器");
        frame.addWindowListener(new ExitWindowAdapter()); // 绑定窗口退出事件

        // 构建panel+textfield
        Panel p1 = new Panel();
        textField = new TextField(30);
        p1.add(textField);

        // 构建网格布局的panel 网格3行5列 每一格中都是按钮
        Panel p2 = new Panel();
        p2.setLayout(new GridLayout(4, 5, 10, 10));
        for (int i = 0; i < 10; i++) {
            Button btn = new Button(i + "");
            btn.addActionListener(new NumberActionListener());
            p2.add(btn);
        }

        initOperatorBtn(p2);
        // 2个 panel放入窗口中
        frame.add(p1, BorderLayout.NORTH); // frame默认是BorderLayout
        frame.add(p2, BorderLayout.CENTER);

        // 宽高自适应
        frame.pack();
        frame.setVisible(true);
    }

    /**
     * 向panel中添加 + - * / clear = 6个按钮 并绑定点击事件
     */
    private static void initOperatorBtn(Panel panel) {
        String[] otherBtns = {"clear", "="};
        String[] operators = {"+", "-", "*", "/"};
        //添加 clear = 2个按钮到panel中 并绑定点击事件
        for (int i = 0; i < otherBtns.length; i++) {
            Button btn = new Button(otherBtns[i]);
            if (otherBtns[i].equals("=")) {
                // = 号的点击事件
                btn.addActionListener(new EqualsActionListener());
            } else if (otherBtns[i].equals("clear")) {
                // 清空按钮点击逻辑
                btn.addActionListener(new ClearActionListener());
            }
            panel.add(btn);
        }
        // + - * / 4个按钮添加到panel中 并绑定点击事件
        for (int i = 0; i < operators.length; i++) {
            Button btn = new Button(operators[i]);
            btn.addActionListener(new OperatorActionListener(operators[i]));
            panel.add(btn);
        }
    }

    private static class NumberActionListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            textField.setText(textField.getText() + e.getActionCommand()); // e.getActionCommand()就是点击的数字
        }
    }

    private static class OperatorActionListener implements ActionListener {
        private String currentOperator;

        public OperatorActionListener(String currentOperator) {
            this.currentOperator = currentOperator;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            firstNum = textField.getText();
            operator = this.currentOperator;
            textField.setText("");
        }
    }

    private static class ClearActionListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            firstNum = "";
            operator = "";
            textField.setText("");
        }
    }

    private static class EqualsActionListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            // 获取第二个数字
            String secondNumber = textField.getText();
            if (StrUtil.isBlank(firstNum) || StrUtil.isBlank(secondNumber)) return;
            try {
                double num1 = Double.parseDouble(firstNum);
                double num2 = Double.parseDouble(secondNumber);
                double result = 0;

                // 根据操作符执行计算
                switch (operator) {
                    case "+":
                        result = num1 + num2;
                        break;
                    case "-":
                        result = num1 - num2;
                        break;
                    case "*":
                        result = num1 * num2;
                        break;
                    case "/":
                        result = num1 / num2;
                        break;
                    default:
                        textField.setText("未知操作符");
                        return;
                }

                // 显示结果
                textField.setText(String.valueOf(result));
            } catch (NumberFormatException ex) {
                textField.setText("输入错误");
            }

            // 重置状态
            firstNum = "";
            operator = "";
        }
    }

    private static class ExitWindowAdapter extends WindowAdapter {
        @Override
        public void windowClosing(WindowEvent e) {
            System.exit(0); // 点击打开的窗口的右上角的x号时退出
        }
    }
}

代码在这。
我就不过多讲解了,源码中写了些注释。
实现效果

最后

好了,如果对你有帮助,欢迎点个免费的赞哦。

相关文章:

  • 你对 Spring Cloud 的理解
  • 使用Python结合CoppeliaSim API来实现对UR5机械臂末端轨迹记录
  • 大模型RAG(检索增强)创新--SELF-RAG
  • Python运算符与表达式精讲:从基础到实战
  • 安科瑞基站能耗监控解决方案,全面监控、分析和优化基站能效
  • can数据记录仪在汽车路测中扮演着**关键角色*
  • VBco调控海马线粒体DNA甲基化
  • 山东大学计算机网络第一章习题解析
  • RealESRGAN技术详解(附代码)
  • DeepSeek 实用万能提问模板
  • 【多模态大模型】GLM-4-Voice端到端语音交互机器人VoiceAI
  • 网络安全学习中,web渗透的测试流程是怎样的?
  • 【数据挖掘】NumPy
  • SOME/IP 教程知识点总结
  • Tailwind CSS_现代 Web 开发的实用指南
  • 部署Flink1.20.1
  • 北京大学DeepSeek与AIGC应用(PDF无套路下载)
  • 面试JAVA集合常用方法总结
  • shell脚本编程练习
  • 基于python~疫情数据可视化分析系统~源码
  • 国家出口管制工作协调机制办公室部署开展打击战略矿产走私出口专项行动
  • 七大交响乐团“神仙斗法”,时代交响在上海奏出时代新声
  • 澎湃研究所“营商环境研究伙伴计划”启动
  • 南通市委常委、市委秘书长童剑跨市调任常州市委常委、组织部部长
  • 新华时评:任凭风云变幻,中俄关系从容前行
  • 过半中国上市公司去年都在“扩编”,哪些公司人效最高