java gui实现计算器小程序

 更新时间:2021年07月19日 11:26:52   作者:Cyanogen_dom  
这篇文章主要为大家详细介绍了java gui实现计算器小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java gui实现计算器小程序的具体代码,供大家参考,具体内容如下

废话不多说 , 直接贴代码 , 有详细的注释 , 我也是刚学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<Double> nums = new Stack<Double>();
  Stack<String> ops = new Stack<String>();
  
  /**
   * 利用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操作gaussDB数据库的实现示例

    java操作gaussDB数据库的实现示例

    本文主要介绍了java操作gaussDB数据库的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • java实现验证码类生成中文验证码

    java实现验证码类生成中文验证码

    java实现的汉字输入验证码,主要包含两个类,一个是生成验证码,一个是判断验证码输入是否正确,实现原理非常简单,将汉字和干扰线生成图片并将汉字保存到session,前台获取每次生成验证码图片并用文本框值和session值比较,功能就怎么简单
    2014-01-01
  • 详解spring cloud构建微服务架构的网关(API GateWay)

    详解spring cloud构建微服务架构的网关(API GateWay)

    这篇文章主要介绍了详解spring cloud构建微服务架构的网关(API GateWay),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • SpringBoot+WebSocket向前端推送消息的实现示例

    SpringBoot+WebSocket向前端推送消息的实现示例

    WebSocket是一种在单个TCP连接上进行全双工通信的协议,允许服务器主动向客户端推送信息,同时也能从客户端接收信息,本文主要介绍了SpringBoot+WebSocket向前端推送消息的实现示例,感兴趣的可以了解一下
    2024-08-08
  • Java实现Linux下双守护进程

    Java实现Linux下双守护进程

    这篇文章主要介绍了Java实现Linux下双守护进程的思路、原理以及具体实现方式,非常的详细,希望对大家有所帮助
    2014-10-10
  • 设置JavaScript自动提示-Eclipse/MyEclipse

    设置JavaScript自动提示-Eclipse/MyEclipse

    自动提示需要2个组件,分别是:ext-4.0.2a.jsb2||spket-1.6.16.jar,需要的朋友可以参考下
    2016-05-05
  • Spring Cloud 使用 Resilience4j 实现服务熔断的方法

    Spring Cloud 使用 Resilience4j 实现服务熔断的方法

    服务熔断是为了保护我们的服务,比如当某个服务出现问题的时候,控制打向它的流量,让它有时间去恢复,或者限制一段时间只能有固定数量的请求打向这个服务,这篇文章主要介绍了Spring Cloud 使用 Resilience4j 实现服务熔断,需要的朋友可以参考下
    2022-12-12
  • 使用注解@Validated和BindingResult对入参进行非空校验方式

    使用注解@Validated和BindingResult对入参进行非空校验方式

    这篇文章主要介绍了使用注解@Validated和BindingResult对入参进行非空校验方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 记一次在idea离线使用maven问题(推荐)

    记一次在idea离线使用maven问题(推荐)

    这篇文章主要介绍了记一次在idea离线使用maven问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Java使用EasyExcel实现对excel文件的读写方式

    Java使用EasyExcel实现对excel文件的读写方式

    这篇文章主要介绍了Java使用EasyExcel实现对excel文件的读写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05

最新评论