Java 计算器(awt, swing)

这个是我们java课swing那一张的一个实验。

其实代码可以更简洁,但是初学swing的成果,还请诸君不要挑刺啦!(有几段我自己看着都难受)

先放一下效果,有需要自取即可,(我计算表达式那一段也是copy过来的hh,太晚了想睡觉)

89ec5952dfb64ed0ac89a702360ac5fb.png

每次输入完数字或者操作符之后,点击等于号即可以完成计算哦,并且内部把eval清空至空格(防止North的panel形变),以进行下次运算。

del支持撤销操作,可以帮你回退一个字符。

 

废话不多讲,放代码:

​

/*
    Created by Chen .2022
*/
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Stack;

class window extends JFrame {
    public static String eval = " ";
    public static String ans = "";
    public JPanel keys = new JPanel();
    public JButton cal = new JButton("=");
    public JButton button1 = new JButton("1");
    public JButton button2 = new JButton("2");
    public JButton button3 = new JButton("3");
    public JButton button4 = new JButton("4");
    public JButton button5 = new JButton("5");
    public JButton button6 = new JButton("6");
    public JButton button7 = new JButton("7");
    public JButton button8 = new JButton("8");
    public JButton button9 = new JButton("9");
    public JButton button0 = new JButton("0");
    public JButton mul = new JButton("•");
    public JButton add = new JButton("+");
    public JButton sub = new JButton("-");
    public JButton div = new JButton("/");
    public JButton del = new JButton("del");
    public JPanel showAns = new JPanel();
    public static JLabel label = new JLabel("你知道我长什么样,来鼠我吧");

    public window() {
        setName("微型计算器");
        init();
        button1.addActionListener((actionEvent -> {
            eval += "1";
            System.out.println(eval);
            label.setText(eval);
        }));
        button2.addActionListener((actionEvent -> {
            eval += "2";
            System.out.println(eval);
            label.setText(eval);
        }));
        button3.addActionListener((actionEvent -> {
            eval += "3";
            System.out.println(eval);
            label.setText(eval);
        }));
        button4.addActionListener((actionEvent -> {
            eval += "4";
            System.out.println(eval);
            label.setText(eval);
        }));
        button5.addActionListener((actionEvent -> {
            eval += "5";
            System.out.println(eval);
            label.setText(eval);
        }));
        button6.addActionListener((actionEvent -> {
            eval += "6";
            System.out.println(eval);
            label.setText(eval);
        }));
        button7.addActionListener((actionEvent -> {
            eval += "7";
            System.out.println(eval);
            label.setText(eval);
        }));
        button8.addActionListener((actionEvent -> {
            eval += "8";
            System.out.println(eval);
            label.setText(eval);
        }));
        button9.addActionListener((actionEvent -> {
            eval += "9";
            System.out.println(eval);
            label.setText(eval);
        }));
        button0.addActionListener((actionEvent -> {
            eval += "0";
            System.out.println(eval);
            label.setText(eval);
        }));
        add.addActionListener((actionEvent -> {
            eval += "+";
            System.out.println(eval);
            label.setText(eval);
        }));
        sub.addActionListener((actionEvent -> {
            eval += "-";
            System.out.println(eval);
            label.setText(eval);
        }));
        mul.addActionListener((actionEvent -> {
            eval += "*";
            System.out.println(eval);
            label.setText(eval);
        }));
        div.addActionListener((actionEvent -> {
            eval += "/";
            System.out.println(eval);
            label.setText(eval);
        }));
        cal.addActionListener((actionEvent -> {
            System.out.println(eval);
            try {
                calculate c = new calculate(eval.substring(1));
                ans = c.getAns();
                System.out.println(eval + " = " + ans);
                label.setText(eval + " =" + ans);
                eval = " ";

            } catch (Exception e) {
                ans = "Error";
            }
        }));
        del.addActionListener((actionEvent -> {
            try {
                StringBuffer bf = new StringBuffer(eval);
                bf.deleteCharAt(bf.length() - 1);
                eval = bf.substring(0, bf.length());
                System.out.println(eval);
            } catch (Exception e) {
                eval = " ";
            }
            if (eval.length() == 0) {
                eval = " ";
            }
            label.setText(eval);
        }));
        setVisible(true);
        setBounds(300, 200, 200, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);

    }

    public void init() {

        getContentPane().setLayout(new BorderLayout());

        showAns.setLayout(new FlowLayout(FlowLayout.RIGHT));

        label.setVisible(true);
        showAns.add(label);
        showAns.setVisible(true);
        getContentPane().add(showAns, BorderLayout.NORTH);

        keys.setLayout(new GridLayout(4, 4, 5, 4));
        keys.setBackground(Color.BLACK);
        keys.setVisible(true);

        keys.add(button1);
        keys.add(button2);
        keys.add(button3);
        keys.add(add);

        keys.add(button4);
        keys.add(button5);
        keys.add(button6);
        keys.add(sub);

        keys.add(button7);
        keys.add(button8);
        keys.add(button9);
        keys.add(mul);

        keys.add(del);
        keys.add(button0);
        keys.add(cal);
        keys.add(div);

        getContentPane().add(keys, BorderLayout.CENTER);
        getContentPane().setVisible(true);
        getContentPane().setBackground(new Color(255, 255, 255));
    }
}

public class main {

    public static void main(String args[]) {
        new window();

    }

}

class calculate {

    public String str;

    public calculate(String string) {
        str = string;
    }

    public static int priority(char s) {
        switch (s) {
            case '(':
            case ')':
                return 0;
            case '-':
            case '+':
                return 1;
            case '*':
            case '%':
            case '/':
                return 2;
            default:
                return -1;

        }
    }

    public static double compute(double num1, double num2, char s) {
        switch (s) {
            case '(':
            case ')':
                return 0;
            case '-':
                return num1 - num2;
            case '+':
                return num1 + num2;
            case '%':
                return num1 % num2;
            case '*':
                return num1 * num2;
            case '/':
                return num1 / num2;
            default:
                return 0;

        }
    }

    public String getAns() {
        return Double.toString(compute(this.str));
    }

    public static double compute(String str) {
        double num[] = new double[20];
        int flag = 0, begin = 0, end = 0, now;
        now = -1;
        Stack<Character> st = new Stack<Character>();
        for (int i = 0; i < str.length(); i++) {
            char s = str.charAt(i);
            if (s == ' ') {

            } else if (s == '+' || s == '-' || s == '*' || s == '/' || s == '(' || s == ')' || s == '%') {
                if (flag == 1) {
                    now += 1;
                    if (end < begin) {
                        num[now] = Integer.valueOf(str.substring(begin, begin + 1));
                    } else {
                        num[now] = Integer.valueOf(str.substring(begin, end + 1));
                    }
                    // System.out.println(num[now]);
                    flag = 0;
                }
                if (s == '-') {
                    if (i == 0) {
                        flag = 1;
                        begin = 0;
                    } else if (str.charAt(i - 1) == '(' || str.charAt(i - 1) == '*'
                            || str.charAt(i - 1) == '/') {
                        flag = 1;
                        begin = i;
                    } else {
                        if (st.empty()) {
                            st.push(s);
                        } else if (s == ')') {
                            num[now - 1] = compute(num[now - 1], num[now], st.pop());
                            now -= 1;
                            st.pop();
                        } else if (s == '(') {
                            st.push(s);
                        } else if (priority(s) <= priority(st.peek())) {
                            num[now - 1] = compute(num[now - 1], num[now], st.pop());
                            now -= 1;
                            st.push(s);
                        } else {
                            st.push(s);
                        }
                    }
                } else if (st.empty()) {
                    st.push(s);
                } else if (s == ')') {
                    num[now - 1] = compute(num[now - 1], num[now], st.pop());
                    now -= 1;
                    st.pop();
                } else if (s == '(') {
                    st.push(s);
                } else if (priority(s) <= priority(st.peek())) {
                    num[now - 1] = compute(num[now - 1], num[now], st.pop());
                    now -= 1;
                    st.push(s);
                } else {
                    st.push(s);
                }

            } else if (flag == 0) {
                flag = 1;
                begin = i;
            } else {
                end = i;
            }

        }
        if (flag == 1) {
            now += 1;
            if (end < begin) {
                num[now] = Integer.valueOf(str.substring(begin, begin + 1));
            } else {
                num[now] = Integer.valueOf(str.substring(begin, end + 1));
            }
            // System.out.println(num[now]);
        }
        while (now > 0) {
            num[now - 1] = compute(num[now - 1], num[now], st.pop());
            now -= 1;
        }
        return num[0];
    }

}


​

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

心宿二、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值