当前位置:

首页 > 编程开发 > java gui怎么实现计算器小程序

java gui怎么实现计算器小程序

Guitar Pro 7专业版
Guitar Pro 7专业版

一套多音轨的音谱编辑软件,能够供吉他、五弦琴、以及贝斯所使用,是现时网络一个常用的软件,几乎每个吉他网站所提供的吉他谱都有GTP格式。

立即下载
¥199
2026-08-22
图形多媒体 音频工具 Guitar Pro 本月促销
本文目录

    效果图:代码:packagegui;/***导入所需要的包**/importjava.awt.*;//这个是java的gui编程里面一个很重要的包importjava.awt.event.*;//用来处理事件所需要importjava.util.Stack;//栈,我用来处理运算的publicclassCalculatorextendsFrameimplementsActionListener{/***先声明一个公共类叫Calculator,继承自Frame类,实现ActionListener接口功能**

    效果图 :

    java gui怎么实现计算器小程序

    代码:

    package gui;
     
     
    /**
     * 导入所需要的包
     **/
    import java.awt.*;      //  这个是java的gui编程里面一个很重要的包
    import java.awt.event.*;      //  用来处理事件所需要
    import java.util.Stack;        //  栈 , 我用来处理运算的
     
     
    public class Calculator extends Frame implements ActionListener{
        /**  
         * 先声明一个公共类叫Calculator , 继承自Frame类 , 实现ActionListener接口功能  
         **/
        
     
     private static final long serialVersionUID = 1L;  // 这个是用来控制版本的序列化  
     int frame_width = 1000,frame_height = 400;  //设置整个框架的长宽 
     Panel panel_textfield,panel_number,panel_op,panel_other;  // 整个计算器布局我把它分成两个面板 , 一个是上面的输入框区 , 一个是下面的按钮区 , 然后按钮区又分成了左边和右边两个区 , 所以有三个panel  
     Button [] number_buttons;  // 声明数字按钮(也就是上面说的左边区)  
     Button [] op_buttons;      // 声明操作符按钮(也就是上面说的右边区)  
     TextField textfield;        // 输入框  
     
            public Calculator() {
      super("计算器");    // 完成实例域参数的初始化,调用构造器的语句只能作为另一个构造器(通常指的是子类构造器)的第一条语句出现  
      init();       // 自己写的初始化方法  
      setLayout();   // 设置布局管理方式 
      setBackground();       // 设置背景 
      setBounds();         // 设置位置  
      setFonts();          // 设置字体 
      addButtons();      // 添加按钮
      textfield.setEditable(false);    // 设置输入框为不可手动编辑 , 只能通过按钮输入  */
      addWindowListener  // 添加一个窗口监听器,便于按下关闭按钮时能关闭窗口 , 否则只能在ide里面停止调试来关闭程序
            (
                new WindowAdapter() {
                    public void windowClosing(WindowEvent e) {
                        System.exit(0);
                    }
                }
            );
      setVisible(true);   // 设置框架为可见,不然画了框你也看不见...一定要放在最后面,放在前面的话,
    后面对窗体有改动得缩放拉伸一下窗体进行窗体重绘才能出现效果 , 我在这里卡了很久.... 
      
     }
     
            public void init() {      
      panel_textfield = new Panel();         // 实例化一个panel 
      panel_number = new Panel();            // 实例化一个panel 
      panel_op = new Panel();                // 实例化一个panel 
      panel_other = new Panel();             // 实例化一个panel  
      textfield = new TextField(frame_width);// 实例化一个文本输入框  
      setResizable(false);                   // 设置整个窗体为不可缩放拉伸  
      
      add(panel_textfield);                 // 往窗体中添加输入框面板 
      add(panel_other);                     // 往窗体中添加按钮面板  
      
      panel_textfield.add(textfield);       // 在输入框面板中添加输入框  
      panel_other.add(panel_number);        // 在下面面板中添加数字按钮面板  
      panel_other.add(panel_op);            // 在下面面板中添加操作符按钮面板  
     }
     
    
    public void setLayout() {
      setLayout(new GridLayout(2,1,4,4));       // 设置窗体布局方式为网格布局,2*1的网格,网格之间间距为4个像素  
      panel_textfield.setLayout(null);       // 输入框面板就一个组件,所以设置null  
      panel_other.setLayout(new GridLayout(1,2,4,4));  // 下面面板因为分成左边的数字区和右边的操作符区,所以设置1*2的网格布局方式,间距4个像素  
      panel_number.setLayout(new GridLayout(5,3,4,4));  //  数字区布局设置为5*3的网格布局  
      panel_op.setLayout(new GridLayout(3,1,4,4));  // 操作符区设置为3*1的网格布局方式  
     }
     
     
            public void setBackground() {  // 设置背景,没什么好说的....
      panel_textfield.setBackground(Color.red);  
      panel_number.setBackground(Color.green);
      panel_op.setBackground(Color.blue);
     }
     
     
            public void setBounds() {   // 设置组件位置,没什么好说的.... 
      setBounds(0, 0, frame_width, frame_height);
      textfield.setBounds(0, 0, frame_width, frame_height / 2);
     }
     
     
            public void addButtons() {
      String [] titles1 = {"/", "*", "-",   // 数字区按钮的label值 
           "7", "8", "9",
           "4", "5", "6",
           "1", "2", "3",
           "0", ".", "c"};
      String [] titles2 = {"x", "+", "="};   // 操作符区按钮的label值  
      number_buttons = new Button[15];   // 申请15个按钮对象  
      op_buttons = new Button[3];        // 申请3个按钮对象  
      
      for(int i = 0; i < this.number_buttons.length; i++) {
       number_buttons[i] = new Button(titles1[i]);
       panel_number.add(number_buttons[i]);  //  往数字区中添加按钮  
       number_buttons[i].addActionListener(this);  // 按钮的事件监听器,处理方法为this,也就是下面重载的actionPerformed()方法,这个方法必须被重载
      }
      
      for(int i = 0; i < this.op_buttons.length; i++) {
       op_buttons[i] = new Button(titles2[i]);   // 往操作符区中添加按钮
       panel_op.add(this.op_buttons[i]);
       op_buttons[i].addActionListener(this);   // 按钮的事件监听器,处理方法为this,也就是下面重载的actionPerformed()方法,这个方法必须被重载
      }
      
     }
     
     
    @Override   // 对ActionListener接口的此方法进行重载 
     public void actionPerformed(ActionEvent e) {
      Button button = (Button) e.getSource();   // 获得按钮来源
     
      /**
       * 如果是数字键和操作符 , 则直接显示
       **/
      for(int i = 0; i < 14; i++) { 
       if(button == number_buttons[i] || button == op_buttons[1]) {
        textfield.setText(textfield.getText() + button.getLabel());
        return;
       }
      }
      
      /**
       * 如果是c,则清空
       **/
      if(button == number_buttons[14]) {
       textfield.setText("");
       return;
      }
      
      /**
       * 如果是回退按钮 , 则清除最近的一个字符
       **/
      if(button == op_buttons[0]) {
       String s = textfield.getText();
       if(s.length() > 0)
        textfield.setText(s.substring(0, s.length() - 1));
       return;
      }
      
      
      /**
       * 如果是=,则计算结果
       **/
      if(button == op_buttons[2]) {
       textfield.setText(getResult());
       return;
      }
     }
     
     
     public String getResult() {
      
      /**
       * 计算结果
       **/
      String s = textfield.getText();   // 先获得输入的字符串
      String num = "";
      Stack nums = new Stack();
      Stack ops = new Stack();
      
      /**
       * 利用regex分离操作数和操作符,然后用栈进行结果的计算
       **/
      for(int i = 0; i < s.length(); i++) {
       String temp = s.charAt(i) + "";
       if(temp.matches("[0-9]") || temp.matches("[.]")) {
        num += temp;
       }
       else if(temp.matches("[*+]") || temp.matches("[-]") | temp.matches("[/]")) {
        if(!num.equals(""))
         nums.push(Double.parseDouble(num));
        if(ops.isEmpty() || cmpLevel(temp,ops.peek())) {
         ops.push(temp);
        }
        else {
         Double num1 = nums.pop();
         Double num2 = nums.pop();
         String op2 = ops.pop();
         nums.push(compute(num2,num1,op2));
         i--;
        } 
        num = "";
       }
      }
     
      while(!ops.isEmpty()) {
       
       if(!num.equals("")) {
        nums.push(compute(nums.pop(),Double.parseDouble(num),ops.pop()));
        num = "";
       }
       else {
        Double num1 = nums.pop();
        Double num2 = nums.pop();
        nums.push(compute(num2,num1,ops.pop()));
       }
       
      }
      return nums.pop().toString();
     }
     
      /**  
       * 将两个操作数根据操作符进行运算 , 返回结果  
       ** /
        public Double compute(double num1,double num2,String op) {
      if(op.equals("+")) {
       return num1 + num2;
      }
      else if(op.equals("-")) {
       return num1 - num2;
      }
      else if(op.equals("*")) {
       return num1 * num2;
      }
      else
       return num1 / num2;
     }
     
     /**
      *  比较两个操作符的优先级  
      **/
     public boolean cmpLevel(String s1,String s2) {
      if(s1.equals("+") || s1.equals("-")) {
       return false;
      }
      else {
       if(s2.equals("+") || s2.equals("-"))
        return true;
       return false;
      }
     }
     
     /**  
      * 设置每个组件的字体  
      **/
     public void setFonts() {
      panel_number.setFont(new Font("微软雅黑",Font.PLAIN,24));
      panel_op.setFont(new Font("微软雅黑",Font.PLAIN,24));
      panel_other.setFont(new Font("微软雅黑",Font.PLAIN,24));
      textfield.setFont(new Font("微软雅黑",Font.PLAIN,48));
     }
     
     /**
      *  main方法  
      **/
     public static void main(String [] args) {
      new Calculator();
     }
     
    }
    本文内容来源于网友投稿,如有侵权请联系删除。
    作者最新文章
    编程开发 小程序 Java
    相关文章 更多
    链表删除节点的时间复杂度是多少及其详细分析
    链表删除节点的时间复杂度是多少及其详细分析

    详细分析链表删除节点的时间复杂度,深入探讨单链表与双向链表在不同已知前提下的查找与删除开销,并结合完整代码与清晰图解进行对比总结。

    codex如何配置模型参数及文件设置教程
    codex如何配置模型参数及文件设置教程

    想知道如何让AI写出的代码更贴合你的习惯?本文手把手教你在VS Code中调整Codex相关模型参数,通过修改配置文件优化温度值和令牌限制,解决代码建议不准确或响应慢的问题。

    Claude Code AI编程工具实力揭秘与编程助手实测
    Claude Code AI编程工具实力揭秘与编程助手实测

    通过实测展示Claude Code在终端中如何理解自然语言指令、自动修改代码文件并处理复杂编程任务,帮助开发者评估其实际辅助能力。

    winforms教程自学入门与基础开发步骤详解
    winforms教程自学入门与基础开发步骤详解

    本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

    Cursor自动补全设置教程教你快速开启代码补全功能
    Cursor自动补全设置教程教你快速开启代码补全功能

    详解Cursor编辑器中自动补全功能的开启与优化设置,涵盖Tab触发机制、上下文窗口调整及模型切换,帮助开发者解决补全延迟、干扰大等问题,提升编码流畅度。

    pandas的数据格式怎么转换和设置方法教程
    pandas的数据格式怎么转换和设置方法教程

    详解Pandas中数据格式转换的核心方法,包括astype强制转换、to_numeric容错处理及日期解析技巧,解决常见类型错误并提升数据处理效率。

    VS Code中文设置方法 简体语言包安装与切换教程
    VS Code中文设置方法 简体语言包安装与切换教程

    详细介绍在Visual Studio Code中安装Chinese (Simplified)语言包的方法,包括通过扩展市场搜索、安装及自动重启切换至简体中文界面的完整步骤,帮助开发者快速将编辑器本地化。

    cursor安装过程无法更改安装位置的解决方法
    cursor安装过程无法更改安装位置的解决方法

    针对Cursor安装包默认锁定C盘且无路径选择界面的问题,提供通过手动移动文件并创建目录联结(Symbolic Link)的解决方案,实现将软件安装在其他磁盘分区。

    rust下载安装教程详解及Windows环境配置方法
    rust下载安装教程详解及Windows环境配置方法

    详解Windows系统下Rust语言的安装步骤,重点解析rustup工具链管理机制,解决环境变量配置错误及MSVC链接器缺失问题,提供可复制的命令验证方法与常见报错的因果排查思路。

    vs code怎么配置 chat实用设置教程步骤
    vs code怎么配置 chat实用设置教程步骤

    详解VS Code中Chat插件的安装与核心配置步骤,重点解决API连接失败、响应慢等常见问题,通过优化上下文设置提升代码生成质量,适合希望集成AI辅助工具的开发者阅读。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    WINDOWS 更多
    3dmax(3ds max)
    3dmax(3ds max)
    Windows

    Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    即将离开本站
    您即将前往第三方网站,请确认是否继续?