王功胜牌计算器

 

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.GridBagLayout;
import javax.swing.JLabel;
import java.awt.SystemColor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.math.MathContext;

import javax.swing.SwingConstants;
import javax.swing.JTextField;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JMenu;
import java.util.ArrayList;
import java.awt.Font;

public class MainClass extends JFrame implements ActionListener {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JMenuItem menuItemM;
	private JMenuItem menuItemAbout;
	private JMenu menuEdit;
	private JMenu menuHelp;
	private JMenu menuLook;
	private JMenuBar menuBar;
	private JPanel contentPane;
	private JTextField textField1;
	private JTextField textFieldOp;
	private JTextField textField2;
	private ArrayList<BigDecimal>mList = null;
	private BigDecimal num1=null;
	private BigDecimal num2=null;
	private String operator=null;
	private JFrame FrameAbout = null;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					MainClass frame = new MainClass();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public MainClass() {
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setBounds(100, 100, 429, 532);
		
		menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		menuLook = new JMenu("\u67E5\u770B");
		menuBar.add(menuLook);
		
		menuEdit = new JMenu("\u7F16\u8F91");
		menuBar.add(menuEdit);
		
		menuHelp = new JMenu("\u5E2E\u52A9");
		menuBar.add(menuHelp);
		
		menuItemM = new JMenuItem("M");
		menuLook.add(menuItemM);
		menuItemM.addActionListener(this);
		
		
		menuItemAbout = new JMenuItem("关于");
		menuHelp.add(menuItemAbout);
		menuItemAbout.addActionListener(this);
		menuItemAbout.setActionCommand("About");
		
		contentPane = new JPanel();
		contentPane.setBackground(SystemColor.activeCaption);
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		textField1 = new JTextField();
		textField1.setFont(new Font("黑体", Font.BOLD, 20));
		textField1.setHorizontalAlignment(SwingConstants.RIGHT);
		textField1.setBounds(0, 0, 418, 39);
		contentPane.add(textField1);
		textField1.setColumns(10);
		
		textFieldOp = new JTextField();
		textFieldOp.setFont(new Font("黑体", Font.BOLD, 20));
		textFieldOp.setHorizontalAlignment(SwingConstants.RIGHT);
		textFieldOp.setColumns(10);
		textFieldOp.setBounds(0, 38, 418, 39);
		contentPane.add(textFieldOp);
		
		textField2 = new JTextField();
		textField2.setFont(new Font("黑体", Font.BOLD, 20));
		textField2.setHorizontalAlignment(SwingConstants.RIGHT);
		textField2.setColumns(10);
		textField2.setBounds(0, 75, 418, 39);
		contentPane.add(textField2);
		
		JButton buttonMC = new JButton("MC");
		buttonMC.setBounds(0, 174, 72, 29);
		contentPane.add(buttonMC);
		buttonMC.addActionListener(this);
		buttonMC.setActionCommand("MC");
		
		JButton buttonMR = new JButton("MR");
		buttonMR.setBounds(82, 174, 72, 29);
		contentPane.add(buttonMR);
		buttonMR.addActionListener(this);
		buttonMR.setActionCommand("MR");
		
		JButton buttonMS = new JButton("MS");
		buttonMS.setBounds(167, 174, 72, 29);
		contentPane.add(buttonMS);
		buttonMS.addActionListener(this);
		buttonMS.setActionCommand("MS");
		
		JButton buttonMadd = new JButton("M+");
		buttonMadd.setBounds(254, 174, 72, 29);
		contentPane.add(buttonMadd);
		buttonMadd.addActionListener(this);
		buttonMadd.setActionCommand("M+");
		
		JButton buttonMsub = new JButton("M-");
		buttonMsub.setBounds(341, 174, 72, 29);
		contentPane.add(buttonMsub);
		buttonMsub.addActionListener(this);
		buttonMsub.setActionCommand("M-");
		
		JButton buttonDelete = new JButton("<=");
		buttonDelete.setBounds(0, 218, 72, 29);
		contentPane.add(buttonDelete);
		buttonDelete.addActionListener(this);
		buttonDelete.setActionCommand("<=");
		
		JButton buttonCE = new JButton("CE");
		buttonCE.setBounds(82, 218, 72, 29);
		contentPane.add(buttonCE);
		buttonCE.addActionListener(this);
		buttonCE.setActionCommand("CE");
		
		JButton buttonC = new JButton("C");
		buttonC.setBounds(167, 218, 72, 29);
		contentPane.add(buttonC);
		buttonC.addActionListener(this);
		buttonC.setActionCommand("C");
		
		JButton buttonAddSub = new JButton("\u00B1");
		buttonAddSub.setBounds(254, 218, 72, 29);
		contentPane.add(buttonAddSub);
		buttonAddSub.addActionListener(this);
		buttonAddSub.setActionCommand("AddSub");
		
		JButton buttonSqrt = new JButton("\u221A\uFFE3");
		buttonSqrt.setBounds(341, 218, 72, 29);
		contentPane.add(buttonSqrt);
		buttonSqrt.addActionListener(this);
		buttonSqrt.setActionCommand("Sqrt");
		
		JButton button7 = new JButton("7");
		button7.setBounds(0, 262, 72, 29);
		contentPane.add(button7);
		button7.addActionListener(this);
		button7.setActionCommand("7");
		
		JButton button8 = new JButton("8");
		button8.setBounds(82, 262, 72, 29);
		contentPane.add(button8);
		button8.addActionListener(this);
		button8.setActionCommand("8");
		
		JButton button9 = new JButton("9");
		button9.setBounds(167, 262, 72, 29);
		contentPane.add(button9);
		button9.addActionListener(this);
		button9.setActionCommand("9");
		
		JButton buttonDiv = new JButton("/");
		buttonDiv.setBounds(254, 262, 72, 29);
		contentPane.add(buttonDiv);
		buttonDiv.addActionListener(this);
		buttonDiv.setActionCommand("/");
		
		JButton buttonMod = new JButton("%");
		buttonMod.setBounds(341, 262, 72, 29);
		contentPane.add(buttonMod);
		buttonMod.addActionListener(this);
		buttonMod.setActionCommand("%");
		
		JButton button4 = new JButton("4");
		button4.setBounds(0, 306, 72, 29);
		contentPane.add(button4);
		button4.addActionListener(this);
		button4.setActionCommand("4");
		
		JButton button5 = new JButton("5");
		button5.setBounds(82, 306, 72, 29);
		contentPane.add(button5);
		button5.addActionListener(this);
		button5.setActionCommand("5");
		
		JButton button6 = new JButton("6");
		button6.setBounds(167, 306, 72, 29);
		contentPane.add(button6);
		button6.addActionListener(this);
		button6.setActionCommand("6");
		
		JButton buttonMul = new JButton("*");
		buttonMul.setBounds(254, 306, 72, 29);
		contentPane.add(buttonMul);
		buttonMul.addActionListener(this);
		buttonMul.setActionCommand("*");
		
		JButton buttonInverse = new JButton("1/x");
		buttonInverse.setBounds(341, 306, 72, 29);
		contentPane.add(buttonInverse);
		buttonInverse.addActionListener(this);
		buttonInverse.setActionCommand("1/x");
		
		JButton button1 = new JButton("1");
		button1.setBounds(0, 350, 72, 29);
		contentPane.add(button1);
		button1.addActionListener(this);
		button1.setActionCommand("1");
		
		JButton button2 = new JButton("2");
		button2.setBounds(82, 350, 72, 29);
		contentPane.add(button2);
		button2.addActionListener(this);
		button2.setActionCommand("2");
		
		JButton button3 = new JButton("3");
		button3.setBounds(167, 350, 72, 29);
		contentPane.add(button3);
		button3.addActionListener(this);
		button3.setActionCommand("3");
		
		JButton buttonSub = new JButton("-");
		buttonSub.setBounds(254, 350, 72, 29);
		contentPane.add(buttonSub);
		buttonSub.addActionListener(this);
		buttonSub.setActionCommand("-");
		
		JButton button0 = new JButton("0");
		button0.setBounds(0, 394, 154, 29);
		contentPane.add(button0);
		button0.addActionListener(this);
		button0.setActionCommand("0");
		
		JButton buttonPoint = new JButton(".");
		buttonPoint.setBounds(167, 394, 72, 29);
		contentPane.add(buttonPoint);
		buttonPoint.addActionListener(this);
		buttonPoint.setActionCommand(".");
		
		JButton buttonAdd = new JButton("+");
		buttonAdd.setBounds(254, 394, 72, 29);
		contentPane.add(buttonAdd);
		buttonAdd.addActionListener(this);
		buttonAdd.setActionCommand("+");
		
		JButton buttonEqual = new JButton("=");
		buttonEqual.setBounds(341, 350, 72, 73);
		contentPane.add(buttonEqual);
		buttonEqual.addActionListener(this);
		buttonEqual.setActionCommand("=");
		
		num1 = BigDecimal.ZERO;
		num2 = BigDecimal.ZERO;
		mList = new ArrayList<BigDecimal>();
		textField2.setText("0");
		textField1.setEditable(false);
		textFieldOp.setEditable(false);
		textField2.setEditable(false);
	}
	public void actionPerformed(ActionEvent e)
	{
		JButton button = null;
		JMenuItem menuItem = null;
		String command =null;
		try
		{
			button = (JButton)e.getSource();
			command = button.getActionCommand();
		}catch(Exception exception)
		{
			
			try
			{
				menuItem = (JMenuItem)e.getSource();
				command = menuItem.getActionCommand();
			}catch(Exception ex)
			{
				
			}
			
		}
		
		switch(command)
		{
			case "0":
				String text = textField2.getText();
				int len = text.length();
				if(len==1&&text.equals("0"))
				{
					//do nothing
				}
				else if(len<20)
				{
					textField2.setText(text+"0");
				}
				break;
				
			case "1":case "2":case "3":case "4":case "5":case "6":case "7":case "8":case "9":
				text = textField2.getText();
				len = text.length();
				if(len==1 && text.equals("0"))
				{
					textField2.setText(command);
				}
				else if(len<20)
				{
					textField2.setText(text+command);
				}
				else
				{
					JOptionPane.showMessageDialog(null, "数据过大"); 
				}
				break;
				
			case "MC":
				mList.clear();
				break;
				
			case "MR":
				int size = mList.size();
				if(size==0)
				{
					JOptionPane.showMessageDialog(null, "内存中没有保存数据"); 
				}
				else
				{
					textField2.setText(mList.get(size-1).toString());
				}
				break;
				
			case "MS":
				try
				{
					BigDecimal num = new BigDecimal(textField2.getText());
					mList.add(num);
				}catch(Exception exception)
				{
					JOptionPane.showMessageDialog(null, "输入的数据错误,请重新输入");
					textField2.setText("0");
				}
				break;
				
			case "M+":
				size = mList.size();
				if(size==0)
				{
					try
					{
						BigDecimal num = new BigDecimal(textField2.getText());
						mList.add(num);
					}catch(Exception exception)
					{
						System.out.println(exception.toString());
					}
				}
				else
				{
					try
					{
						mList.set(size-1, mList.get(size-1).add(new BigDecimal(textField2.getText())));
					}catch(Exception exception)
					{
						System.out.println(exception.toString());
					}
				}
				break;
				
			case "M-":
				size = mList.size();
				if(size==0)
				{
					try
					{
						BigDecimal num = BigDecimal.ZERO.subtract(new BigDecimal(textField2.getText()));
						mList.add(num);
					}catch(Exception exception)
					{
						System.out.println(exception.toString());
					}				
				}
				else
				{
					try
					{
						mList.set(size-1,mList.get(size-1).subtract(new BigDecimal(textField2.getText())));
					}catch(Exception exception)
					{
						System.out.println(exception.toString());
					}
				}
				break;
				
			case "<=":
				text = textField2.getText();
				len = text.length();
				if(len==1)
				{
					textField2.setText("0");
				}
				else
				{
					textField2.setText(text.substring(0, len-1));
				}
				break;
				
			case "CE":
				textField2.setText("0");
				break;
				
			case "C":
				num1 = BigDecimal.ZERO;
				num2 = BigDecimal.ZERO;
				textField1.setText("");
				textFieldOp.setText("");
				textField2.setText("0");
				operator = null;
				break;
				
			case "AddSub":
				text = textField2.getText();
				try
				{
					num2 = BigDecimal.ZERO.subtract(new BigDecimal(text));
					textField2.setText(num2.toString());
				}catch(Exception exception)
				{
					JOptionPane.showMessageDialog(null, "输入的数据错误,请重新输入");
					textField2.setText("0");
				}
				break;
				
			case "Sqrt":
				try
				{
					text = textField2.getText();
					num2 = new BigDecimal(text);
					if(num2.compareTo(BigDecimal.ZERO)<0)
					{
						System.out.println("被开方数小于0");
						JOptionPane.showMessageDialog(null, "被开方数小于0");
					}
					else
					{
						try
						{
							num2 = sqrt(num2);
						}catch(Exception exception)
						{
							System.out.println(exception.toString());
						}
						textField2.setText(num2.toString());
					}
				}catch(Exception exception)
				{
					
				}
				break;
				
			case "/":
				textFieldOp.setText("/"); //设置当前符号
				if(operator==null || operator.equals("="))//如果上一个符号为null,说明这是一个表达式的开始,将当前的textField2内容存入num1
				{
					text = textField2.getText();
					num2 = BigDecimal.ZERO;
					if(operator==null)//如果是表达式的开始,
					{
						num1 = new BigDecimal(text);
					}
					else
					{
						num1 = new BigDecimal(text);
					}
					operator = "/";
					textField1.setText(num1.toString());
					textField2.setText("0");
				}
				else //如果上一个符号不是null,说明是一个表达式,进行运算后结果保存在num1中
				{
					text = textField2.getText();
					num2 = new BigDecimal(text);
					num1 = calc(num1,num2,operator);
					textField1.setText(num1.toString());
					operator = "/";
					textField2.setText("0");
				}
				break;
				
			case "%":
				break;
				
			case "*":
				textFieldOp.setText("*"); //设置当前符号
				if(operator==null || operator.equals("="))//如果上一个符号为null,说明这是一个表达式的开始,将当前的textField2内容存入num1
				{
					text = textField2.getText();
					num2 = BigDecimal.ZERO;
					if(operator==null)//如果是表达式的开始,
					{
						num1 = new BigDecimal(text);
					}
					else
					{
						num1 = new BigDecimal(text);
					}
					operator = "*";
					textField1.setText(num1.toString());
					textField2.setText("0");
				}
				else //如果上一个符号不是null,说明是一个表达式,进行运算后结果保存在num1中
				{
					text = textField2.getText();
					num2 = new BigDecimal(text);
					num1 = calc(num1,num2,operator);
					textField1.setText(num1.toString());
					operator = "*";
					textField2.setText("0");
				}
				break;
				
			case "1/x":
				text = textField2.getText();
				try
				{
					num2 = new BigDecimal(text);
					if(num2.equals(BigDecimal.ZERO))
					{
						System.out.println("除数为0");
						JOptionPane.showMessageDialog(null, "除数为0");					
					}
					else
					{
						num2 = BigDecimal.ONE.divide(num2, 18,BigDecimal.ROUND_UP);
						String num2Str = num2.toString();
						textField2.setText(num2Str);
					}
				}catch(Exception exception)
				{
					System.out.println(exception.toString());
					//JOptionPane.showMessageDialog(null, "x输入的数据错误,请重新输入");
					//textField2.setText(num2.toString());
				}
				break;
				
			case "-":
				textFieldOp.setText("-"); //设置当前符号
				if(operator==null || operator.equals("="))//如果上一个符号为null,说明这是一个表达式的开始,将当前的textField2内容存入num1
				{
					text = textField2.getText();
					num2 = BigDecimal.ZERO;
					if(operator==null)//如果是表达式的开始,
					{
						num1 = new BigDecimal(text);
					}
					else
					{
						num1 = new BigDecimal(text);
					}
					operator = "-";
					textField1.setText(num1.toString());
					textField2.setText("0");
				}
				else //如果上一个符号不是null,说明是一个表达式,进行运算后结果保存在num1中
				{
					text = textField2.getText();
					num2 = new BigDecimal(text);
					num1 = calc(num1,num2,operator);
					textField1.setText(num1.toString());
					operator = "-";
					textField2.setText("0");
				}
				break;
				
			case "+":
				textFieldOp.setText("+"); //设置当前符号
				if(operator==null || operator.equals("="))//如果上一个符号为null,说明这是一个表达式的开始,将当前的textField2内容存入num1
				{
					text = textField2.getText();
					num2 = BigDecimal.ZERO;
					if(operator==null)//如果是表达式的开始,
					{
						num1 = new BigDecimal(text);
					}
					else
					{
						num1 = new BigDecimal(text);
					}
					operator = "+";
					textField1.setText(num1.toString());
					textField2.setText("0");
				}
				else //如果上一个符号不是null,说明是一个表达式,进行运算后结果保存在num1中
				{
					text = textField2.getText();
					num2 = new BigDecimal(text);
					num1 = calc(num1,num2,operator);
					textField1.setText(num1.toString());
					operator = "+";
					textField2.setText("0");
				}
				break;
				
			case "=":				
				if(operator==null)
				{
					textField1.setText("");
					textFieldOp.setText("");
					text = textField2.getText();
					num2 = new BigDecimal(text);
					textField2.setText(num2.toString());
				}
				else if(operator.equals("="))
				{
					//do nothing
				}
				else
				{
					text = textField2.getText();
					num2 = new BigDecimal(text);
					num1 = calc(num1,num2,operator);
					operator = "=";
					textField1.setText("");
					textFieldOp.setText("");
					textField2.setText(num1.toString());
				}
				break;
				
			case ".":
				text = textField2.getText();
				len = text.length();
				if(text.charAt(len-1)=='.')
				{
					//do nothing
				}
				else if(len<20)
				{
					boolean have = false;
					for(int i=0;i<len;i++)
					{
						if(text.charAt(i)=='.') have = true;
					}
					if(have==false)
					{
						textField2.setText(text+".");
					}
					else
					{
						JOptionPane.showMessageDialog(null, "无法继续输入小数点");
					}
				}
				break;
			case "M":
				size = mList.size();
				String store="";
				for(int i=size-1;i>=0;i--)
				{
					store+="\n"+mList.get(i).toString();
				}
				JOptionPane.showMessageDialog(null, store);
				break;	
			case "About":
				//System.out.println("help");
				String message = "关于:王功胜牌计算器\n2018/12/13日制造成功!16:07";
				int x = this.getBounds().x;
				int y = this.getBounds().y;
				FrameAbout = new JFrame("帮助关于");
				FrameAbout.setBounds(x,y,500,500);
				FrameAbout.setVisible(true);
				FrameAbout.getContentPane().setLayout(new GridBagLayout ());
				JLabel label = new JLabel(message);
				label.setFont(new Font("黑体",Font.BOLD,20));
				FrameAbout.getContentPane().add(label);
				FrameAbout.validate();
				break;
		}
	}
	public static BigDecimal sqrt(BigDecimal num) {
        if(num.compareTo(BigDecimal.ZERO) < 0) {
            return BigDecimal.ZERO;
        }
        BigDecimal x = num.divide(new BigDecimal("2"), MathContext.DECIMAL128);
        while(x.subtract(x = sqrtIteration(x, num)).abs().compareTo(new BigDecimal("0.0000000000000000000001")) > 0);
        return x;
    }
     
    private static BigDecimal sqrtIteration(BigDecimal x, BigDecimal n) {
        return x.add(n.divide(x, MathContext.DECIMAL128)).divide(new BigDecimal("2"), MathContext.DECIMAL128);
    }
    public static BigDecimal calc(BigDecimal x,BigDecimal y,String op)
    {
    	BigDecimal ans = BigDecimal.ZERO;
    	switch(op)
    	{
	    	case "+":
	    		ans = x.add(y);
	    		break;
	    		
	    	case "-":
	    		ans = x.subtract(y);
	    		break;
	    		
	    	case "*":
	    		ans = x.multiply(y);
	    		break;
	    		
	    	case "/":
	    		if(y.equals(BigDecimal.ZERO))
	    		{
	    			System.out.println("除数为0");
	    		}
	    		else
	    		{
	    			ans = x.divide(y);
	    		}
	    		break;	    		
    	}
    	return ans;
    }
}
发布了44 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_38060122/article/details/84993193