import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class calculator extends JFrame {
//设置按钮,包括运算数字和运算符号
JButton b0 = new JButton("0");
JButton b1 = new JButton("1");
JButton b2 = new JButton("2");
JButton b3 = new JButton("3");
JButton b4 = new JButton("4");
JButton b5 = new JButton("5");
JButton b6 = new JButton("6");
JButton b7 = new JButton("7");
JButton b8 = new JButton("8");
JButton b9 = new JButton("9");
JButton jiaButton = new JButton("+");//加
JButton jianButton = new JButton("-");//减
JButton chengButton = new JButton("*");//乘
JButton chuButton = new JButton("/");//除
JButton yuButton = new JButton("%");//求余
JButton jjButton = new JButton("+/-");//正负
JButton sqrtButton = new JButton("sqrt");//求根
JButton dianButton = new JButton(".");//小数点
JButton dengButton = new JButton("=");//等号
JButton daoButton = new JButton("1/x");//求1/输入数
JButton backButton = new JButton("Backpace");//回退
JButton cButton = new JButton("C");//清除
public double op1;
public double op2;
public static final int JIA = 0;
public static final int JIAN = 1;
public static final int CHENG = 2;
public static final int CHU = 3;
public static final int YU = 4;
public int currentop = 0;
private boolean opEnd = false;
//创建面板并进行基本设置
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
JPanel panel3 = new JPanel();
JPanel panel4 = new JPanel();
JTextField result = new JTextField(20);
public calculator() {
initPanel2();
initPanel3();
panel2.setLayout(new GridLayout(5, 4)); //设置总面板边框
panel1.setLayout(new BorderLayout(0,0));
panel1.add(panel3, BorderLayout.NORTH);// 设置位置
panel1.add(panel2, BorderLayout.CENTER);// 设置位置
getContentPane().add(panel1);
addActionListeners();//按钮监听器
setSize(600,400);//窗体大小
setLocation(500, 300);//窗体位置
setVisible(true);//窗体显示
setDefaultCloseOperation(calculator.EXIT_ON_CLOSE);//窗体关闭
this.setResizable(false);
this.setTitle("计算器");
}
private void initPanel2() {
// 把组件添加相应panel上
panel2.add(b7);
panel2.add(b8);
panel2.add(b9);
panel2.add(chuButton);
panel2.add(b4);
panel2.add(b5);
panel2.add(b6);
panel2.add(chengButton);
panel2.add(b1);
panel2.add(b2);
panel2.add(b3);
panel2.add(jianButton);
panel2.add(b0);
panel2.add(jjButton);
panel2.add(dianButton);
panel2.add(jiaButton);
panel2.add(daoButton);
panel2.add(yuButton);
panel2.add(sqrtButton);
panel2.add(dengButton);
}
private void addActionListeners() {
ActionHandler c = new ActionHandler();
//按钮监听
b0.addActionListener(c);
b1.addActionListener(c);
b2.addActionListener(c);
b3.addActionListener(c);
b4.addActionListener(c);
b5.addActionListener(c);
b6.addActionListener(c);
b7.addActionListener(c);
b8.addActionListener(c);
b9.addActionListener(c);
jiaButton.addActionListener(c);
dengButton.addActionListener(c);
chengButton.addActionListener(c);
chuButton.addActionListener(c);
jianButton.addActionListener(c);
jjButton.addActionListener(c);
dianButton.addActionListener(c);
sqrtButton.addActionListener(c);
yuButton.addActionListener(c);
daoButton.addActionListener(c);
backButton.addActionListener(c);
cButton.addActionListener(c);
}
private void initPanel3() {
//输入和结果显示
panel3.setLayout(new GridLayout(2, 1));
panel3.add(result);
panel3.add(panel4);
panel3.setPreferredSize(new Dimension(100,100));
//清除和回退
panel4.setLayout(new GridLayout(1, 2));
panel4.add(backButton);
panel4.add(cButton);
}
//运算类
class ActionHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
//输入数字
if (e.getSource() == b0) {
if (opEnd == false) {
result.setText("");
}
result.setText(result.getText() + "0");
}
if (e.getSource() == b1) {
if (opEnd == false) {
result.setText("");
}
result.setText(result.getText() + "1");
opEnd = true;
}
if (e.getSource() == b2) {
if (opEnd == false) {
result.setText("");
}
result.setText(result.getText() + "2");
opEnd = true;
}
if (e.getSource() == b3) {
if (opEnd == false) {
result.setText("");
}
result.setText(result.getText() + "3");
opEnd = true;
}
if (e.getSource() == b4) {
if (opEnd == false) {
result.setText("");
}
result.setText(result.getText() + "4");
opEnd = true;
}
if (e.getSource() == b5) {
if (opEnd == false) {
result.setText("");
}
result.setText(result.getText() + "5");
opEnd = true;
}
if (e.getSource() == b6) {
if (opEnd == false) {
result.setText("");
}
result.setText(result.getText() + "6");
opEnd = true;
}
if (e.getSource() == b7) {
if (opEnd == false) {
result.setText("");
}
result.setText(result.getText() + "7");
opEnd = true;
}
if (e.getSource() == b8) {
if (opEnd == false) {
result.setText("");
}
result.setText(result.getText() + "8");
opEnd = true;
}
if (e.getSource() == b9) {
if (opEnd == false) {
result.setText("");
}
result.setText(result.getText() + "9");
opEnd = true;
}
try {
if (e.getSource() == jiaButton) {//点击+按钮,下同
op1 = Double.parseDouble(result.getText());
//说明操作数已经输入完毕
opEnd = false;
currentop = JIA;
}
if (e.getSource() == chengButton) {//乘
op1 = Double.parseDouble(result.getText());
//说明操作数已经输入完毕
opEnd = false;
currentop = CHENG;
}
if (e.getSource() == chuButton) {//除
op1 = Double.parseDouble(result.getText());
//说明操作数已经输入完毕
opEnd = false;
currentop = CHU;
}
if (e.getSource() == jianButton) {//减
op1 = Double.parseDouble(result.getText());
//说明操作数已经输入完毕
opEnd = false;
currentop = JIAN;
}
if (e.getSource() == yuButton) {//余
op1 = Double.parseDouble(result.getText());
//说明操作数已经输入完毕
opEnd = false;
currentop = YU;
}
if (e.getSource() == jjButton) {//正负
String tmp = result.getText();
if (tmp.equals("") || tmp.equals("0")) {
return;
}
if (tmp.charAt(0) == '-') {
tmp = tmp.substring(1);
} else {
tmp = '-' + tmp;
}
result.setText(tmp);
}
if (e.getSource() == dianButton) {//小数点
String tmp = result.getText();
if (tmp.equals("")) {
return;
}
if (tmp.indexOf(".") != -1) {
return;
}
tmp = tmp + ".";
result.setText(tmp);
}
if(e.getSource() == daoButton) {//1/x
String tmp = result.getText();
if (tmp.equals(" ")) {
return;
}
double d; // 先定义d
d = Double.parseDouble(tmp);
if(d==0) {
result.setText("被除数不能为零");
return;
}
op2 = 1/d;
result.setText(op2 + "");
}
if (e.getSource() == sqrtButton) {//求根
String tmp = result.getText();
if (tmp.equals(" ")) {
return;
}
double d;
d = Double.parseDouble(tmp);
if (d < 0) {
result.setText("不能对负数求平方根");
return;
}
op2 = Math.sqrt(d);
result.setText(op2 + "");
}
if (e.getSource() == backButton) {//回退
String s = result.getText();
result.setText("");
for (int i = 0; i < s.length() - 1; i++) {
char a = s.charAt(i);
result.setText(result.getText() + a);
}
}
if (e.getSource() == cButton) {//清除
result.setText("0");
opEnd = false;
}
if (e.getSource() == dengButton) { //点击“=”按钮
op2 = Double.parseDouble(result.getText());
switch (currentop) {
case JIA:
result.setText(op1 + op2 + "");
break;
case JIAN:
result.setText(op1 - op2 + "");
break;
case CHENG:
result.setText(op1 * op2 + "");
break;
case CHU:
if (op2 == 0) {
result.setText("0不能为除数");
break;
}
result.setText(op1 / op2 + "");
break;
case YU:
if (op2 == 0) {
result.setText("0不能为除数");
break;
}
result.setText(op1 % op2 + "");
break;
}
opEnd = false;
}
} catch (Exception e1) {
result.setText("输入有误,请重新输入");
opEnd = false;
}
}
}
public static void main(String[] args) {
new calculator();// 生成类实例
}