利用Frame组件设计计算器


import java.awt.*;

import java.awt.Panel;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * @Author cc
 * @create 2022/5/2 19:24
 */
public class calculate {
    TextField tfResult;
    Button btNum[], btOper[], btPoint, btEqual, btBack, btSqrt, btPingfang, btLifang;//button类型数据
    //btNum是数,btoper是运算符
    double num1 = 0, num2;//操作数
    char oper;//操作符
    boolean isNum;//代表数字标志位

    public void init() {
        Frame f;
        tfResult = new TextField();//定义一个文本框

        btNum = new Button[10];//数组对象
        for (int i = 0; i <= 9; i++) {
            btNum[i] = new Button(i + "");
            btNum[i].setPreferredSize(new java.awt.Dimension(100, 100));
            btNum[i].setFont(new Font("楷体", Font.CENTER_BASELINE, 20));
        }//初始化数字按钮
        btOper = new Button[4];//初始化运算符按钮
        btOper[0] = new Button("+");

        btOper[1] = new Button("-");
        btOper[2] = new Button("*");
        btOper[3] = new Button("/");
        btPoint = new Button(".");
        btEqual = new Button("=");
        btBack = new Button("C");
        btSqrt = new Button("Sqrt");
        btPingfang = new Button("^2");
        btLifang = new Button("^3");
        f = new Frame("计算器");

        f.setSize(400, 600);

        //放置组件
        f.add(tfResult, "North");
        tfResult.setPreferredSize(new java.awt.Dimension(400, 100));
        tfResult.setFont(new Font("宋体", Font.BOLD, 30));
        Panel panel = new Panel();//定义一个面板
        f.add(panel, "Center");//放到中间去

        GridLayout gl = new GridLayout(5, 4);//五行四列
        panel.setLayout(gl);//采用网格布局
        //第一行
        panel.add(btSqrt);
        panel.add(btPingfang);
        panel.add(btLifang);
        panel.add(btBack);
        //第二行
        panel.add(btNum[7]);
        panel.add(btNum[8]);
        panel.add(btNum[9]);
        panel.add(btOper[3]);//除法
        //第三行
        panel.add(btNum[4]);
        panel.add(btNum[5]);
        panel.add(btNum[6]);
        panel.add(btOper[2]);//乘法
        //第四行
        panel.add(btNum[1]);
        panel.add(btNum[2]);
        panel.add(btNum[3]);
        panel.add(btOper[1]);//减法
        //第五行
        panel.add(btNum[0]);
        panel.add(btPoint);
        panel.add(btEqual);
        panel.add(btOper[0]);//加法


        f.setVisible(true);
        //注册监听
        f.addWindowListener(new MyWinLis());//窗口监听关闭
        //数字按钮注册监听
        MyNumLis mnl = new MyNumLis();
        for (int i = 0; i <= 9; i++)
            btNum[i].addActionListener(mnl);

        //操作符按钮注册监听
        MyOperLis mol = new MyOperLis();//实例化监听对象
        for (int j = 0; j <= 3; j++)
            btOper[j].addActionListener(mol);

        //等号按钮注册监听
        MyEqualLis mel = new MyEqualLis();
        btEqual.addActionListener(mel);
        //清空按钮注册监听
        MyBackLis mbl = new MyBackLis();
        btBack.addActionListener(mbl);
        //开根号按钮注册监听
        MySqrtLis msl = new MySqrtLis();
        btSqrt.addActionListener(msl);
        //平方按钮注册监听
        MyPingfangLis mpl = new MyPingfangLis();
        btPingfang.addActionListener(mpl);
        //立方按钮注册监听
        MyLifangLis mll = new MyLifangLis();
        btLifang.addActionListener(mll);
    }

    //定义监听器类
    class MyNumLis implements ActionListener {//数字监听器
        public void actionPerformed(ActionEvent e) {
            String t = e.getActionCommand();//获取按钮的文本
            String s = tfResult.getText();//获取文本框的文本
            if (isNum == false)//如果当前缓冲没有数字
                tfResult.setText(t);//设置文本框的文本
            else//如果是已经有数字
                tfResult.setText(s + t);//直接用拼接
            isNum = true;//有数字了
        }
    }
    class MyOperLis implements ActionListener {//操作符监听器
        public void actionPerformed(ActionEvent e) {
            if(e.getSource() == btOper[1] && tfResult.getText().equals("")){
                tfResult.setText("-");
                isNum = true;
            }

            num1 = Double.parseDouble(tfResult.getText());//先提取出当前文本框中的数字

            oper = e.getActionCommand().charAt(0);//获取按钮的文本

            isNum = false;//清空缓冲,准备下一个数字
        }
    }

    class MySqrtLis implements ActionListener {//开根号监听器
        public void actionPerformed(ActionEvent e) {
            double t = Double.parseDouble(tfResult.getText());
            if (t >= 0) {
                tfResult.setText(Math.sqrt(t) + "");
            } else {
                tfResult.setText("负数不能开根号");
            }
            isNum = false;
        }
    }

    class MyPingfangLis implements ActionListener {//平方监听器
        public void actionPerformed(ActionEvent e) {
            num1 = Double.parseDouble(tfResult.getText());
            tfResult.setText(num1 * num1 + "");
        }
    }

    class MyLifangLis implements ActionListener {//立方监听器
        public void actionPerformed(ActionEvent e) {
            num1 = Double.parseDouble(tfResult.getText());
            tfResult.setText(num1 * num1 * num1 + "");
        }
    }



    class MyEqualLis implements ActionListener {//等号监听器
        public void actionPerformed(ActionEvent e) {
            double result = 0;
            isNum = false;
            num2 = Double.parseDouble(tfResult.getText());//num2是按下加减乘除后的数字

            switch (oper) {
                case '+':
                    result = num1 + num2;
                    tfResult.setText(result + "");
                    break;
                case '-':
                    result = num1 - num2;
                    tfResult.setText(result + "");
                    break;
                case '*':
                    result = num1 * num2;
                    tfResult.setText(result + "");
                    break;
                case '/':
                    if (num2 == 0) {
                        tfResult.setText("除数不能为0");
                        break;
                    }
                    result = num1 / num2;
                    tfResult.setText(result + "");
                    break;
            }

        }
    }

    class MyBackLis implements ActionListener {//重置
        public void actionPerformed(ActionEvent e) {
            tfResult.setText("");
            isNum = false;
        }
    }



    //关闭窗口
    class MyWinLis extends WindowAdapter {
        public void windowClosing(WindowEvent e) {
            e.getWindow().setVisible(false);
            e.getWindow().dispose();
            System.exit(0);
        }
    }

    public static void main(String[] args) {
        new calculate().init();
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值