java计算器

来源:互联网 发布:mac平时关机还是待机 编辑:程序博客网 时间:2024/05/02 04:20
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Calculator extends Frame implements ActionListener
{
    
static MenuBar mb = new MenuBar();//添加菜单
    static Menu menu = new Menu("Help");
    
static MenuItem about = new MenuItem("About Calculator 1.0");
    
static Calculator frame = new Calculator();
    
static JPanel panel = new JPanel(new GridLayout(4455));
    
static JPanel panel2 = new JPanel(new GridLayout(1255));
    
static JButton[] button = new JButton[18]; 
    
static JLabel label = new JLabel("0.", JLabel.RIGHT);
    StringBuffer buf 
= new StringBuffer();
    
static String state = new String("Clean");//用来记录上一次的操作
    
//static boolean pmmdState = false; //用来记录加减乘除过没有,默认没有
    static boolean pointState = false//用来指示小数点状态,默认没按小数点
    static boolean zeroState = true//用来指示0在首位的状态,true表示在首位
    static boolean zeroState2 = false//用来记录按了一次0键没有,默认没按
    static boolean numState = false//指示在小数点之前按了数字键没有,默认没按
    static boolean signState = true//指示正负号, true为正, false为负.
    static boolean likeEqual = false//指示按加减乘除时该不该计算出结果.默认不该
    static boolean keyLock = false//按键锁,当发生除0异常时,锁住除Clean键以外的所有键,默认没锁
    String str = new String();
    
double num1 = 0, num2 = 0;
    
public static void main(String[] args)
    
{
        
int i;
        menu.add(about);
//菜单
        mb.add(menu);
        about.addActionListener(frame);
        frame.setMenuBar(mb);
        frame.setTitle(
"Calculator");
        frame.setLayout(
null);
        frame.setSize(
290320);
        frame.setVisible(
true);
        frame.setResizable(
false); //若程序无法显示完整的图形界面,可将它设为true
        frame.addWindowListener(new WindowAdapter()
        
{
                
public void windowClosing(WindowEvent e)
                
{
                    System.exit(
0);
                }

        }
);
        panel.setBounds(
20130250165);
        panel2.setBounds(
209025033);
        label.setBounds(
205025035);
        label.setFont(
new Font("result", Font.PLAIN, 18));
        label.setOpaque(
true);
        label.setBackground(
new Color(125125180));
        Font font 
= new Font("Times New Roman", Font.PLAIN, 16);
        
for(i = 0; i < 18; i++)
        
{
            button[i] 
= new JButton();
            button[i].setFont(font);
        }

        
for(i = 1; i < 10; i++)
        
{
            button[i].setText(Integer.toString(i));
            panel.add(button[i]);
        }

        button[
0].setText("0");
        button[
10].setText("+/-");
        button[
11].setText(".");
        panel.add(button[
0]);
        panel.add(button[
10]);
        panel.add(button[
11]);
        button[
12].setText("+");
        button[
13].setText("-");
        button[
14].setText("*");
        button[
15].setText("/");
        panel.add(button[
12], 3);
        panel.add(button[
13], 7);
        panel.add(button[
14], 11);
        panel.add(button[
15], 15);
        button[
16].setText("Clean");
        button[
17].setText("=");
        panel2.add(button[
16], 0);
        panel2.add(button[
17], 1);
        frame.add(label);
        frame.add(panel);
        frame.add(panel2);
        
for(i = 0; i < 18; i++)
        
{
            button[i].addActionListener(frame);
            button[i].setActionCommand(button[i].getText());
        }

    }

    
public void actionPerformed(ActionEvent e)
    
{
        
int i;
        String[] estate 
= {"+""-""*""/""="};
        
for(i = 1; i < 10; i++)//1-9数字键
        {
            
if(e.getActionCommand().equals(Integer.toString(i)) && keyLock == false)
            
{
                
if(pointState == false)
                
{
                    str 
= new String(buf.append(i) + ".");
                    label.setText(str);
                    numState 
= true;
                    
break;
                }

                
else
                
{
                    str 
= new String(buf.append(i));
                    label.setText(str);
                    numState 
= true;
                    
break;
                }

            }

        }

        
if(e.getActionCommand().equals("0"&& keyLock == false)//0键
        {
            zeroState2 
= true;
            
if(zeroState == true && numState == false && pointState == false)//这句也很关键
            {
                label.setText(
"0.");
                buf 
= new StringBuffer("0");//这条语句关系到后面的异常处理
            }

            
else
            
{
                zeroState 
= false;
                
if(pointState == false)
                
{
                    str 
= new String(buf.append(0+ ".");
                    label.setText(str);
                    numState 
= true;
                }

                
else
                
{
                    str 
= new String(buf.append(0));
                    label.setText(str);
                }

            }

        }

        
if(e.getActionCommand().equals("."&& keyLock == false)//小数点键
            if(pointState == false)
            
{
                
if(numState == false)
                
{
                    
if(zeroState2 == true)//判断按了0键没有
                        buf.append(".");
                    
else
                        buf.append(
"0.");
                    label.setText(
new String(buf));//这句必须要有
                    pointState = true;
                }

                
else
                
{
                    buf.append(
".");
                    label.setText(
new String(buf));
                    pointState 
= true;
                }

            }

        
if(e.getActionCommand().equals("Clean"))//Clean键
        {
            buf 
= new StringBuffer();
            label.setText(
"0.");
            state 
= new String("Clean"); //记录上次操作
            pointState = false;
            zeroState 
= true;
            zeroState2 
= false;
            numState 
= false;
            signState 
= true;
            likeEqual 
= false;
            keyLock 
= false//撤消按键锁
        }

        
for(i = 0; i < 4; i++)//+-*/运算
        {
            activeLikeEqual();
            
if(e.getActionCommand().equals(estate[i]) && keyLock == false)
            
{
                
if(likeEqual == false)
                
{
                    num1 
= num2 = Double.parseDouble(label.getText());
                    buf 
= new StringBuffer();
                    state 
= new String(estate[i]);
                    pointState 
= false;//将小数点再次设置为未使用
                    zeroState = true;
                    zeroState2 
= false
                    numState 
= false;
                    signState 
= true;
                    
break;
                }

                
else
                
{
                    resultOperate();
                    renewState();
                    state 
= new String(estate[i]);
                    num2 
= num1; //1+2+=之类的操作
                }

            }

        }

        
        
if(e.getActionCommand().equals("="&& keyLock == false)//=运算
        {
            
if(state.equals("Clean"))
            
{
                    label.setText(label.getText());
//又解决一个bug -> 按3=显示0.
                    buf = new StringBuffer();
                    state 
= new String("Clean"); //记录上次操作
                    pointState = false;
                    zeroState 
= true;
                    zeroState2 
= false;
                    numState 
= false;
                    signState 
= true;
            }

            
else
            
{
                resultOperate();
                renewState();
            }

        }

        
        
if(e.getSource() == about)
        
{
            JOptionPane.showMessageDialog(frame, 
"Version: Calculator 1.0  Author: Mr. tan  All Rights Reserved",
            
"About Calculator 1.0", JOptionPane.INFORMATION_MESSAGE);
        }

        
if(e.getActionCommand().equals("+/-"&& keyLock == false)
        
{
            
if(zeroState == true && numState == false && pointState == false)
            
{
            }

            
else
            
{
                
if(signState == true)
                
{
                    buf.insert(
0'-');
                    
if(pointState == false)
                        label.setText(
new String(buf) + ".");
                    
else
                        label.setText(
new String(buf));
                    signState 
= false;
                }

                
else
                
{
                    buf.deleteCharAt(
0);
                    
if(pointState == false)
                        label.setText(
new String(buf) + ".");
                    
else
                        label.setText(
new String(buf));
                    signState 
= true;
                }

            }

        }

    }

    
    
//计算结果的方法,因为有时候按+-*/号时也需要计算出结果,所以把它写在一起节省代码。
    public void resultOperate()
    
{
        
if(buf.length() > 0)
        
{
            str 
= new String(buf); //考虑这用buf还是label.getText()
            num2 = Double.parseDouble(str);
        }

        
//else num2 = num1; //1+2+=之类的操作
        if(state.equals("+"))
            num1 
+= num2;
        
else if(state.equals("-"))
            num1 
-= num2;
        
else if(state.equals("*"))
            num1 
*= num2;
        
if(state.equals("/")) //对/要进行异常处理
        {
            
try
            
{
                
if(num2 != 0)
                
{
                    num1 
/= num2;
                }

                
else
                    
throw new ArithmeticException();
            }

            
catch(ArithmeticException ZeroException)
            
{
                label.setText(
"I think your IQ is only 80!!");
                keyLock 
= true;//启动按键锁
                return;//防止出现9/0=9这样的bug
            }

        }

        StringBuffer calculateResult 
= new StringBuffer(Double.toString(num1));
        
if(calculateResult.charAt(calculateResult.length() - 2== '.' && 
            calculateResult.charAt(calculateResult.length() 
- 1== '0')
            calculateResult.deleteCharAt(calculateResult.length() 
- 1);
        label.setText(
new String(calculateResult));    
    }

    
public void activeLikeEqual()//激活+-*/的计算功能
    {
        
if((state.equals("+"|| state.equals("-"||
        state.equals(
"*"|| state.equals("/")) && 
        buf.length() 
> 0)
            likeEqual 
= true;
    }

    
public void renewState()
    
{
        buf 
= new StringBuffer();
        pointState 
= false;
        zeroState 
= true;
        zeroState2 
= false;
        numState 
= false;
        signState 
= true;
        likeEqual 
= false;
    }

}
 
原创粉丝点击