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

  • 相关阅读:
    采用闭锁(CountDownLatch)控制线程的先后顺序(一)
    采用java信号量(semaphore)让线程轮流打印
    生产者消费者模式的java实现(实现四)
    生产者消费者模式的java实现(实现三)
    生产者消费者模式的java实现(实现二)
    生产者消费者模式的java实现(实现一)
    求最大子串和 最长子串的java写法
    Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process 异常处理
    定时任务服务器不定时重启原因解析
    centos 6.3 + gerrit-2.8.6 + repo 实践
  • 原文地址:https://www.cnblogs.com/hueychan/p/10575919.html
Copyright © 2011-2022 走看看