我的第一个JAVA程序之计算器

这是我的第一篇博客!为什么想写博客呢?以前我也经常写一些东西在有道云笔记,但是有道云笔记不能同大家共享,博客写出来以后除了给大家共享之外,还能同大家交流。我是一个学生,我写的可能有很多的错误,但我将它写出来与大家分享,也希望大家给我一点建议!

大三刚开始学习Java,以前学过C#和ASP.net。刚开始学习JAVA,不太习惯,但是JAVA有他自己的优势。学到后面也就熟悉了他的编程特点。第一个JAVA窗口程序老师就让我们仿照Windows自带的计算器编写一个计算器程序。其实以前用C#编写过一个计算器程序,当时界面模仿的很像,但是功能只有简单地加减乘除计算。这一次的计算器可没有当时那么简单,当时可以在Visual Studio里面拖控件,但这次我全部是在eclipse里面写的代码,这也是一种很好的锻炼吧。废话不说了,开始讲我的第一个程序的编写过程和自己的一些想法,希望大家多给一点建议!

一、仿照做一个计算器界面

计算器可谓是我们再熟悉不过的了,这是Windows自带的计算器界面。

首先,我将这个计算器的界面分为三部分,第一部分最上面的菜单栏部分,然后是接下来的文本区域部分,最后是按钮部分。确定了这三个部分,就能开始设计界面了。先在eclipse里面建好一个项目。然后新建类。一个主类onemain,再建一个继承与JFrame的WindowCalculator类。主类里面很简单,只是实例化了WindowCalculator类,设置了标题和边框,主要代码如下:

                WindowCalculator win=new WindowCalculator();
		win.setTitle("计算器");
		win.setBounds(600,260,233,328);
这里我设置的窗口大小是根据Windows自带的计算器大小,怎么获取大小,你可以按Print Screen截屏再用Photoshop看大小,我这里介绍一种简单有效的方法,就是用QQ自带的截屏功能,同时按住 Ctrl+Alt+A ,鼠标指到计算器它会显示大小。然后是再新建一个WindowCalculator类。在这里首先定义菜单、文本框、所有按钮和一个panel面板。这里我将所有的按钮都定义了,代码有点繁琐,其实可以用数组和for循环来定义,但想到如果以后布局和添加键盘事件等,还是每个都定义直观一点。主要代码如下:

        JMenuBar menubar;
	JMenu lookMenu,editMenu,helpMenu;
	JMenuItem lookItem1,lookItem2,lookItem3,editMenu1,editMenu2,helpMenu1,helpMenu2;
	JTextField text;
	JPanel topPanel;
	//{加:btnAdd}、{减:btnSub}、{乘:btnMul}、{除:btnDiv}、{等于:btnEqu}、{小数点:btnDon}、{撤销:btnBack}、{清除所有:btnC}、{清除当前:btnCE}、{正负号:btnSorM}、{根号:btnRoot}、{百分比:btnPer}、{x分之一:btnX1}
	JButton btnMC,btnMR,btnMS,btnMadd,btnMSub,btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btn0,btnAdd,btnSub,btnMul,btnDiv,btnDon,btnEqu,btnBack,btnCE,btnC,btnSorM,btnRoot,btnPer,btnX1;
然后在WindowCalculator类的构造方法里面调用方法init()和设置窗口不能改变大小等,代码如下:

WindowCalculator(){
		init();
		setVisible(true);
		setResizable(false);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
在init()方法里面进行详细的布局,先是添加菜单,接着添加文本框,再添加按钮。为了布局的好看和方便,布局采用空布局,这样我们能够控制每个控件的大小和方位,所有按钮都添加到Panel面板里面,panel面板的布局也是空布局。这里举例查看菜单的添加方法别的和这个类似,代码如下:

                menubar=new JMenuBar();
		lookMenu=new JMenu("查看(V)");
/*查看菜单*/
		lookItem1=new JMenuItem("标准型(T)");
		lookItem1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1,InputEvent.ALT_MASK));
		lookItem2=new JMenuItem("科学型(S)");
		lookItem2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_2,InputEvent.ALT_MASK));
		lookItem3=new JMenuItem("退出(E)");
		lookItem3.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4,InputEvent.ALT_MASK));
/*添加菜单*/
		lookMenu.add(lookItem1);
		lookMenu.add(lookItem2);
		lookMenu.addSeparator();//添加分隔符
		lookMenu.add(lookItem3);
                menubar.add(lookMenu);
                setJMenuBar(menubar);
接着设置文本框,设置大小、文本右对齐等等,代码如下:

/**********************文本框**************************/
		text=new JTextField(18);
		text.setBounds(3, 3, 220, 50);
		text.setHorizontalAlignment(JTextField.RIGHT);//文本右对齐
		text.setText("0");//第一次显示0
		text.setEditable(false);//禁止键盘输入
		text.setBackground(Color.white);
		computer.setJTextField(text);
		add(text);
然后就是设置每个按钮的大小和方位,然后添加到panel面板,设置panel面板的大小和布局。这里举一个例子,别的按钮类似。代码如下:

                btnMC=new JButton("MC");
		btnMC.setBounds(0, 0, 34, 27);
		btnMC.setMargin(new Insets(0,0,0,0));//设置按钮的margin为0
                topPanel.add(btnMC);
                add(topPanel);
		topPanel.setBounds(11, 60, 220, 260);
		topPanel.setLayout(null);
这样,就完全模仿Windows自带的计算器将一个界面弄了出来,写的代码有点多,但是自己感觉整体思路还比较清晰,大家有另外的好的想法可以交流一下。做出来的整体效果如图:


这里的菜单我只是添加了,没有任何作用。

二、添加事件

做完了界面然后开始给每个按钮添加事件,这里我新建了一个类ComputerListener,ComputerListener类实现接口ActionListener。因为这里的事件涉及到了按钮和文本框,所以要返回WindowCalculator类给文本框和每个按钮添加监听器。这里不做过多解释。添加完了监听器之后返回ComputerListener类写事件。代码如下:

public class ComputerListener implements ActionListener{
	JButton button;
	JTextField text;
	ComputeController control=new ComputeController();
	public void setJTextField(JTextField t){
		text=t;
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		try{
			control.BtnClick(e.getActionCommand());
			text.setText(control.showNewNum());
			//JOptionPane.showMessageDialog(text, text.getText());//(text, text.getText(), JOptionPane.WARNING_MESSAGE);
			//text.setText(e.getActionCommand());
		}
		catch(Exception exp){
			text.setText("出现未知错误!");
		}
	}
}
这里先提一下ComputeController类,这是一个控制计算的类,下面我会具体讲。首先看按钮点击的事件方法actionPerformed,control.BtnClick这个方法是ComputeController类里面的,e.getActionCommand()返回的是点击按钮上面的字符。text.setText是控制JTextField文本框的显示。

三、控制计算类ComputeController
做完了计算器的界面和添加了事件,这里专门又新建了一个类用来控制计算。首先要定义以下变量,当然以后可能还要定义别的变量,代码如下:

String strOld=null,strSign=null,strShow="0";//strOld是上一次的数据;strShow是显示的字符串;strSign是符号
boolean isClickSign=false;//这里是判断上一个点击的是不是符号
这几个变量里面我strOld是记录上一次输入的数据,strSign是记录你输入的运算符号,strShow是当前显示的内容,默认为0,布尔变量isClickSign是确定你上一次点击的是不是运算符号(PS:当你先输入数字点击运算符号是,你输入的字符还在显示,但是接着输入数字时会消失)。然后我们定义一个方法BtnClick,这个方法就是在ComputerListener类里面调用的方法,代码如下:

/****************此方法根据哪个按钮被触发并执行相应的方法****************/
	public void BtnClick(String btnLable){
		if(btnLable=="0"||btnLable=="1"||btnLable=="2"||btnLable=="3"||btnLable=="4"||btnLable=="5"||btnLable=="6"||btnLable=="7"||btnLable=="8"||btnLable=="9"){
			strShow=ShowNumOfOldNum(strShow,btnLable);
		}
		if(btnLable=="="){
			NumberEqu();
		}
		if(btnLable=="C"){
			NumberC();
		}
		if(btnLable=="CE"){
			NumberCE();
		}
		if(btnLable=="←"){
			NumberBack();
		}
		if(btnLable=="±"){}
		if(btnLable=="√"){}
		if(btnLable=="."){
			NumberDon();
		}
		if(btnLable=="+"){
			NumberAdd();
		}
		if(btnLable=="-"){
			NumberSub();
		}
		if(btnLable=="*"){
			NumberMul();
		}
		if(btnLable=="/"){
			NumberDiv();
		}
	}
这个方法是通过传过来的参数btnLable获取你当时点击的是哪个按钮,然后根据不同的按钮来调用不同的方法!然后定义了一个showNewNum()方法,这个方法也是在ComputerListener类里面调用的方法,代码如下:
/*显示数据*/
	public String showNewNum()
	{
		return strShow;
	}
这个方法很简单,就是输出字符串strShow。

不知道讲到这里大家有没有懂。我是运用了MVC框架来设计整个的计算器,关于整个计算器,我将他的视图和计算部分分开,这样有一个好处就是我以后修改程序只需在控制类ComputeController里面修改代码和算法,当你要添加哪个功能,比如求根运算,只需写一个方法,添加到BtnClick里面即可。接下来我列举控制类里面的个别方法,代码如下:

/**********运算的计算与判断*********/
	public void CalculateToString(){
		double dou;
		double douOld=StringToDouble(strOld);
		double douShow=StringToDouble(strShow);
		if(strSign=="+"){
			dou=douOld+douShow;
			strShow=DoubleToString(dou);
			strOld=strShow;
		}
		if(strSign=="-"){
			dou=douOld-douShow;
			strShow=DoubleToString(dou);
			strOld=strShow;
		}
		if(strSign=="*"){
			dou=douOld*douShow;
			strShow=DoubleToString(dou);
			strOld=strShow;
		}
		if(strSign=="/"){
			dou=douOld/douShow;
			strShow=DoubleToString(dou);
			strOld=strShow;
		}
	}

/************这里是字符串与Double类型的转换*************/
	public String DoubleToString(Double dou){
		try{
			String s=dou.toString();
			return s;
		}
		catch(Exception e){
			return "请检查你的输入";
		}
	}
	public double StringToDouble(String s){
		try{
			double dou=Double.parseDouble(s.trim());
			return dou;
		}
		catch(Exception e){
			return 0;
		}
	}

/*加法计算*/
	public void NumberAdd(){
		if(strSign==null&&strOld==null){
			strSign="+";
			strOld=strShow;
			isClickSign=true;
		}
		else if(strSign!=null&&strOld!=null){
			CalculateToString();
			isClickSign=true;
		}
	}

/*小数点*/
	public void NumberDon(){
		if(strShow.contains(".")){
			return;
		}
		if(isClickSign==true)
		{
			isClickSign=false;
			strShow="0.";
		}
		else{
			strShow=strShow+".";
		}
	}

/*全部清除归零*/
	public void NumberC(){
		strOld=null;
		strSign=null;
		strShow="0";
	}
	/*清除当前*/
	public void NumberCE(){
		strShow="0";
	}
	/*撤销返回*/
	public void NumberBack(){
		if(strShow.length()==1||strShow.length()==0){
			strShow="0";
		}
		else{
			strShow=strShow.substring(0, strShow.length()-1);
		}
	}

/*根据原有的显示输出字符*/
	public String ShowNumOfOldNum(String OldNum,String InputNum){
		if(OldNum=="0"&&InputNum=="0"){
			return 	"0";
		}
		if(OldNum=="0"){
			return InputNum;
		}
		if(OldNum=="0."){
			return "0."+InputNum;
		}
		if(isClickSign==true)
		{
			isClickSign=false;
			return InputNum;
		}
		else{
			return OldNum+InputNum;
		}
	}

别的一些方法我这里就不列举了,我写的方法不是完全正确的,运行起来还是有一些问题和BUG,但是只要你能写一个完美的算法,这个计算器一定能达到Windows自带的功能。关于整个算法的流程,我这里推荐Microsoft Visio,你在写之前可以先做一些整个算法的流程图,这样会帮助你更全面的编写代码。

以下是我的计算器的一些截图,

这个项目文件:

代码截图:


这个计算器的作业就到这里,这是我的第一个JAVA程序,也是第一篇博客,大三学生、热爱编程者一枚请大家多多支持,要是有什么疑问或者观点,可以同我交流(QQ:1364887879 ;E-mail: xq_cxd@126.com):,如果您要转载此篇文章,我不胜荣幸,请说明转载出处!谢谢大家~

posted @ 2013-11-15 13:53  huey-chan  阅读(608)  评论(0编辑  收藏  举报