package Calculator;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Calculator implements ActionListener {
private JFrame frame = new JFrame();
// 计算器上各按键的名字(从上到下,从左到右)
private String[] keys = { "(", ")", "C", "Back", "%", "xʸ", "√x", "÷", "7", "8", "9", "*", "4", "5", "6", "-", "1",
"2", "3", "+", "+/-", "0", ".", "=" };
private JButton buttons[] = new JButton[keys.length]; // 计算器上按键的按钮
String expressionString = "";
private JTextField expressionText = new JTextField(""); // 显示计算表达式文本框
public static JTextField resultText = new JTextField("0"); // 显示计算结果文本框
private Calculate cal = new Calculate();
static Boolean operation_flag = true;
/**
* 构造函数
*/
public Calculator() {
init(); // 初始化计算器界面
frame.setTitle("Calculator -- @author Yan Yi");
frame.setSize(366, 439);
frame.setLocation(500, 300);
frame.setResizable(false); // 不允许修改计算器窗口的大小
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/**
* 初始化计算器
*/
private void init() {
Color color1 = new Color(181, 181, 181); // 背景颜色
Color color2 = new Color(126, 192, 238); // 等于号专属颜色
Color color3 = new Color(232, 232, 232); // 功能键和运算符颜色
// 建立一个画板放文本框
JPanel textPanel = new JPanel();
textPanel.setLayout(new BorderLayout(0, 8)); // 边界布局
textPanel.setBackground(color1);
textPanel.add(expressionText, BorderLayout.NORTH);
textPanel.add(resultText, BorderLayout.SOUTH);
expressionText.setFont(new Font("楷体", Font.BOLD, 20)); // 设置文本框中文字的字体以及大小,加粗
expressionText.setHorizontalAlignment(JTextField.LEFT); // 文本框中的内容采用右对齐方式
expressionText.setEditable(false); // 不能修改结果文本框
// resultText.setBorder(color1); //删除文本框的边框
expressionText.setBackground(color3); // 设置文本框背景颜色
resultText.setFont(new Font("楷体", Font.BOLD, 20)); // 设置文本框中文字的字体以及大小,加粗
resultText.setHorizontalAlignment(JTextField.LEFT); // 文本框中的内容采用右对齐方式
resultText.setEditable(false); // 不能修改结果文本框
// resultText.setBorder(color1); //删除文本框的边框
// 设置文本框背景颜色
resultText.setBackground(color3);
// 初始化计算器上键的按钮,将键放在一个画板内
JPanel keysPanel = new JPanel();
// 用网格布局器,6行,4列的网格,网格之间的水平方向垂直方向间隔均为2个像素
keysPanel.setLayout(new GridLayout(6, 4, 2, 2));
// 初始化功能按钮
for (int i = 0; i < 8; i++) {
buttons[i] = new JButton(keys[i]);
keysPanel.add(buttons[i]);
buttons[i].setBackground(color3);
buttons[i].setForeground(Color.black);
buttons[i].setFont(new Font(Font.SERIF, Font.PLAIN, 18));
buttons[i].setBorderPainted(false); // 去除按钮的边框
}
// 初始化运算符及数字键按钮
for (int i = 8; i < keys.length; i++) {
buttons[i] = new JButton(keys[i]);
keysPanel.add(buttons[i]);
if ((i + 1) % 4 == 0)
buttons[i].setBackground(color3);
else
buttons[i].setBackground(Color.white);
buttons[i].setForeground(Color.black);
buttons[i].setFont(new Font(Font.SERIF, Font.PLAIN, 18));
buttons[i].setBorderPainted(false); // 去除按钮的边框
}
buttons[23].setBackground(color2); // '='符键用特殊颜色
keysPanel.setBackground(color1);
// 将文本框所在的面板放在北部,将keysPanel面板放在计算器的中部
frame.getContentPane().add("North", textPanel);
frame.getContentPane().add("Center", keysPanel);
// 设置两个面板的边框,尽量还原win10计算器
textPanel.setBorder(BorderFactory.createMatteBorder(25, 3, 1, 3, color1));
keysPanel.setBorder(BorderFactory.createMatteBorder(6, 3, 3, 3, color1));
// 为各按钮添加事件监听器,都使用同一个事件监听器。
for (int i = 0; i < keys.length; i++) {
buttons[i].addActionListener(this);
}
}
/**
* 处理事件
*/
public void actionPerformed(ActionEvent ev) {
String command = ev.getActionCommand(); // 获取事件源
System.out.println(command);
if (command.equals(keys[2])) {
// 用户按了"C"键
expressionString = "";
resultText.setText("0");
operation_flag = true;
} else if (operation_flag == true) {
if (command.equals(keys[3])) {
// 用户按了"Back"键
int len = expressionString.length();
if (expressionString.length() > 0) {
expressionString = expressionString.substring(0, len - 1); // 退格,将文本最后一个字符去掉
}
} else if (command.equals(keys[5])) {
// 用户按了"X^Y"键
expressionString += "^";
}else if (command.equals(keys[6])) {
// 用户按了"根号"键
expressionString += "√";
}else if (command.equals(keys[20])) {
expressionString += "_";
} else if (command.equals(keys[23])) {
cal.calculate(expressionString);
expressionString += command;
operation_flag = false;
} else {
expressionString += command;
}
}
else {
resultText.setText("Please press the C key");
}
String Str = expressionString;
Str = Str.replaceAll("_", "-");
expressionText.setText(Str);
}
public static void main(String[] args) {
new Calculator();
}
}