📄 calculator.java
字号:
/**
* Copyright 2007 Shanghai cjy.
* 实现windows计算器的基本功能
* @author cjy
*/
package mycalculator;
import java.awt.*;
import java.awt.event.*;
import java.math.*;
import javax.swing.*;
public class Calculator implements ActionListener{
//字段:
JFrame CalculatorFrame;
JTextArea Display; //显示数字
JButton Button1[] = new JButton[20]; //剩下的20个按钮
JButton Button2[] = new JButton[2]; //退格和清零按钮
JPanel panel1,panel2,panel3; //把整个jframe分成上中下三部分
static final int MAX_LENGTH = 33; //可以输入数字的最大长度
int signalFlag = 0; //表示当前的运算,加法为1,减法为2,乘法为3,除法为4
boolean doubleFlag = false; //表示输入的数是否为小数
boolean afterSignalFlag = false; //表示当前是否在等待输入+-*/中的一种运算符号
boolean inputStop = false; //在进行负数开方运算和除数为零的运算时出错,除了清零键不能按其他键
boolean secondNumber = false; //表示第二个运算数字是否已经输入
boolean begin = false; //在=,开方,%,1/x运算之后,begin变为true,如果此时输入数字,会开始新一次的运算
boolean afterSqrt = false; //在开方,%,1/x运算之后,afterSqrt变为true,如果此时输入数字,则新的数字会作为当前的第二个运算数,否则屏幕上的数作为第二个运算数
BigDecimal number1 = new BigDecimal("0", new MathContext(32)); //第一个运算数
BigDecimal number2 = new BigDecimal("0", new MathContext(32)); //第二个运算数
//构造函数:
public Calculator () {
CalculatorFrame = new JFrame("计算器");
CalculatorFrame.setResizable(false); //不能设置大小
Display = new JTextArea("0.",1,40);
Display.setEditable(false);
//按钮:
Button1[0] = new JButton("7");
Button1[1] = new JButton("8");
Button1[2] = new JButton("9");
Button1[3] = new JButton("/");
Button1[4] = new JButton("sprt");
Button1[5] = new JButton("4");
Button1[6] = new JButton("5");
Button1[7] = new JButton("6");
Button1[8] = new JButton("*");
Button1[9] = new JButton("%");
Button1[10] = new JButton("1");
Button1[11] = new JButton("2");
Button1[12] = new JButton("3");
Button1[13] = new JButton("-");
Button1[14] = new JButton("1/x");
Button1[15] = new JButton("0");
Button1[16] = new JButton("+/-");
Button1[17] = new JButton(".");
Button1[18] = new JButton("+");
Button1[19] = new JButton("=");
Button2[0] = new JButton("Backspace");
Button2[1] = new JButton("C");
panel1 = new JPanel (new FlowLayout());
panel2 = new JPanel (new BorderLayout());
GridLayout g = new GridLayout(4,5);
g.setHgap(1);
panel3 = new JPanel (g);
panel1.add(Display);
panel2.add(Button2[0],BorderLayout.WEST);
panel2.add(Button2[1],BorderLayout.EAST);
for (int i = 0; i < 20; i++) {
panel3.add(Button1[i]);
}
CalculatorFrame.setLayout(new BorderLayout());
CalculatorFrame.add(panel1,BorderLayout.NORTH);
CalculatorFrame.add(panel2,BorderLayout.CENTER);
CalculatorFrame.add(panel3,BorderLayout.SOUTH);
CalculatorFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
CalculatorFrame.pack();
CalculatorFrame.setVisible(true);
//清零按钮:
Button2[1].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
Display.setText("0.");
signalFlag = 0;
doubleFlag = false;
afterSignalFlag = false;
afterSqrt = false;
begin = true;
secondNumber = false;
inputStop = false;
number1 = number2 = BigDecimal.valueOf(0);
}
});
//退格按钮:
Button2[0].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
if (!inputStop && !begin) { //只有当处在能输入的状况下,才能启动功能
if (!afterSignalFlag) { //当按下+-*/按钮后,退格建不起作用
//小数的情况:
if (doubleFlag){
//最后一位为小数点时,消除小数点的作用:
if(Display.getText().charAt(Display.getText().length() - 1) == '.') {
doubleFlag = false;
}
else {
Display.replaceRange("", Display.getText().length()- 1, Display.getText().length());
}
}
//整数的退格情况:
else {
if (Display.getText().length() == 2 || (Display.getText().length() == 3
&&Display.getText().charAt(0) == '-')){
Display.setText("0.");
}
else {
Display.replaceRange("", Display.getText().length()- 2, Display.getText().length()- 1);
}
}
}
}
}
});
//数字键7:
Button1[0].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
addANumber (7);
}
});
//数字键8:
Button1[1].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
addANumber (8);
}
});
//数字键9:
Button1[2].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
addANumber (9);
}
});
//数字键4:
Button1[5].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
addANumber (4);
}
});
//数字键5:
Button1[6].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
addANumber (5);
}
});
//数字键6:
Button1[7].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
addANumber (6);
}
});
//数字键1:
Button1[10].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
addANumber (1);
}
});
//数字键2:
Button1[11].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
addANumber (2);
}
});
//数字键3:
Button1[12].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
addANumber (3);
}
});
//数字键20:
Button1[15].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
addANumber (0);
}
});
//+/-键:
Button1[16].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
if (!inputStop){ //能输入的情况下
if (!afterSignalFlag) { //在输入+-*/号后不能按下此键
//当前数字为0时不起作用:
if (!new BigDecimal(Display.getText()).equals(BigDecimal.ZERO)) {
if (Display.getText().charAt(0) == '-') {
Display.replaceRange("",0,1); //为负数的话去掉负号
}
else {
Display.setText("-" + Display.getText()); //为正书的话加上正号:
}
}
}
if (secondNumber) {
number2 = new BigDecimal(Display.getText()); //若此时的数为第二个运算数,则改变number2
}
}
}
});
//小数点键:
Button1[17].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
if (!inputStop) { //在能输入的情况下
if (begin) { //在进行一次新的运算的情况下:
Display.setText("0.");
signalFlag = 0;
doubleFlag = true;
afterSignalFlag = false;
secondNumber = false;
begin = false;
afterSqrt = false;
}
else {
if (!afterSignalFlag) {
doubleFlag = true;
}
else {
doubleFlag = true;
Display.setText("0.");
number2 = new BigDecimal(Display.getText());
afterSignalFlag = false;
secondNumber = true;
}
}
}
}
});
//sqrt开方键:
Button1[4].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
if (!inputStop) { //在能输入的情况下
try {
//若当前的数为负数,则抛出异常:
if (new BigDecimal(Display.getText()).compareTo(BigDecimal.ZERO) == -1) {
throw new NumberException ();
}
//把当前的数转换为浮点数进行开放运算:
double d = java.lang.Math.sqrt(new BigDecimal(Display.getText()).doubleValue());
Display.setText(output(new BigDecimal(d, new MathContext(32))));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -