[Java小程序] 实现简单计算器

        这学期没事学了一点点Java,想写个程序练手,因为只学了一点点,所以暂时只能先写个实现简单功能的计算器练练。感觉写完后不是很好,如果路过的哪位高手给点建议,小弟万分感激啊。

        由于期末来了,没太多时间,所以暂时就实现最简单的功能,等考试结束有时间再捣腾吧。

        个人不喜欢用大量文字记叙程序,而且该程序也相对简单,所以直接画了张程序框架图,再配合代码的注释,就明白程序的原理了。



图 计算器程序框架

代码如下:

package tst.jframe;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import java.awt.Font;
import javax.swing.SwingConstants;

public class javaAP {
	
	/**
	 * 各控件对象的建立
	 * 
	 * */
	private JFrame frame;
	private JTextField result;
	private JButton button_1;
	private JButton button_2;
	private JButton button_3;
	private JButton button_4;
	private JButton button_5;
	private JButton button_6;
	private JButton button_7;
	private JButton button_8;
	private JButton button_9;
	private JButton button_0;
	private JButton Button_equal;
	private JButton button_dot;
	private JButton button_d0;
	private JButton button_plus;
	private JButton button_sub;
	private JButton button_clr;
	private JButton button_dlt;
	private JButton button_mul;
	private JButton button_div;
	
	/**
	 * 几个变量,用于计算、判定,存放结构等。
	 * */
	private boolean numflag = false;     //用于标识是否输入数字
	private boolean opflag = false;		 //用于标识是否输入运算操作符
	private String txt = null;			 //显示结果的文本框的文本内容,用于存放计算结果的字符串形式
	private String num_txt = "";		 //每次输入一个数,以字符的形式加到该字符创变量,后面运算直接将该字符创转成double类型进行运算
	private String op = " ";			 //存放输入的运算操作符
	private double num1 = 0;			 //num1和num2用作运算	
	private double num2 = 0;


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

	/**
	 *	调用控件初始化函数,创建程序。
	 */
	public javaAP() {
		initialize();
	}
	

	/**
	 * 初始化计算器的各个控件。
	 */
	private void initialize() {
		frame = new JFrame();                                   //-----------------------------------------------
		frame.setResizable(false);								//
		frame.setBounds(100, 100, 371, 371);					//	窗口各个属性的初始化
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	//
		frame.getContentPane().setLayout(null);					//-----------------------------------------------
		
		result = new JTextField();								//-----------------------------------------------
		result.setFont(new Font("Lao UI", Font.BOLD, 15));		//
		result.setHorizontalAlignment(SwingConstants.RIGHT);    //
		result.setBounds(29, 28, 308, 50);						//  显示结果的文本框的各个属性的初始化
		frame.getContentPane().add(result);						//
		result.setColumns(10);									//
		result.setText(txt);									//-----------------------------------------------
		
		
		/**
		 * 0-9, 小数点,00 各个控件的初始化,给每个控件添加动作监听事件,每个控件被按下则调用numBtnAction函数。
		 * 
		 * */
		
		button_0 = new JButton("0");
		button_0.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				numBtnAction("0");
			}
		});
		button_0.setBounds(99, 273, 50, 50);
		frame.getContentPane().add(button_0);
		
		button_1 = new JButton("1");
		button_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
					numBtnAction("1");
			}
		});
		button_1.setBounds(99, 213, 50, 50);
		frame.getContentPane().add(button_1);
		
		button_2 = new JButton("2");
		button_2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
					numBtnAction("2");
			}
		});
		button_2.setBounds(159, 213, 50, 50);
		frame.getContentPane().add(button_2);
		
		button_3 = new JButton("3");
		button_3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				numBtnAction("3");
			}
		});
		button_3.setBounds(219, 213, 50, 50);
		frame.getContentPane().add(button_3);
		
		button_4 = new JButton("4");
		button_4.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				numBtnAction("4");
			}
		});
		button_4.setBounds(99, 157, 50, 50);
		frame.getContentPane().add(button_4);
		
		button_5 = new JButton("5");
		button_5.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				numBtnAction("5");
			}
		});
		button_5.setBounds(159, 157, 50, 50);
		frame.getContentPane().add(button_5);
		
		button_6 = new JButton("6");
		button_6.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				numBtnAction("6");
			}
		});
		button_6.setBounds(219, 157, 50, 50);
		frame.getContentPane().add(button_6);
		
		button_7 = new JButton("7");
		button_7.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				numBtnAction("7");
			}
		});
		button_7.setBounds(99, 97, 50, 50);
		frame.getContentPane().add(button_7);
		
		button_8 = new JButton("8");
		button_8.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				numBtnAction("8");
			}
		});
		button_8.setBounds(159, 97, 50, 50);
		frame.getContentPane().add(button_8);
		
		button_9 = new JButton("9");
		button_9.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				numBtnAction("9");
			}
		});
		button_9.setBounds(219, 97, 50, 50);
		frame.getContentPane().add(button_9);
				
		button_dot = new JButton(".");
		button_dot.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				numBtnAction(".");
			}
		});
		button_dot.setFont(new Font("宋体", Font.BOLD, 15));
		button_dot.setBounds(159, 273, 50, 50);
		frame.getContentPane().add(button_dot);
		
		button_d0 = new JButton("00");
		button_d0.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				numBtnAction("00");
			}
		});
		button_d0.setBounds(219, 273, 50, 50);
		frame.getContentPane().add(button_d0);
		
		/**
		 * 运算符  =,+,-,*,/ 的初始化。
		 * */
		
		Button_equal = new JButton("=");
		Button_equal.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(opflag == true){
					num2 = Double.parseDouble(num_txt);  //如果此时opflag为true的话,证明已经输入运算符,这时候刚输入的数为另外一个操作数,所以赋给num2。
					calc(op);							//num1和num2进行运算。
				}
				result.setText(new Double(num1).toString());   //显示结果。
			}
		});
		Button_equal.setBounds(279, 213, 50, 110);
		frame.getContentPane().add(Button_equal);
		
		button_plus = new JButton("+");
		button_plus.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				opBtnAction("+");
			}
		});
		button_plus.setBounds(279, 97, 50, 50);
		frame.getContentPane().add(button_plus);
		
		button_sub = new JButton("-");
		button_sub.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				opBtnAction("-");
			}
		});
		button_sub.setBounds(279, 157, 50, 50);
		frame.getContentPane().add(button_sub);
		
		button_mul = new JButton("*");
		button_mul.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				opBtnAction("*");
			}
		});
		button_mul.setBounds(39, 157, 50, 50);
		frame.getContentPane().add(button_mul);
		
		button_div = new JButton("/");
		button_div.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				opBtnAction("/");
			}
		});
		button_div.setBounds(39, 97, 50, 50);
		frame.getContentPane().add(button_div);
		
		/**
		 * 功能键clr:清空   和  dlt回删   两个按键的初始化。
		 * 
		 * */
		
		button_clr = new JButton("clr");
		button_clr.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				result.setText(null); 							//清楚文本框和num_txt,num1和num2全部置为0,
				txt = null;										//numflag和opflag均置为false,全部置为程序开始的默认值。
				numflag = opflag = false;
				num1 = num2 = 0;
				num_txt = "";
			}
		});
		button_clr.setBounds(39, 273, 50, 50);
		frame.getContentPane().add(button_clr);
		
		button_dlt = new JButton("dlt");
		button_dlt.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(num_txt != "" && num_txt.length() > 0) {
					num_txt = num_txt.substring(0, num_txt.length() - 1);  //通过截取字符串的方式回删一个字符
				}
				if(txt != null && txt.length() > 0) {
					txt = result.getText().substring(0,txt.length() - 1);  //结果文本框的回删
					result.setText(txt);
				}
			}
		});
		button_dlt.setBounds(39, 213, 50, 50);
		frame.getContentPane().add(button_dlt);
			
	}
	
	/**
	 * 每个数字按键按下后触发的功能。
	 * 
	 * @param num 传入字符串形式的数字
	 * 
	 * */
	private void numBtnAction(String num) {	
		if(num_txt == "" && opflag == false) {    //判断是否num_txt是否为空,opflag是否为false,若满足这两个
			result.setText(null);				  //条件,则为一次运算完毕,切新运算不以该次结果继续做运算。
			num_txt = "";
		}	
		numflag = true;							  //只要输入一个数,则把numflag置为true,表示已有数字输入
		num_txt += num;							  //把输入的数加入到最终要转换成都double运算的字符串
		txt = result.getText() + num;			  //加到txt,使输入的数显示到文本框中。
		result.setText(txt);
		
	}
	
	/**
	 * 点下运算符键触发的动作
	 * 
	 * @param operator 点击的运算符
	 * 
	 * */
	private void opBtnAction(String operator) {
		

		if(opflag == false && num_txt != "") {	  //进行判断,如果opflag为false,则表示还没输入运算符,									
			num1 = Double.parseDouble(num_txt);	  //这个时候把num_txt转换成double赋给num1。
		}
		if(opflag == true && num_txt != ""){
			num2 = Double.parseDouble(num_txt);	  //如果opflag为true,表示第一个数输入完毕,且已输入相应的运算符,这个时候是在输入第二个要参与运算的数,则加到num2
			calc(op);							  //先计算两数结果,赋给num1,num2置为0,以便后面多层混合运算使用。
		}
		numflag = false;						  //numflag置为0,表示当前需要输入数进行运算
		op = operator;							  //把新输入的运算符赋给op
		result.setText(operator + " ");			  //在文本框显示
		opflag = true;							  //opflag置为true,表示当前已输入一个或多个操作数。
		num_txt = "";							  //num_txt置为空,为了存储下一个操作数。
	}
	
	/**
	 * 进行  +、-、*、/ 的运算
	 * @param op 运算符 
	 * 
	 * */
	private void calc(String op) {
		switch(op){
		case "+" : 
				   num1 = num1 + num2;
				   num2 = 0;
				   opflag = false;
				   num_txt = "";
				   break;
				   
		case "-" :
				   num1 = num1 - num2;
				   num2 = 0;
				   opflag = false;
				   num_txt = "";
				   break;
				   
		case "*" :
					if(num2 != 0) {
						num1 = num1 * num2;
						num2 = 0;
						opflag = false;
						num_txt = "";
					}
					break;
					
		case "/" : 
					if(num2 != 0) {
						num1 = num1 / num2;
						num2 = 0;
						opflag = false;
						num_txt = "";
					}	
					break;
					
		default:   opflag = false;
				   num_txt = "";
				   break;
		}
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值