java学习之计算器基本实现

package calculator;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class calculator extends JFrame{
	//文本框
	 private JTextField jtd=new JTextField("0");
	//清除按钮
	 private JButton reset = new JButton("CE");
	//退格按钮
	 private JButton back = new JButton("←");
	//计算器按钮编号
	 private final String[] str={ "7", "8", "9", "/", "4", "5", "6", "*", "1",
	           "2", "3", "-", ".", "0", "=", "+" };
	 
	//构造函数
	 private void init() 
	 {
		 //关闭方式
		 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		 //文本框显示方式
			jtd.setHorizontalAlignment(JTextField.RIGHT);
			
			Container c=getContentPane();
			JPanel jpl=new JPanel();
			JPanel jpl2=new JPanel();
			MyActionListener ma=new MyActionListener();
			c.add(jtd,BorderLayout.NORTH);
			c.add(jpl,BorderLayout.CENTER);
			c.add(jpl2,BorderLayout.SOUTH);

			jpl2.setLayout(new FlowLayout());
			jpl.setLayout(new GridLayout(4,4));
			jpl2.add(back);
			jpl2.add(reset);
			buttonSet(str,ma,jpl);	
			back.addActionListener(ma);
			reset.addActionListener(ma);
			
	 }
		//按钮添加方法
		public  void buttonSet(String[] b, ActionListener obj,JPanel jpl)
		{
			JButton[] buttons=new JButton[b.length];
			for(int i=0;i<b.length;i++)
			{
				buttons[i]=new JButton(b[i]);
				buttons[i].addActionListener(obj);
				jpl.add(buttons[i]);
			}	
		}

	public calculator()
	{
		super("Calculator");
        init();
	
	}
	class MyActionListener implements ActionListener
	{
		 private boolean isFirstDigit = true;
		 // 计算的中间结果。
		 private double resultNum = 0.0;
		 // 当前运算的运算符
		 private String operator = "=";
		 // 操作是否合法
		 private boolean operateValidFlag = true;
		@Override
		public void actionPerformed(ActionEvent e) {
		       String label = e.getActionCommand();
		       Object target = e.getSource();
		     //两种方式都可以
		       /* if (label.equals("CE"))
		           handleReset();
		       else if(label.equals("←"))
		    	   handleBackspace();
		    	   */
		       if (target == reset)
		           handleReset();
		       else if(target==back)
		    	   handleBackspace();
		       else if ("0123456789.".indexOf(label)>=0)
		           handleNumber(label);
		       else
		           handleOperator(label);
		    }

		private void handleReset()
		{
			// TODO Auto-generated method stub
		       jtd.setText("0");
		       isFirstDigit = true;
		       operator = "=";
			
		}
		 /**
	     * 处理Backspace键被按下的事件
	     */
	    private void handleBackspace() {
	        String text = jtd.getText();
	        int i = text.length();
	        if (i > 0) {
	            // 退格,将文本最后一个字符去掉
	            text = text.substring(0, i - 1);
	            if (text.length() == 0) {
	                // 如果文本没有了内容,则初始化计算器的各种值
	                jtd.setText("0");
	                isFirstDigit = true;
	                operator = "=";
	            } else {
	                // 显示新的文本
	                jtd.setText(text);
	            }
	        }
	    }
	    private void handleNumber(String key) {
	        if (isFirstDigit) {
	            // 输入的第一个数字
	            jtd.setText(key);
	        } else if ((key.equals(".")) && (jtd.getText().indexOf(".") < 0)) {
	            // 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面
	            jtd.setText(jtd.getText() + ".");
	        } else if (!key.equals(".")) {
	            // 如果输入的不是小数点,则将数字附在结果文本框的后面
	            jtd.setText(jtd.getText() + key);
	        }
	        // 以后输入的肯定不是第一个数字了
	        isFirstDigit = false;
	    }
	    /**
	     * 处理运算符键被按下的事件
	     *
	     * @param key
	     */
	    private void handleOperator(String key) {
	        if (operator.equals("/")) {
	            // 除法运算
	            // 如果当前结果文本框中的值等于0
	            if (getNumberFromText() == 0.0) {
	                // 操作不合法
	                operateValidFlag = false;
	                jtd.setText("除数不能为零");
	            } else {
	                resultNum /= getNumberFromText();
	            }
	        } else if (operator.equals("+")) {
	            // 加法运算
	            resultNum += getNumberFromText();
	        } else if (operator.equals("-")) {
	            // 减法运算
	            resultNum -= getNumberFromText();
	        } else if (operator.equals("*")) {
	            // 乘法运算
	            resultNum *= getNumberFromText();
	        } else if (operator.equals("=")) {
	            // 赋值运算
	            resultNum = getNumberFromText();
	        }
	        if (operateValidFlag) {
	            // 双精度浮点数的运算
	            long t1;
	            double t2;
	            t1 = (long) resultNum;
	            t2 = resultNum - t1;
	            if (t2 == 0) {
	                jtd.setText(String.valueOf(t1));
	            } else {
	                jtd.setText(String.valueOf(resultNum));
	            }
	        }
	        // 运算符等于用户按的按钮
	        operator = key;
	        isFirstDigit = true;
	        operateValidFlag = true;
    }
 
    /**
     * 从结果文本框中获取数字
     *
     * @return
     */
    private double getNumberFromText() 
    {
        double result = 0;
        try {
            result = Double.valueOf(jtd.getText()).doubleValue();
        } catch (NumberFormatException e) {
        	e.printStackTrace();
        }
        return result;
    }   
}



	public static void main(String[] args)
	{
		calculator ca=new calculator();
		ca.setTitle("calculator");
		ca.setSize(400, 400);
		ca.setVisible(true);
		ca.pack();
		
	}

}

_________________________________________________________________________________________________

计算器的界面搭建是自己完成的,但是内部的具体算法参考了别人的代码,自己的完成度基本就是ctrl+C和Ctrl+V,仅仅修改了适合自己的,没有独立思考。看来自己还需要继续努力。。不行啊。。。

嘎嘎嘎

致谢:

(1).点击打开链接

(2)点击打开链接

阅读更多
换一批

没有更多推荐了,返回首页