java计算器

    技术2022-05-11  36

    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;    }}  

    最新回复(0)