题目要求:实现一个具有加减乘除功能的计算器,界面包括菜单栏、显示区和按键区。
界面如下:(只实现加减乘除的四则运算功能,其他功能并未实现)
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
public class Calculate extends JFrame implements ActionListener{
JTextField textField; // 文本框,用于显示计算结果和用户输入的表达式
public static void main(String[] args){
Calculate calculate=new Calculate(); // 创建计算器对象
}
Calculate(){
this.setTitle("计算器"); // 设置窗口标题
this.setVisible(true); // 设置窗口可见
this.setSize(500,600); // 设置窗口大小
this.setLocation(0, 100); // 设置窗口位置
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗口关闭时的操作
JMenuBar MenuBar=new JMenuBar(); // 创建菜单栏
JMenu Menu1=new JMenu("查看(V)"); // 创建菜单1
MenuBar.add(Menu1); // 将菜单1添加到菜单栏
JMenu Menu2=new JMenu("编辑(E)"); // 创建菜单2
MenuBar.add(Menu2); // 将菜单2添加到菜单栏
JMenu Menu3=new JMenu("帮助(H)"); // 创建菜单3
MenuBar.add(Menu3); // 将菜单3添加到菜单栏
this.setJMenuBar(MenuBar); // 将菜单栏添加到窗口
this.setLayout(new BorderLayout()); // 设置窗口布局为边界布局
textField=new JTextField(); // 创建文本框对象
Dimension size = new Dimension(200, 200); // 创建文本框的尺寸对象
textField.setPreferredSize(size); // 设置文本框的尺寸
textField.setHorizontalAlignment(JTextField.RIGHT); // 设置文本框中的文本右对齐
this.add(textField,BorderLayout.NORTH); // 将文本框添加到窗口的北部
JPanel panel=new JPanel(); // 创建面板对象
panel.setLayout(new GridLayout(5,6)); // 设置面板布局为网格布局
JButton[] buttons=new JButton[28]; // 创建按钮数组
String[] str={"MC","MR","MS","M+","M-",
"<-","CE","C","+-","sqrt",".",
"%","1/x","9","8", "7","6",
"5","4","3","2","1",
"0","+","-","*","/","="}; // 创建按钮的文本数组
for(int i=0;i<str.length;i++){
buttons[i]=new JButton(str[i]); // 创建按钮对象
buttons[i].addActionListener(this); // 为按钮添加事件监听器
panel.add(buttons[i]); // 将按钮添加到面板
}
this.add(panel,BorderLayout.CENTER); // 将面板添加到窗口的中心
this.setVisible(true); // 设置窗口可见
}
String[] process_button={"9","8", "7","6",
"5","4","3","2","1",
"0","+","-","*","/"}; // 创建包含运算符和数字的数组
List<String> Process_Button=Arrays.asList(process_button); // 将数组转换为列表
@Override
public void actionPerformed(ActionEvent e) { // 事件处理方法
String s=e.getActionCommand(); // 获取事件源的文本
if(Process_Button.contains(s)){ // 如果事件源是数字或运算符
textField.setText(textField.getText()+s); // 在文本框中添加数字或运算符
}
else if(s.equals("=")){ // 如果事件源是等号
String expression=textField.getText(); // 获取文本框中的表达式
int ans=0; // 初始化计算结果
Stack<Integer> sta_num=new Stack<Integer>(); // 创建数字栈
int num=0; // 初始化数字
char sign='+'; // 初始化运算符
for (int i = 0; i < expression.length(); i++) { // 遍历表达式中的每个字符
char c = expression.charAt(i); // 获取当前字符
if (Character.isDigit(c)) { // 如果当前字符是数字
num = num * 10 + c - '0'; // 将数字字符转换为数字并添加到数字变量中
}
if (!Character.isDigit(c)||i == expression.length() - 1) { // 如果当前字符不是数字或已经到达表达式末尾
if (sign == '+') { // 如果运算符是加号
sta_num.push(num); // 将数字压入数字栈
} else if (sign == '-') { // 如果运算符是减号
sta_num.push(-num); // 将相反压入数字栈
} else if (sign == '*') { // 如果运算符是乘号
sta_num.push(sta_num.pop() * num); // 将数字栈顶元素弹出并与当前数字相乘,将压入数字栈
} else if (sign == '/') { // 如果运算符是除号
if (num == 0) { // 如果除数为0
throw new ArithmeticException("Division by zero"); // 抛出除零异常
}
sta_num.push(sta_num.pop() / num); // 将数字栈顶元素弹出并与当前数字相除,将结果压入数字栈
}
sign = c; // 更新运算符
num = 0; // 重置数字
}
}
while (!sta_num.isEmpty()) { // 当数字栈不为空时
ans += sta_num.pop(); // 将数字栈顶元素弹出并加到计算结果中
}
textField.setText(Integer.toString(ans)); // 将计算结果显示在文本框中
}
}
}