zoukankan      html  css  js  c++  java
  • 我的第一个JAVA程序之计算器 huey

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

    大三刚开始学习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):,如果您要转载此篇文章,我不胜荣幸,请说明转载出处!谢谢大家~

  • 相关阅读:
    2015531 网络攻防 Exp1 PC平台逆向破解(5)M
    2017-2018-1 20155331 嵌入式C语言
    20155330 《网络对抗》 Exp9 web安全基础实践
    20155330 《网络对抗》 Exp8 Web基础
    20155330 《网络对抗》 Exp7 网络欺诈防范
    20155330 《网络对抗》 Exp6 信息搜集与漏洞扫描
    20155330 《网络对抗》 Exp5 MSF基础应用
    20155330 《网络攻防》 Exp4 恶意代码分析
    20155330 《网络攻防》 Exp3 免杀原理与实践
    20155330 《网络对抗》 Exp2 后门原理与实践
  • 原文地址:https://www.cnblogs.com/hueychan/p/10575919.html
Copyright © 2011-2022 走看看