AWT高仿计算器

使用了网格布局管理器。

package com.langxikeji.AwtTest;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.math.BigDecimal;

public class Cal extends Frame implements ActionListener {
    // 计算器主界面
    private Frame f = new Frame("计算器");
    // 文本输入框,初始值为0,37列
    private TextField tf = new TextField("0", 37);
    // 判断是否是第一个输入数字
    private boolean fristNum = true;
    // 计算符号赋值
    private String symbol = "=";
    // 保存中间结果
    private double Num = 0.0;
    // 使用网格布局管理器,创建一个5行4列的网格布局
    private Panel btpanel = new Panel(new GridLayout(5, 4));
    // 保存文本框
    private Panel tfpanel = new Panel();
    // 默认除法运算精度
    private final int DEF_DIV_SCALE = 10;

    // 按钮名称使用字符串数组保存
    String[] button = { "C", "%", "<-", "÷", "7", "8", "9", "*", "4", "5", "6",
            "-", "1", "2", "3", "+", "0", ".", "+/-", "=" };

    public void init() {
        // 设置主界面的大小和位置
        f.setBounds(100, 100, 300, 400);
        // 添加按钮和监听器。已经 implements ActionListener接口
        for (int i = 0; i < button.length; i++) {
            Button bt = new Button(button[i]);
            bt.addActionListener(this);
            btpanel.add(bt);
        }
        tfpanel.add(tf);
        f.add(tfpanel, BorderLayout.NORTH);
        f.add(btpanel);
        f.setResizable(false);
        f.setVisible(true);
        // 关闭窗口的监听器
        f.addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent e) {
                f.dispose();
            }
        });
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        // 返回与此动作相关的命令字符串
        String label = e.getActionCommand();
        // 清零方法
        if ("C".equals(label)) {
            emptyNumber();
            // 数字输入
        } else if ("0123456789.".indexOf(label) >= 0) {
            handleNumber(label);
            // 符号输入
        } else if ("+-*÷%=".indexOf(label) >= 0) {
            calNumber(label);
            // 倒数计算
        } else if ("<-".equals(label)) {
            delNumber();
            // 负号输入
        } else if ("+/-".equals(label)) {
            Num = getFormatNum() * (-1);
            tf.setText(String.valueOf(Num));
        }
    }

    // 清空TextField里面的数字字符串
    public void emptyNumber() {
        tf.setText("0");
        fristNum = true;
        symbol = "=";
    }

    // 一步一步删除文本框里面的字符串
    public void delNumber() {
        String num = tf.getText().substring(0, tf.getText().length() - 1);
        tf.setText(num);
        // 如果文本框里面的字符串的长度为0,就无法退格
        if (tf.getText().length() == 0) {
            tf.setText("0");
        }
    }

    // 算术运算
    public void calNumber(String label) {
        if ("÷".equals(symbol)) {
            if (getFormatNum() == 0.0) {
                tf.setText("0不能作为除数");
            } else {
                Num = div(Num, getFormatNum());
            }
        } else if ("*".equals(symbol)) {
            Num = mul(Num, getFormatNum());
        } else if ("+".equals(symbol)) {
            Num = add(Num, getFormatNum());
        } else if ("-".equals(symbol)) {
            Num = sub(Num, getFormatNum());
        } else if ("%".equals(symbol)) {
            Num = Num / 100;
        } else if ("=".equals(symbol)) {
            Num = getFormatNum();
        }
        tf.setText(String.valueOf(Num));
        fristNum = true;
        symbol = label;
    }

    // 精度运算
    public double add(double value1, double value2) {
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.add(b2).doubleValue();
    }

    public double sub(double value1, double value2) {
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.subtract(b2).doubleValue();
    }

    public double mul(double value1, double value2) {
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.multiply(b2).doubleValue();
    }

    public double div(double value1, double value2) {
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        // 精确到小数点后10位的数字四舍五入
        return b1.divide(b2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP)
                .doubleValue();
    }

    // 字符串拼接
    public void handleNumber(String label) {
        // 如果输入的是第一个数
        if (fristNum) {
            if (".".equals(label)) {
                tf.setText("0.0");
            } else {
                tf.setText(label);
            }
            // 如果输入的是小数点,或者是前一位不是小数点,在后面加上一个小数点
        } else if (".".equals(label) && !tf.getText().contains(".")) {
            tf.setText(tf.getText() + ".");
            // 如果不是小数点,就在后面拼接数字
        } else if (!".".equals(label)) {
            tf.setText(tf.getText() + label);
        }
        fristNum = false;
    }

    // 返回当前文本框中的字符串数字
    public double getFormatNum() {
        double num = 0.0;
        num = Double.valueOf(tf.getText()).doubleValue();
        return num;
    }

    // 主方法
    public static void main(String[] args) {
        new Cal().init();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值