使用了网格布局管理器。
package com.langxikeji.AwtTest;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.math.BigDecimal;
public class Cal extends Frame implements ActionListener {
// 计算器主界面
private Frame f = new Frame("计算器");
// 文本输入框,初始值为0,37列
private TextField tf = new TextField("0", 37);
// 判断是否是第一个输入数字
private boolean fristNum = true;
// 计算符号赋值
private String symbol = "=";
// 保存中间结果
private double Num = 0.0;
// 使用网格布局管理器,创建一个5行4列的网格布局
private Panel btpanel = new Panel(new GridLayout(5, 4));
// 保存文本框
private Panel tfpanel = new Panel();
// 默认除法运算精度
private final int DEF_DIV_SCALE = 10;
// 按钮名称使用字符串数组保存
String[] button = { "C", "%", "<-", "÷", "7", "8", "9", "*", "4", "5", "6",
"-", "1", "2", "3", "+", "0", ".", "+/-", "=" };
public void init() {
// 设置主界面的大小和位置
f.setBounds(100, 100, 300, 400);
// 添加按钮和监听器。已经 implements ActionListener接口
for (int i = 0; i < button.length; i++) {
Button bt = new Button(button[i]);
bt.addActionListener(this);
btpanel.add(bt);
}
tfpanel.add(tf);
f.add(tfpanel, BorderLayout.NORTH);
f.add(btpanel);
f.setResizable(false);
f.setVisible(true);
// 关闭窗口的监听器
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
f.dispose();
}
});
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
// 返回与此动作相关的命令字符串
String label = e.getActionCommand();
// 清零方法
if ("C".equals(label)) {
emptyNumber();
// 数字输入
} else if ("0123456789.".indexOf(label) >= 0) {
handleNumber(label);
// 符号输入
} else if ("+-*÷%=".indexOf(label) >= 0) {
calNumber(label);
// 倒数计算
} else if ("<-".equals(label)) {
delNumber();
// 负号输入
} else if ("+/-".equals(label)) {
Num = getFormatNum() * (-1);
tf.setText(String.valueOf(Num));
}
}
// 清空TextField里面的数字字符串
public void emptyNumber() {
tf.setText("0");
fristNum = true;
symbol = "=";
}
// 一步一步删除文本框里面的字符串
public void delNumber() {
String num = tf.getText().substring(0, tf.getText().length() - 1);
tf.setText(num);
// 如果文本框里面的字符串的长度为0,就无法退格
if (tf.getText().length() == 0) {
tf.setText("0");
}
}
// 算术运算
public void calNumber(String label) {
if ("÷".equals(symbol)) {
if (getFormatNum() == 0.0) {
tf.setText("0不能作为除数");
} else {
Num = div(Num, getFormatNum());
}
} else if ("*".equals(symbol)) {
Num = mul(Num, getFormatNum());
} else if ("+".equals(symbol)) {
Num = add(Num, getFormatNum());
} else if ("-".equals(symbol)) {
Num = sub(Num, getFormatNum());
} else if ("%".equals(symbol)) {
Num = Num / 100;
} else if ("=".equals(symbol)) {
Num = getFormatNum();
}
tf.setText(String.valueOf(Num));
fristNum = true;
symbol = label;
}
// 精度运算
public double add(double value1, double value2) {
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.add(b2).doubleValue();
}
public double sub(double value1, double value2) {
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.subtract(b2).doubleValue();
}
public double mul(double value1, double value2) {
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.multiply(b2).doubleValue();
}
public double div(double value1, double value2) {
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
// 精确到小数点后10位的数字四舍五入
return b1.divide(b2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP)
.doubleValue();
}
// 字符串拼接
public void handleNumber(String label) {
// 如果输入的是第一个数
if (fristNum) {
if (".".equals(label)) {
tf.setText("0.0");
} else {
tf.setText(label);
}
// 如果输入的是小数点,或者是前一位不是小数点,在后面加上一个小数点
} else if (".".equals(label) && !tf.getText().contains(".")) {
tf.setText(tf.getText() + ".");
// 如果不是小数点,就在后面拼接数字
} else if (!".".equals(label)) {
tf.setText(tf.getText() + label);
}
fristNum = false;
}
// 返回当前文本框中的字符串数字
public double getFormatNum() {
double num = 0.0;
num = Double.valueOf(tf.getText()).doubleValue();
return num;
}
// 主方法
public static void main(String[] args) {
new Cal().init();
}
}