用Java实现简单的计算器

本计算器实现了最简单的四则运算,界面简洁,小伙伴可以根据自己的需要再此基础上进行修改,可拓展性强

效果图:

java swt 计算器 java 简单计算器_swing

代码:

public class Counter extends JPanel {
    public Graphics g = null;

    public static void main(String[] args) {
        Counter counter = new Counter();
        counter.run();
    }

    public void run() {
        CouterListener couterListener = new CouterListener();
        // 窗体标题
        JFrame frame = new JFrame("Calculate");
        // 布局:上下左右的间距为10
        FlowLayout fl = new FlowLayout(FlowLayout.CENTER, 10, 10);
        frame.setLayout(fl);
        // 界面的的尺寸
        frame.setSize(270, 400);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(3);
        // 固定窗体的大小,无法通过鼠标改变大小
        frame.setResizable(false);

        // 多行文本框
        JTextArea field = new JTextArea();
        // 文本框的尺寸
        field.setPreferredSize(new Dimension(250, 50));

        // 设置最外层Frame的行数为2,一行放文本框,一行放按钮
        field.setRows(3);
        frame.add(field);
        // 背景颜色(可根据自己要求进行修改)
        frame.setBackground(Color.GRAY);
        couterListener.setJText(field);
        // 按钮布局,可以根据需要进行修改
        String BtArray[] = { "1", "2", "3", "+",
                             "4", "5", "6", "-",
                             "7", "8", "9", "*",
                             ".", "0", "=", "/" };

        // 按钮一共4行4列
        this.setLayout(new GridLayout(4, 4, 10, 10));
        frame.add(this);
        for (int i = 0; i < 16; i++) {
            JButton button = new JButton(BtArray[i]);
            // 按钮的颜色
            button.setForeground(Color.DARK_GRAY);
            button.setPreferredSize(new Dimension(50, 50));
            button.setContentAreaFilled(false);
            this.add(button);
            // 给按钮绑定点击事件
            button.addActionListener(couterListener);
        }
        //添加CE按钮
        JButton ce = new JButton("CE");
        ce.setForeground(Color.DARK_GRAY);
        ce.setPreferredSize(new Dimension(250, 50));
        ce.setContentAreaFilled(false);
        ce.addActionListener(couterListener);
        frame.add(ce);

        // 使窗口显示
        frame.setVisible(true);
        g = frame.getGraphics();
    }
}

/**
 * 这是监听类
 *
 * 过程解析
 * 以 5 + 3 = 8为例:
 * 当输入5的时候 temp = 5 (temp用于接收最新输入的数据)
 * 当输入+的时候 result = temp,也就是说result = 5 (result用于输出结果)
 *             count = “+”  (count会保存最近的运算符)
 * 当输入8的时候 temp = 8 (temp用于接收最新输入的数据)
 * 当输入=的时候 输出结果是 [result count temp]的结果,也就是 5 + 8的运算结果
 */
class CouterListener implements ActionListener {
    // 文本域对象
    private JTextArea JF;
    public int x = 0;
    //记录最新输入的是否为数字
    public boolean isNumber = true;
    // 结果
    public Double resulte = 0.0, temp = 0.0;
    public String num[] = new String[3];
    // 用于保存等号之前一次的运算符,比如 + - * /
    public String count;

    // 设置文本域
    public void setJText(JTextArea F) {
        JF = F;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // 运算符事件:+ - * / 运算符
        ArrayList calculateCommands = new ArrayList<String>();
        calculateCommands.add("+");
        calculateCommands.add("-");
        calculateCommands.add("*");
        calculateCommands.add("/");
        // 获得当前的命令
        String command = e.getActionCommand();
        if ("CE".equals(command)) {
            // 归零
            resulte = temp = 0.0;
            count = "";
            JF.setText("");
            isNumber = true;
        }else if (calculateCommands.contains(command)) {
            // + - * /
            JF.setText(JF.getText() + command + "\n");
            if (isNumber) {
                //输入运算符时,result保存运算符之前的数
                resulte = temp;
            }
            // 保存本次的运算符
            count = e.getActionCommand();
            isNumber = false;
        } else if ("=".equals(command)) {
            // 计算结果
            if ("+".equals(count)) {
                resulte = resulte + temp;
                JF.setText(resulte + "");
            } else if ("-".equals(count)) {
                resulte = resulte - temp;
                JF.setText(resulte + "");
            } else if ("*".equals(count)) {
                resulte = resulte * temp;
                JF.setText(resulte + "");
            } else if ("/".equals(count)) {
                resulte = resulte / temp;
                JF.setText(resulte + "");
            }
        } else {
            //输入的不是 ce + - * / = 的时候,即输入的是数字的时候
            JF.setText(JF.getText() + command);
            if (!isNumber) {
                //如果上一次输入的是字符
                //正则表达式:根据换行符[\n]将文本框内字符串变成字符串数组
                num = JF.getText().split("\\n");
                //将运算符后面的(即换行符后面的)数字保存到temp中去
                temp = Double.parseDouble(num[1]);

                // 将下面注释打开就可以知道num和temp的作用了
                System.out.println("num: ");
                for (int i = 0; i < num.length; i++) {
                    System.out.printf("[" + i + "]:\"" +num[i] + "\"\n");
                }
                System.out.println("temp: " + temp);
            } else {
                //如果是第一次输入数字
                temp = Double.parseDouble(JF.getText());
            }
        }
    }
}