这个是我们java课swing那一张的一个实验。
其实代码可以更简洁,但是初学swing的成果,还请诸君不要挑刺啦!(有几段我自己看着都难受)
先放一下效果,有需要自取即可,(我计算表达式那一段也是copy过来的hh,太晚了想睡觉)
每次输入完数字或者操作符之后,点击等于号即可以完成计算哦,并且内部把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];
}
}