JAVA-计算器

实现了一个最简单的计算机GUI,和JAVA核心技术写的还是有点不一样的...

package myswing;

import javax.swing.*;
import javax.swing.text.Document;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Arc2D;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by baidu on 15/12/30.
 */

public class CalculatorTest {
    public static void main(String [] argc) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                CalculatorFrame mC = new CalculatorFrame();
                mC.setTitle("Calculator");
                mC.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                mC.setVisible(true);
            }
        });
    }
}


class CalculatorFrame extends JFrame {
    private JPanel mPanelKey = new JPanel();
    private JButton mButtonShow = new JButton();
    private String mNumShow = new String();
    private boolean mStart = true;

    private class NumListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent _event) {
            //Show Num
            if(mStart) {
                mNumShow = mNum;
                mButtonShow.setText(mNumShow);
                mStart = false;
            } else {
                mNumShow += mNum;
                mButtonShow.setText(mNumShow);
            }

        }

        public NumListener(String _Num) {
            mNum = _Num;
        }

        String mNum = null;
    }

    private class OperatorListener implements ActionListener {

        public OperatorListener(String _oper) {
            mOper = _oper;
        }

        @Override
        public void actionPerformed(ActionEvent _event) {
            if(mStart) {
                return ;
            }

            if(!mStart && mNumShow != null)
            {
                if(!mOper.equals("=")) {
                    mButtonShow.setText("");    //清空数据框
                    Calculate.getInstance().SetOperAndNum(mOper, mNumShow);
                }
                else{   // =
                    //传入数值
                    Calculate.getInstance().SetOperAndNum(mOper, mNumShow);
                    //进行操作
                    mButtonShow.setText(
                            Double.toString(Calculate.getInstance().getResult())
                    );

                    Calculate.getInstance().ClearOper();
                }

                mStart = true;
            }

        }

        String mOper = null;
    }

    private void addButton(String _strName) {
        JButton mJButton = new JButton(_strName);
        mPanelKey.add(mJButton);
        //正则表达式, 来调用不同的listener
        Pattern mPatter = Pattern.compile("[0-9.]");
        Matcher mMatcher = mPatter.matcher(_strName);
        ActionListener mAction = null;
        if(mMatcher.find())
            mAction = new NumListener(_strName);
        else
            mAction = new OperatorListener(_strName);


        mJButton.addActionListener(mAction);
    }

    private void addViewContent() {
        mButtonShow.setEnabled(false);
        add(mButtonShow, BorderLayout.NORTH);
    }


    private void panelAddButton() {
        addButton("7");
        addButton("8");
        addButton("9");
        addButton("/");
        addButton("4");
        addButton("5");
        addButton("6");
        addButton("*");
        addButton("1");
        addButton("2");
        addButton("3");
        addButton("-");
        addButton("0");
        addButton(".");
        addButton("=");
        addButton("+");
    }

    public CalculatorFrame() {
        setLayout(new BorderLayout());
        mPanelKey.setLayout(new GridLayout(4, 4));
        add(mPanelKey, BorderLayout.SOUTH);

        panelAddButton();
        addViewContent();

        pack();
    }
}

class Calculate {
    private String mOper = null;
    private double mBeforeNum = 0;
    private Double mDoubleRes = null;
    static private Calculate mCal = null;

    static public Calculate getInstance() {
       if(mCal == null)
           mCal = new Calculate();

        return mCal;
    }

    private void CalculateOper(String _Num) {
        if(mOper == null)
            return;

        switch(mOper) {
            case "+" :
                mBeforeNum += Double.parseDouble(_Num);
                break;

            case "-" :
                mBeforeNum -= Double.parseDouble(_Num);
                break;

            case "*" :
                mBeforeNum *= Double.parseDouble(_Num);
                break;

            case "/" :
                if(mBeforeNum == 0.0 || mBeforeNum == 0)
                    return;
                mBeforeNum /= Double.parseDouble(_Num);
                break;
        }
    }

    public double getResult() {
        return mBeforeNum;
    }

    public void SetOperAndNum(String _oper, String _Num) {
        if(_oper == null)
            return;

        if(_oper.equals("+") || _oper.equals("-") || _oper.equals("*") || _oper.equals("/")) {
            if(mOper == null) {
                mOper = _oper;
                mBeforeNum = Double.parseDouble(_Num);
            }
            else {
                CalculateOper(_Num);
                mOper = _oper;
            }
        }
        else if(_oper.equals("=")) {
            CalculateOper(_Num);
        }
    }

    public void ClearOper() {
        mOper = null;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值