计算器Java版(小玩具)

纯Java语言的计算器

import javax.accessibility.AccessibleIcon;
import javax.swing.*;
import javax.swing.plaf.basic.BasicOptionPaneUI;
import java.awt.*;
import java.awt.event.*;

import java.awt.event.*;
import javax.swing.*;
public class Calculator extends JFrame implements ActionListener{
    /*******************北面控件****************************/
    private JPanel jp_north = new JPanel(); // 创建一个组件 装计算器的上部分
    private JTextField display_text = new JTextField();  // 计算器上面的现实栏
    private JButton cButton = new JButton("C");  // 计算器的清空键

    /*****************中间控件****************************/
    private JPanel jp_center = new JPanel();

    /*****************文本操作变量****************************/
    private String firstInput = null;  // 第一次输入的结果
    private String operator = null;   // 操作符

    public Calculator() throws HeadlessException {
        this.init();  // 初始化
        this.addNorthComponent();  // 设置北面控件
        this.addCenterButton();
    }

    public static class Const{  // 各种参数的类
        public static final int FRAME_W = 500;  // 窗口的宽和高
        public static final int FRAME_H = 500;
        public static final int SCREEN_W = Toolkit.getDefaultToolkit().getScreenSize().width;  // 获取显示屏宽和高
        public static final int SCREEN_H = Toolkit.getDefaultToolkit().getScreenSize().height;

        public static int FRAME_X = (SCREEN_W - FRAME_W) / 2;  // 设置窗口默认位置是屏幕的中央
        public static int FRAME_Y = (SCREEN_H - FRAME_H) / 2;

        public static final String TITLE = "计算器"; // 窗口的名称
    }

    public void init(){  // 初始化方法
        this.setTitle(Const.TITLE);  // 设置窗口名字
        this.setSize(Const.FRAME_W, Const.FRAME_H); // 设置窗口默认大小
        this.setLayout(new BorderLayout());  // 添加一个布局
        this.setResizable(true);  // 设置窗口大小不可以改变
        this.setLocation(Const.FRAME_X, Const.FRAME_Y);  // 设置窗口的默认位置
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  // 设置点击右上角的关闭 可以真正的关闭
    }

    // 添加北面控件
    public void addNorthComponent(){
        this.display_text.setPreferredSize(new Dimension(400, 40));  // 设置显示框的大小
        this.cButton.setPreferredSize(new Dimension(60,40)); // 设置清空按钮的大小
        this.cButton.setForeground(Color.red);  // 设置清空按钮的字体颜色
        jp_north.add(this.display_text);  // 拼装组件
        jp_north.add(this.cButton);

        cButton.addActionListener(new ActionListener() {  // 给这个案例添加清空功能
            @Override       // 使用匿名内部类的时候注意对外部的引用的时候 不要加this 因为匿名内部类也是一个内
            public void actionPerformed(ActionEvent e) {
                display_text.setText("");
                firstInput = null;
                operator = null;
            }
        });
        this.add(jp_north,BorderLayout.NORTH);  // 把组件放入框架
    }

    // 添加中间按钮
    public void addCenterButton(){
        String btn_text = "123+456-789*0.=/";  // 按钮的文字
        String regex = "[\\+\\-*/.=]"; // 写正则表达式
        this.jp_center.setLayout(new GridLayout(4, 4));
        for(int i = 0; i < 16; ++ i){
            String temp = btn_text.charAt(i) + "";  // 获取第i个字符串
            JButton btn = new JButton();
            btn.setText(temp);
            if (temp.matches(regex)){
                btn.setFont(new Font("粗体", Font.BOLD, 20));  // 如果是特殊符号那么就设置为粗体
                btn.setForeground(Color.red);
            } else {
                btn.setFont(new Font("正常", Font.ROMAN_BASELINE, 20)); // 数字设置为正常字体
            }
            jp_center.add(btn);
            btn.addActionListener(this);  // 给按钮添加监听
        }

        this.add(jp_center, BorderLayout.CENTER);
    }
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        calculator.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {  // 给事件实例化
        String clickStr = e.getActionCommand(); // 获取监听事件
        if (".0123456789".indexOf(clickStr) != -1){
            this.display_text.setFont(new Font("正常", Font.ROMAN_BASELINE, 20)); // 设置显示文字的大小
            this.display_text.setText(this.display_text.getText() + clickStr);  // 显示文字
            this.display_text.setHorizontalAlignment(JTextField.RIGHT); // 从右开始显示文字
            // JOptionPane.showMessageDialog(this, clickStr);  // 测试是否建立监听成功
        } else if (clickStr.matches("[\\+\\-*/]{1}")){  // 写正则表达式 如果获取的是操作符中的一个
            this.operator = clickStr;
            this.firstInput = this.display_text.getText();  // 把上一次获取的字符 设置为上一次的字符
            this.display_text.setText("");  // 然后清空当前字符
        } else if (clickStr.equals("=")){  // 当输入的为=的时候就该输出结果了
            Double a = Double.valueOf(this.firstInput);  // 把上一次的输入的字符转化为实数
            Double b = Double.valueOf(this.display_text.getText());  // 把当前的字符也设置为实数
            Double result = null;
            Boolean flag = false;  // 标记一下除数是否为0
            switch(operator){
                case "+":
                    result = a + b;
                    break;
                case "-":
                    result = a - b;
                    break;
                case "*":
                    result = a * b;
                    break;
                case "/":
                    if (b == 0){
                        flag = true;
                    } else {
                        result = a / b;
                    }
                    break;
            }
            if (flag){  // 除数为0的情况
                this.display_text.setText("除数不能为0");
            } else {
                this.display_text.setText(result.toString());
            }
        }
    }
}

请添加图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客李华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值