Java 简单的计算器

这是我发的第一个博客,也是我用Java写的第一个图形程序,它能进行简单的四则运算、开跟、倒数。


package com.UI.JavaUITest;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Calculator02 extends JPanel {
    private JTextField display; //显示器
    private JPanel jPanel; //容器
    private double result; //数据存储
    private String lastCommand; //特殊命令
    private boolean isStart; //执行条件

//    构造函数
    public Calculator02() {
        setLayout(new BorderLayout()); //整个窗口布局为BroderLayout()

        result = 0;
        lastCommand = "=";
        isStart = true;

        display = new JTextField("0"); //建立一个显示器
        display.setEnabled(false); //禁止用户输入,副作用是字体颜色变为浅灰色,可以考虑用按钮来当显示器,但按钮当显示器字体会居中显示,不符合习惯
        display.setFont(new Font("微软雅黑", Font.BOLD, 20)); //设置显示器中字体格式
        add(display, BorderLayout.NORTH); //将显示器放置窗口顶部

        ActionListener insert = new InsertAction(); //数字按钮的事件处理机制对象
        ActionListener command = new CommandAction(); //特殊按钮的事件处理机制对象

        jPanel = new JPanel(new GridLayout(5, 4));//建立一个5行4列的容器,存放按钮

//        定义一个addButton方法,用于设置、添加按钮
        addButton("C", command);
        addButton("CE", command);
        addButton("sqrt", command);
        addButton("1/x", command);

        addButton("7", insert);
        addButton("8", insert);
        addButton("9", insert);
        addButton("/", command);

        addButton("4", insert);
        addButton("5", insert);
        addButton("6", insert);
        addButton("*", command);

        addButton("1", insert);
        addButton("2", insert);
        addButton("3", insert);
        addButton("-", command);

        addButton("0", insert);
        addButton(".", insert);
        addButton("=", command);
        addButton("+", command);

        add(jPanel, BorderLayout.CENTER);//将容器放置窗口中央
    }

//    添加、设置按钮的方法
    public void addButton(String name, ActionListener listener) {
        JButton jButton = new JButton(name);
        jButton.addActionListener(listener); //实现按钮的事件处理
        jButton.setFont(new Font("微软雅黑", Font.PLAIN, 20)); //设置按钮的字体格式

        jPanel.add(jButton);//在容器中添加按钮
    }

//    数字按钮的事件处理,设置为内部私有类,防止其他类的非法访问
    private class InsertAction implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            String input = event.getActionCommand(); //接收按钮信息

//            建立异常处理机制,防止用户非法输入导致的程序崩溃
            try {
//                判断数字输入是否为第一次,是则清空显示屏,输出按钮信息
                if (isStart) {
                    display.setText("");
                    isStart = false;
                }
                display.setText(display.getText() + input); //将数据连接起来显示在显示屏上
            }catch (NumberFormatException e) { //捕捉数字格式化异常,重置所有计算变量
                display.setText("error");
                result = 0;
                lastCommand = "=";
                isStart = true;
            }catch (ArithmeticException e){ //捕捉算数异常,重置所有计算变量
                display.setText("error");
                result = 0;
                lastCommand = "=";
                isStart = true;
            }
        }
    }

//    特殊按钮的事件处理机制,设置为内部私有类,防止其他类的非法访问
    private class CommandAction implements ActionListener{
        public void actionPerformed(ActionEvent event) {
            String command = event.getActionCommand(); //接收按钮信息
//            建立异常处理机制,防止用户非法输入导致的程序崩溃
            try {
 //                    添加“C”的清除当前数据功能
                if (command.equals("C")) {
                    display.setText("0");
                    isStart = true;
                }
//                    添加“CE”的清除所有数据功能,重新初始化所有计算变量
                else if (command.equals("CE")) {
                    display.setText("0");
                    result = 0;
                    lastCommand = "=";
                    isStart = true;
                }
//                判断首次输入是否为“-”,是则为负数
                else if (isStart) {
                    if (command.equals("-")) {
                        display.setText("-");
                        isStart = false;
                    }
                    else  lastCommand = command;
                }
                else{
//                    定义calculatorDemo方法,用于计算数值
                    calculatorDemo(Long.parseLong(display.getText()));//将在显示屏中显示的字符串转换为Long类型
                    lastCommand = command;
                    isStart = true;
                }
            }catch (NumberFormatException e){ //捕捉数字格式化异常
                display.setText("error");
                result = 0;
                lastCommand = "=";
                isStart = true;
            }catch (ArithmeticException e){ //捕捉算数异常
                display.setText("error");
                result = 0;
                lastCommand = "=";
                isStart = true;
            }
        }
    }

//    计算方法
    public void calculatorDemo(double num){
//        因为break语法的不稳定性较高,在设计程序的时候,因尽量避免使用switch语法,所以在这里使用if语句代替switch,增加程序的稳定性
        if (lastCommand.equals("+")) result += num;
        else if (lastCommand.equals("-")) result -= num;
        else if (lastCommand.equals("*")) result *= num;
        else if (lastCommand.equals("/")) result /= num;
        else if (lastCommand.equals("=")) result = num;
        else if (lastCommand.equals("sqrt")) result = Math.sqrt(num);
        else if (lastCommand.equals("1/x")) result = 1 / num;

        display.setText("" + result);
    }

    public static void main(String[] args) {
        JFrame jFrame = new JFrame("计算器"); //创建窗口
        JPanel jPanel2 = new Calculator02();
        jFrame.setContentPane(jPanel2);//窗口中的容器可见
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口即关闭程序
        jFrame.pack();
        jFrame.setLocationRelativeTo(jPanel2); //窗口出现在屏幕中央
        jFrame.setVisible(true); //窗口可见
    }
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值