package caculate;import java.awt.*;  
import java.awt.event.*;  public class Caculate extends Frame{  
private TextField t_result;  
private Panel p_main; //主面板  
private Panel p_num; //数字面板  
private Panel p_oper; //操作符面板  
private Panel p_show; //显示面板  
private Button b_num[]; //数字按钮  
private Button b_oper[]; //操作符面板  public Caculate(String title){  
setTitle(title);  
t_result = new TextField("0.0", 21);  
p_main = new Panel();  
p_num = new Panel();  
p_oper = new Panel();  
p_show = new Panel();  
p_main.setLayout(new BorderLayout());  
p_num.setLayout(new GridLayout(4, 3, 1, 1));  
p_oper.setLayout(new GridLayout(4, 2, 1, 1));  b_num = new Button[12];  
for(int i=0; i<9; i++)  
{  
b_num[i] = new Button(new Integer(i+1).toString());  
}  
b_num[9] = new Button("0");  
b_num[10] = new Button("cls");  
b_num[11] = new Button(".");  
for(int i=0; i<12; i++)  
{  
p_num.add(b_num[i]);  
}  b_oper = new Button[9];  
b_oper[0] = new Button("+");  
b_oper[1] = new Button("-");  
b_oper[2] = new Button("*");  
b_oper[3] = new Button("/");  
b_oper[4] = new Button("(1/x)");  
b_oper[5] = new Button("sqrt()");  
b_oper[6] = new Button("lg");  
b_oper[7] = new Button("=");
b_oper[8] = new Button("sin(x)");
for(int i=0; i<9; i++) //  
{  
p_oper.add(b_oper[i]);  
}  t_result.setEditable(false);  
p_show.add(t_result, BorderLayout.NORTH);  
p_main.add(p_show, BorderLayout.NORTH);  
p_main.add(p_num, BorderLayout.WEST);  
p_main.add(p_oper, BorderLayout.EAST);  
this.add(p_main, BorderLayout.CENTER);  
setSize(400, 400);  
setResizable(false);  
pack();  this.addWindowListener(new WindowAdapter(){  
public void windowClosing(WindowEvent e)  
{  
System.exit(0);  
}  
});  
ButtonListener b1 = new ButtonListener();  
for(int i=0; i<12; i++)  
{  
b_num[i].addActionListener(b1);  
}  
for(int i=0; i<9; i++)  
{  
b_oper[i].addActionListener(b1);  
}  
}  class ButtonListener implements ActionListener  
{  
private String lastOp; //存储上一此操作符  
private String strVal; //存储数字对应的字符串  
private double total; //总数  
private double number; //存储新输入的数  
private boolean firsttime; //判断是否第一次按下的是操作符按钮  
private boolean operatorPressed;//判断是否已经按过操作符按钮  ButtonListener()  
{  
firsttime = true;  
strVal = "";  
}  //事件处理器  
public void actionPerformed(ActionEvent e)  
{  
String s = ((Button)e.getSource()).getLabel().trim();  if(Character.isDigit(s.charAt(0)))  
{//判断是操作数还是操作符  
handleNumber(s);  
}  
else  
{  
calculate(s);  
}  
}  //判断是一元操作符还是二元操作符,并根据操作符类型做计算  
void calculate(String op)  
{  
operatorPressed = true;  if(firsttime&&! isUnary(op))  
{  
total = getNumberOnDisplay();  
firsttime = false;  
}  
if(isUnary(op))  
{  
handleUnaryOp(op);  
}  
else if(lastOp != null)  
{  
handleBinaryOp(lastOp);  
}  
if(! isUnary(op))  
{  
lastOp = op;  
}  
}  //判断是否一元操作符  
boolean isUnary(String s)  
{  
return s.equals("=")  
||s.equals("cls")||s.equals("(1/x)")
||s.equals(".")||s.equals("sqrt()")
||s.equals("lg")||s.equals("sin(x)");  
}  //处理一元操作符
void handleUnaryOp(String op)  
{  
if(op.equals("(1/x)"))  
{//  
number = negate(getNumberOnDisplay() + "");  
t_result.setText("");  
t_result.setText(number + "");  
return;  
}
else if(op.equals("lg"))
{
number = Math.log10(Double.parseDouble((getNumberOnDisplay() + "")));  
t_result.setText("");  
t_result.setText(number + "");  
}
else if(op.equals("sin(x)"))
{
number = Math.sin(Double.parseDouble((getNumberOnDisplay() + "")));  
t_result.setText("");  
t_result.setText(number + "");  
}
else if(op.equals("."))  
{  
handleDecPoint();  
return;  
}else if(op.equals("sqrt"))  
{  
number = Math.sqrt(getNumberOnDisplay());  
t_result.setText("");  
t_result.setText(number + "");  
return;  
}else if(op.equals("="))  
{//  
if(lastOp!= null && !isUnary(lastOp))  
{  
handleBinaryOp(lastOp);  
}  
lastOp = null;  
firsttime = true;  
return;  
}else  
{  
clear();  
}  
}  //处理二元运算符  
void handleBinaryOp(String op)  
{  
if(op.equals("+"))  
{  
total +=number;  
}else if(op.equals("-"))  
{  
total -=number;  
}else if(op.equals("*"))  
{  
total *=number;  
}else if(op.equals("/"))  
{  
try  
{  
total /=number;  
}catch(ArithmeticException ae){}  
}else if(op.equals("pow"))  
total = Math.pow(total, number);  
//t_result.setText("");  
lastOp = null;  
// strVal = "";  
number = 0;  
t_result.setText(total + "");  
}  //该方法用于处理数字按钮  
void handleNumber(String s)  
{  
if(!operatorPressed)  
{  
strVal += s;  
}else  
{  
operatorPressed = false;  
strVal = s;  
}  
//  
number = new Double(strVal).doubleValue();  
t_result.setText("");  
t_result.setText(strVal);  
}  //该方法用于按下"."按钮  
void handleDecPoint()  
{  
operatorPressed = false;  
//  
if(strVal.indexOf(".")<0)  
{  
strVal += ".";  
}  
t_result.setText("");  
t_result.setText(strVal);  
}  //该方法用于将一个数求反  
double negate(String s)  
{
Double as = Double.parseDouble(s);
number = 1/as;
return number;  

}  //将显示框中的值转换成Double  
double getNumberOnDisplay()  
{  
return new Double(t_result.getText()).doubleValue();  
}  //清除屏幕并设置所有的标识  
void clear()  
{  
firsttime = true;  
lastOp = null;  
strVal = "";  
total = 0;  
number = 0;  
t_result.setText("0");  
}  
}  
public static void main(String[] args) {  
Caculate c = new Caculate("简单的计算器程序");  
c.setVisible(true);  
}  }