package calculator;
import java.awt.Component;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
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
{
JFrame f;
JTextField tfView;
JButton[] btnNum=new JButton[10];
JButton btnBack,btnC,btnChu,btnCheng,btnJian,btnJia,btnDeng,btnDot,btnSqrt,btnJJ,btnBF,btn1X;
JPanel pan=new JPanel();
public static void main(String[] args) {
(new Calculator()).display();
}
public void display()
{
f=new JFrame("计算器");
f.setSize(300, 280);
f.setLocation(300,200);
f.setResizable(false);
tfView=new JTextField("0.0");
tfView.setEditable(false);
tfView.setHorizontalAlignment(JTextField.RIGHT);
//按键初始化
for(int i=0;i<=9;i++)
btnNum[i]=new JButton(""+i);
btnBack=new JButton("Back");
btnC=new JButton("C");
btnCheng=new JButton("*");
btnChu=new JButton("/");
btnJia=new JButton("+");
btnJian=new JButton("-");
btnDeng=new JButton("=");
btnDot=new JButton(".");
btnSqrt=new JButton("Sqrt");
btnJJ=new JButton("+/-");
btn1X=new JButton("1/x");
btnBF=new JButton("%");
//设置布局
f.setLayout(new GridBagLayout());
GridBagConstraints gbc=new GridBagConstraints();
gbc.fill=GridBagConstraints.BOTH;
gbc.anchor=GridBagConstraints.CENTER;
Container conta=f.getContentPane();
addCom(tfView, conta, gbc, 0, 0, 1, 4, 1, 1);
addCom(btnBack, conta, gbc, 1, 0, 1, 2, 1, 1);
addCom(btnC, conta, gbc, 1, 2, 1, 2, 1, 1);
addCom(btnNum[7], conta, gbc, 2, 0, 1, 1, 1, 1);
addCom(btnNum[8], conta, gbc, 2, 1, 1, 1, 1, 1);
addCom(btnNum[9], conta, gbc, 2, 2, 1, 1, 1, 1);
addCom(btnChu, conta, gbc, 2, 3, 1, 1, 1, 1);
addCom(btnNum[4], conta, gbc, 3, 0, 1, 1, 1, 1);
addCom(btnNum[5], conta, gbc, 3, 1, 1, 1, 1, 1);
addCom(btnNum[6], conta, gbc, 3, 2, 1, 1, 1, 1);
addCom(btnCheng, conta, gbc, 3, 3, 1, 1, 1, 1);
addCom(btnNum[1], conta, gbc, 4, 0, 1, 1, 1, 1);
addCom(btnNum[2], conta, gbc, 4, 1, 1, 1, 1, 1);
addCom(btnNum[3], conta, gbc, 4, 2, 1, 1, 1, 1);
addCom(btnJian, conta, gbc, 4, 3, 1, 1, 1, 1);
addCom(btnNum[0], conta, gbc, 5, 0, 1, 1, 1, 1);
addCom(btnJJ, conta, gbc, 5, 1, 1, 1, 1, 1);
addCom(btnDot, conta, gbc, 5, 2, 1, 1, 1, 1);
addCom(btnJia, conta, gbc, 5, 3, 1, 1, 1, 1);
addCom(btn1X, conta, gbc, 6, 0, 1, 1, 1, 1);
addCom(btnBF, conta, gbc, 6, 1, 1, 1, 1, 1);
addCom(btnSqrt, conta, gbc, 6, 2, 1, 1, 1, 1);
addCom(btnDeng, conta, gbc, 6, 3, 1, 1, 1, 1);
//注册监听
btnBack.addActionListener(this);
btnC.addActionListener(this);
for(int i=0;i<=9;i++){
btnNum[i].addActionListener(this);
}
btnChu.addActionListener(this);
btnCheng.addActionListener(this);
btnJia.addActionListener(this);
btnJian.addActionListener(this);
btnDeng.addActionListener(this);
btnDot.addActionListener(this);
btnSqrt.addActionListener(this);
btnJJ.addActionListener(this);
btnBF.addActionListener(this);
btn1X.addActionListener(this);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
private void addCom(Component c,Container con,GridBagConstraints gbcon,
int row,int col,int numberOfRow,int numberOfCol,
double weightX,double weightY)
{
gbcon.gridx=col;
gbcon.gridy=row;
gbcon.gridwidth=numberOfCol;
gbcon.gridheight=numberOfRow;
gbcon.weightx=weightX;
gbcon.weighty=weightY;
con.add(c,gbcon);
}
boolean isResult=true;
double former_Num=0;
double latter_Num=0;
char function=' ',function2='=';
String errorStr0="0不能作为除数使用,请按Back键重新输入";
String errorStr1="自变量的值不能为负,请按Back键重新输入";
public void actionPerformed(ActionEvent e) {
JButton btnAct=(JButton)e.getSource();
StringBuffer sb=new StringBuffer(tfView.getText());//接受文本框显示的字符串
//返回Back键
if(btnAct==btnBack){
if(sb.toString().equals(errorStr0)||sb.toString().equals(errorStr1)){
tfView.setText(""+former_Num);
latter_Num=0;
function=' ';
isResult=false;
}else if(!isResult&&sb.length()>1&&!sb.toString().equals("0")){
sb.delete(sb.length()-1, sb.length());
tfView.setText(sb.toString());
former_Num=Double.parseDouble(sb.toString());
}else if(!isResult){
tfView.setText("0");
}
}
//清除,C键
if(btnAct==btnC){
tfView.setText("0.0");
isResult=true;
former_Num=latter_Num=0;
function='+';
}
//数字键
if(btnIsNum(btnAct)){
if(!sb.toString().equals(errorStr1)&&!sb.toString().equals(errorStr0)){
int num=getBtnNum(btnAct);
if(isResult){
sb=new StringBuffer();
isResult=false;
}
sb.append(num);
tfView.setText(sb.toString());
}
}
//点
if(btnAct==btnDot){
if(!sb.toString().equals(errorStr1)&&!sb.toString().equals(errorStr0))
if(isResult){
sb=new StringBuffer("0.");
isResult=false;
}else if(sb.indexOf(".")==-1) sb.append(".");
tfView.setText(sb.toString());
}
//加法按键
if(btnAct==btnJia){
if(!sb.toString().equals(errorStr1)&&!sb.toString().equals(errorStr0))
if(!isResult){
if(function==' '||function2=='='){
former_Num=Double.parseDouble(sb.toString());
tfView.setText(""+former_Num);
isResult=true;
function='+';
function2=' ';
}else {
latter_Num=Double.parseDouble(sb.toString());
former_Num=calculate(former_Num,function,latter_Num);
tfView.setText(""+former_Num);
function='+';
isResult=true;
}
}else {
former_Num=Double.parseDouble(sb.toString());
function='+';
function2=' ';
}
}
//减法按键
if(btnAct==btnJian){
if(!sb.toString().equals(errorStr1)&&!sb.toString().equals(errorStr0))
if(!isResult){
if(function==' '||function2=='='){
former_Num=Double.parseDouble(sb.toString());
tfView.setText(""+former_Num);
isResult=true;
function='-';
function2=' ';
}else {
latter_Num=Double.parseDouble(sb.toString());
former_Num=calculate(former_Num,function,latter_Num);
tfView.setText(""+former_Num);
function='-';
isResult=true;
}
}else {
former_Num=Double.parseDouble(sb.toString());
function='-';
function2=' ';
}
}
//乘法按键
if(btnAct==btnCheng){
if(!sb.toString().equals(errorStr1)&&!sb.toString().equals(errorStr0))
if(!isResult){
if(function==' '||function2=='='){
former_Num=Double.parseDouble(sb.toString());
tfView.setText(""+former_Num);
isResult=true;
function='*';
function2=' ';
}else {
latter_Num=Double.parseDouble(sb.toString());
former_Num=calculate(former_Num,function,latter_Num);
tfView.setText(""+former_Num);
function='*';
isResult=true;
}
}else {
former_Num=Double.parseDouble(sb.toString());
function='*';
function2=' ';
}
}
//除法按键
if(btnAct==btnChu){
if(!isResult&&!sb.toString().equals(errorStr1)&&!sb.toString().equals(errorStr0)){
latter_Num=Double.parseDouble(sb.toString());
if(function==' '||function2=='='){
former_Num=Double.parseDouble(sb.toString());
tfView.setText(""+former_Num);
isResult=true;
function='/';
function2=' ';
}else if(latter_Num==0){
tfView.setText(errorStr0);
}else{
former_Num=calculate(former_Num,function,latter_Num);
tfView.setText(""+former_Num);
function='/';
isResult=true;
}
}else if(!sb.toString().equals(errorStr1)&&!sb.toString().equals(errorStr0)){
former_Num=Double.parseDouble(sb.toString());
function='/';
function2=' ';
}
}
//等号按键
if(btnAct==btnDeng){
if(!isResult&&!sb.toString().equals(errorStr1)&&!sb.toString().equals(errorStr0)){
latter_Num=Double.parseDouble(sb.toString());
if(latter_Num==0&&function=='/'){
tfView.setText(errorStr0);
}else if(sb.toString().equals("-")){
former_Num=-former_Num;
tfView.setText(""+former_Num);
isResult=true;
function2='=';
}else if(function==' '||function2=='='){
former_Num=Double.parseDouble(sb.toString());
tfView.setText(""+former_Num);
isResult=true;
function2='=';
}else{
former_Num=calculate(former_Num,function,latter_Num);
tfView.setText(""+former_Num);
isResult=true;
function2='=';
}
}else if(!sb.toString().equals(errorStr1)&&!sb.toString().equals(errorStr0)){
former_Num=calculate(former_Num,function,latter_Num);
tfView.setText(""+former_Num);
isResult=true;
function2='=';
}
}
//Sqrt键位
if(btnAct==btnSqrt){
if(!sb.toString().equals(errorStr1)&&!sb.toString().equals(errorStr0)){
latter_Num=Double.parseDouble(sb.toString());
if(latter_Num<0){
former_Num=latter_Num;
tfView.setText(errorStr1);
}else{
former_Num=Math.sqrt(latter_Num);
tfView.setText(""+former_Num);
isResult=true;
function=' ';
}
}
}
//正负按键
if(btnAct==btnJJ){
if(!sb.toString().equals(errorStr1)&&!sb.toString().equals(errorStr0)){
if(!isResult){
latter_Num=-Double.parseDouble(sb.toString());
tfView.setText(""+latter_Num);
}else{
tfView.setText("-");
isResult=false;
}
}
}
//百分号键位
if(btnAct==btnBF){
if(!sb.toString().equals(errorStr1)&&!sb.toString().equals(errorStr0)){
latter_Num=Double.parseDouble(sb.toString());
former_Num=latter_Num*100;
tfView.setText(""+former_Num);
isResult=true;
function=' ';
}
}
//1/X键位
if(btnAct==btn1X){
if(!sb.toString().equals(errorStr1)&&!sb.toString().equals(errorStr0)){
latter_Num=Double.parseDouble(sb.toString());
former_Num=1/latter_Num;
tfView.setText(""+former_Num);
isResult=true;
function=' ';
}
}
}
//进行四则运算
double calculate(double num1,char c,double num2){
switch(c){
case '+':
return num1+num2;
case '-':
return num1-num2;
case '*':
return num1*num2;
case '/':
return num1/num2;
default:
return former_Num;
}
}
//判断所按按键是否为数字按键
boolean btnIsNum(JButton btnAct){
for(int i=0;i<=9;i++)
if(btnAct==btnNum[i])
return true;
return false;
}
//返回数字按键的数字
int getBtnNum(JButton btnAct){
for(int i=0;i<=9;i++)
if(btnAct==btnNum[i])
return i;
return -1;
}
}