import java.awt.BorderLayout;
import java.awt.Color;
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 implements ActionListener{
private final String[]KEYS={"7","8","9","/","sqrt",
"4","5","6","*","%",
"1","2","3","-","1/x",
"0","+/-",".","+","="};//一般键的名称
private final String[]COMMAND={"BackSpace","CE","C"};//功能键的名称
private final String[] M={" ","MC","MR","MS","M+"};//特殊键的名称
private JButton keys[]=new JButton[KEYS.length];//键的按钮 ,数组
private JButton commands[]=new JButton[COMMAND.length];//功能键的按钮
private JButton m[]=new JButton[M.length];//特殊键的按钮
private JTextField resultText=new JTextField("0");//结果文本框
private JTextField resultText1=new JTextField("计科系0703专用计算器!");
private boolean firstDigit=true;//判断用户按的是否是整个表达式的第一个数字,或者是运算符的最后一个字
private double resultNum=0.0;//计算的中间结果
private String operator="=";//运算符
private boolean operateValidFlag=true;//运算是否合法
JFrame f;
//构造函数
public Calculator(){
f=new JFrame();
resultText.setHorizontalAlignment(JTextField.RIGHT);//文本框中的内容右对齐
resultText.setEditable(false);//文本框不可编辑
resultText1.setEditable(false);//文本框不可编辑
resultText.setBackground(Color.WHITE);//文本框背景色
JPanel calckeysPanel=new JPanel();//一般键面板
calckeysPanel.setLayout( new GridLayout(4,5,3,3));
//采用网格布局,4行5列,水平和垂直方向的间隔都是3个像素
for(int i=0;i<KEYS.length;i++){//生成按钮,并添加到面板中
keys[i]=new JButton(KEYS[i]);
calckeysPanel.add(keys[i]);
keys[i].setForeground(Color.BLUE);
}
keys[3].setForeground(Color.darkGray);//修改按钮的前景色
keys[4].setForeground(Color.MAGENTA);
keys[9].setForeground(Color.MAGENTA);
keys[8].setForeground(Color.DARK_GRAY);
keys[13].setForeground(Color.DARK_GRAY);
keys[14].setForeground(Color.MAGENTA);
keys[17].setForeground(Color.MAGENTA);
keys[18].setForeground(Color.DARK_GRAY);
keys[19].setForeground(Color.RED);
//keys[19].setBackground(Color.BLACK);////修改按钮的背景色
JPanel commandsPanel=new JPanel();//功能键面板
commandsPanel.setLayout(new GridLayout(1,3,3,3));
//采用网格布局,1行3列,水平和垂直方向的间隔都是3个像素
for(int i=0;i<COMMAND.length;i++){
commands[i]=new JButton(COMMAND[i]);
commandsPanel.add(commands[i]);
commands[i].setForeground(Color.RED);
}
JPanel calmsPanel=new JPanel();//特殊键面板
calmsPanel.setLayout(new GridLayout(5,1,3,3));
for(int i=0;i<M.length;i++){
m[i]=new JButton(M[i]);
calmsPanel.add(m[i]);
m[i].setForeground(Color.RED);
}
JPanel panel1=new JPanel();//整体面板
panel1.setLayout(new BorderLayout(3,3));//水平和垂直方向的间隔都是3个像素
panel1.add("North",commandsPanel);
panel1.add("Center",calckeysPanel);
JPanel top=new JPanel();//文本框面板
top.setLayout(new BorderLayout(3,3));
top.add("Center",resultText);
JPanel top1=new JPanel();//文本框面板1
top1.setLayout(new BorderLayout(3,3));
top1.add("Center",resultText1);
f.setLayout(new BorderLayout(3,5));
f.add("North",top);
f.add("Center",panel1);
f.add("West",calmsPanel);
f.add("South",top1);
//为每一个按钮注册监听器
for(int i=0;i<KEYS.length;i++){
keys[i].addActionListener(this);
}
for(int i=0;i<COMMAND.length;i++){
commands[i].addActionListener(this);
}
for(int i=0;i<M.length;i++){
m[i].addActionListener(this);
}
f.setBackground(Color.YELLOW);//计算器背景色
f.setTitle("我的计算器");
f.setLocation(500,300);//设置在屏幕上显示的位置
f.setResizable(false);//设置计算器大小不可改变
f.pack();//使计算器中各组件大小合适
f.setVisible(true);
}
//实现监听器接口的actionPerformed方法,处理相应的事件
public void actionPerformed(ActionEvent e){
String label=e.getActionCommand();//获得事件源的标签
if(label.equals(COMMAND[0])){//按下BackSpace键
handleBackspace();
}else if(label.equals(COMMAND[1])){//按下CE键
resultText.setText("0");
}else if(label.equals(COMMAND[2])){//按下C键
handleC();
}else if("0123456789.".indexOf(label)>=0){//按下数字键或者小数点键
handleNumber(label);
}else{//按下运算符键
handleOperator(label);
}
}
//处理按下BackSpace键事件
public void handleBackspace(){
String text=resultText.getText();
int i=text.length();
if(i>0){
text=text.substring(0,i-1);
if(text.length()==0){
resultText.setText("0");
firstDigit=true;
operator="=";
}else{
resultText.setText(text);
}
}
}
//处理按下C键事件
private void handleC(){
resultText.setText("0");
firstDigit=true;
operator="=";
}
//处理按下数字键事件
private void handleNumber(String key){
if(firstDigit){
resultText.setText(key);
}else if((key.equals("."))&& (resultText.getText().indexOf(".")<0)){
resultText.setText(resultText.getText()+".");
}else if(!key.equals(".")){
resultText.setText(resultText.getText()+key);
}
firstDigit=false;
}
//处理按下运算符键事件
private void handleOperator(String key){
if(operator.equals("/")){
if(getNumberFromText()==0.0){
operateValidFlag=false;
resultText.setText("除数不能为零!");
}else{
resultNum/=getNumberFromText();
}
}
else if(operator.equals("1/x")){
if(resultNum==0.0){
operateValidFlag=false;
resultText.setText("0没有倒数!");
}else{
resultNum=1/resultNum;
}
}else if(operator.equals("+")){
resultNum+=getNumberFromText();
}else if(operator.equals("-")){
resultNum-=getNumberFromText();
}else if(operator.equals("*")){
resultNum*=getNumberFromText();
}else if(operator.equals("sqrt")){
resultNum=Math.sqrt(resultNum);
}else if(operator.equals("%")){
resultNum=resultNum/100;
}else if(operator.equals("+/-")){
resultNum=resultNum*(-1);
}else if(operator.equals("=")){
resultNum=getNumberFromText();
}
if(operateValidFlag){
long t1;
double t2;
t1=(long)resultNum;
t2=resultNum-t1;
if(t2==0){
resultText.setText(String.valueOf(t1));
}else{
resultText.setText(String.valueOf(resultNum));
}
}
operator=key;
firstDigit=true;
operateValidFlag=true;
}
//从文本框获取数字
private double getNumberFromText(){
double result=0;
try{
result=Double.valueOf(resultText.getText()).doubleValue();
}catch(NumberFormatException e){}
return result;
}
//主函数
public static void main(String args[]){
Calculator calculator1=new Calculator();
calculator1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);} }