实训报告参考(计算器)

时间:2024.4.20

实训项目一——Java电子计算器

【需求分析】

在日常生活中经常需要用到计算器,比如科学计算、数值计算、会计业务等,在Applet中实现一个精巧实用的计算器,可以让用户在使用网站服务的同时,可以很方便地进行数据运算,可增加页面的实用性,同时让用户的操作也更方便与快捷。本项目需要实现一个简单的四则运算的计算器,拥有加、减、乘、除功能。

【项目目的】

理解并掌握Java中的类、对象、继承、方法等概念,以及Applet的基本框架和事件处理的方法。

学会使用JDK编写、调试和运行Java Applet应用程序。

利用awt组件编写一个计算器,实现基本的四则运算。

【项目分解】

1、 界面设计

整个界面由3个面板组成,第1个面板放置输入信息和运算结果的显示文本域以及一个清除输入的按钮。setLayout方法用于设置容器的布局管理器,这里采用流布局,即FlowLayout,所有放置的组件按大小依次排列。

第2个面板放置数字按钮、点按钮及等于按钮。在for循环中,依次实例化9个数字按钮,并将按钮用add方法加入到第2面板中。

setForeground方法可为组件设置前景色,这里将按钮文字设置为红色(Color.red)显示,以将功能按钮与数字按钮区分开来。

第3个面板放置4个运算符:加、减、乘、除。

最后,将3个面板放置到Applet中,Applet按照FlowLayout布局,依次加入的3个面板会按照加入的顺序及它们的尺寸放置到合适的位置。

2.事件处理

事件处理流程如下图所示:

事件处理通过action方法来完成,方法体如下所示:

public boolean action(Event e, Object o) {}

可通过Event类的target变量来获取事件来源,如下面的语句,将e.target与等于按钮bEqual相比较,如果相符,则事件来源于等于按钮,这里应调用对应的方法处理运算结果,并显示出来。

if(e.target == bEqual) {

            doOperator();

}

初始化过程:

(1)定义相关组件和变量

(2)Applet的初始化(init)

(3).事件处理 (actionPerformed)

(4).其他自定义方法

方法:doOperator,doClear, doForeText

按钮输入的处理过程如下:

(1)输入数据→ForeText

(2)输入运算符→CurrentOp

ForeText→BackText(第一运算数), ForeText=""

CurrentOp→PreOp

(3)输入数据→ForeScreen

(4)输入运算符→OpCurrent

3. 数值运算

从输入得到的都是字符串,在运算之前,需要转换成其他数据类型。这里,需要将字符串转换成double值。首先,从字符串得到一个Double类的实例,以该实例的doubleValue方法可得与字符串对应的double值。也可以用Double类的parseDouble方法直接从字符串得到double值。

在if语句中,将运算符与字符“+”比较,得到运算类型,如果为加,则直接将两者相加,得到运算结果,并通过setText方法将结果显示在文本域中。

源代码清单

import java.awt.*;

import java.applet.*;

public class Calculator extends Applet{

    TextField tfAnswer; //显示输入和结果的文本域

   Button bPoint,bEqual,bPlus,bMinus,bClear,bMulti,bDivision; //运算符按钮

 Button[] b=new Button[10];  //数字按钮

 

   String currentOp,preOp; //当前操作和上一步操作

 String foreText,backText; //当前输入和上一次输入

   boolean isFloat = false; //运算类型标志

 

  public void init() {

  Panel panel1=new Panel();  //实例化面板

  Panel panel2=new Panel();

  Panel panel3=new Panel();

 

     currentOp = new String(""); //实例化各组件

     preOp = new String("");

     foreText = new String("");

     backText = new String("");

     tfAnswer = new TextField(8);

     setBackground(Color.lightGray); //设置Applet背景色

     setForeground(Color.blue);   //设置Applet前景色      

    

  for(int i=9;i>=0;i--){

   b[i]=new Button(Integer.toString(i)); //实例化数字按钮

   panel2.add(b[i]); //增加按钮到面板

  }       

 

     bPoint = new Button("."); //实例化按钮

     bEqual = new Button("=");

     bEqual.setForeground(Color.red);   //设置按钮前景色

     bClear = new Button("清除");

     bClear.setForeground(Color.red);

     bDivision = new Button("/");

     bDivision.setForeground(Color.red);

     bMulti = new Button("*");

     bMulti.setForeground(Color.red);

     bMinus = new Button("-");

     bMinus.setForeground(Color.red);   

     bPlus = new Button("+");

     bPlus.setForeground(Color.red);   

  setLayout(new FlowLayout()); //设置布局管理器

  panel1.setLayout(new FlowLayout());

  panel2.setLayout(new GridLayout(4,3));

  panel3.setLayout(new GridLayout(4,1));

     panel1.add(tfAnswer); //增加组件到面板

  panel1.add(bClear);

  panel2.add(bPoint);

  panel2.add(bEqual);

  panel3.add(bPlus);

  panel3.add(bMinus);

  panel3.add(bMulti);

  panel3.add(bDivision);

  add(panel1); //增加组件到Applet

  add(panel2);

  add(panel3);

   }

 

   public boolean action(Event e, Object o) { //事件处理

     String s = new String("");

      for(int i=0;i<10;i++){

   if(e.target==b[i]||e.target==bPoint){ //按钮事件来自于数字按钮和点按钮

          if(e.target != bPoint) {

             s = (String)o;

             doForeText(s); //处理输入

          }

          if((e.target == bPoint)&&(!isFloat)){ //浮点数输入

             isFloat = true; //设置运算标志

            s = (String)o;

             if(foreText.equals("")){

                foreText += "0.";  //增加小数点前面0

             }

             else{

               doForeText(s);

             }

          }

        }

       }     

       if(e.target == bClear) {

         doClear();  //清除输入

       }     

       if((e.target == bMulti)||(e.target == bDivision)|| (e.target == bPlus)||(e.target == bMinus)) { //处理运算

         if(foreText != ""){

           currentOp = ((String)o);

            doOperator();  //处理运算

         }

         else {

            preOp = ((String)o);

           }

       }     

       if(e.target == bEqual) { //等于按钮事件处理

         doOperator(); //处理运算

       } 

  return true; 

 }

 

   public void doOperator(){

     double dFore,dBack;

     Double d;

   

     if(preOp.equals("")) {

        backText = foreText;

        foreText = "";

        tfAnswer.setText(backText); //显示文本

     }

     else {

        dFore = (new Double(foreText)).doubleValue(); //得到第一输入

        dBack = (new Double(backText)).doubleValue(); //得到第二输入

        foreText = "";

        backText = tfAnswer.getText();

     

        if(preOp.equals("+")) { //加运算处理

          d = new Double((dBack + dFore)); //得到运算结果

          tfAnswer.setText(d.toString());  //显示运算结果

          backText = d.toString();

        }

        if(preOp.equals("-")) {

          d = new Double((dBack - dFore));//得到运算结果

          tfAnswer.setText(d.toString()); //显示运算结果

          backText = d.toString();

        }

        if(preOp.equals("*")) {

          d = new Double((dBack * dFore));//得到运算结果

          tfAnswer.setText(d.toString());//显示运算结果

          backText = d.toString();

        }

        if(preOp.equals("/")) {

         if (dFore==0){

          tfAnswer.setText("除数不能为0"); //显示出错信息

          return;

         }

          d = new Double((dBack / dFore));//得到运算结果

          tfAnswer.setText(d.toString());//显示运算结果

          backText = d.toString();

        }

     }

     //Math.sin();

     preOp = currentOp;

   }

 

   public void doForeText(String s) {

     foreText += s;

     tfAnswer.setText(foreText); //显示输入

   }

 

   public void doBackText(String s){

     backText = foreText;

     foreText = "";

     tfAnswer.setText(foreText); //显示输入

   }

 

  public void doClear() { //清除输入

     currentOp = "";

     preOp = "";

     foreText = "";

     backText = "";

     isFloat = false;

     tfAnswer.setText("");

   }

}

【相关知识】

由于同一个事件源上可能发生多种事件,因此java采取了授权处理机制(Delegation Model),事件源可以把在其自身所有可能发生的事件分别授权给不同的事件处理者来处理。比如在Canvas对象上既可能发生鼠标事件,也可能发生键盘事件,该Canvas对象就可以授权给事件处理者一来处理鼠标事件,同时授权给事件处理者二来处理键盘事件。有时也将事件处理者称为监听器,主要原因也在于监听器时刻监听着事件源上所有发生的事件类型,一旦该事件类型与自己所负责处理的事件类型一致,就马上进行处理。授权模型把事件的处理委托给外部的处理实体进行处理,实现了将事件源和监听器分开的机制。事件处理者(监听器)通常是一个类,该类如果要能够处理某种类型的事件,就必须实现与该事件类型相对的接口。例如类ButtonHandler之所以能够处理ActionEvent事件,原因在于它实现了与ActionEvent事件对应的接口ActionListener。每个事件类都有一个与之相对应的接口。

  将事件源对象和事件处理器(事件监听器)分开。如图所示

    

使用授权处理模型进行事件处理的一般方法归纳如下:

  1.对于某种类型的事件XXXEvent, 要想接收并处理这类事件,必须定义相应的事件监听器类,该类需要实现与该事件相对应的接口XXXListener;

  2.事件源实例化以后,必须进行授权,注册该类事件的监听器,使用addXXXListener(XXXListener ) 方法来注册监听器。

与AWT有关的所有事件类都由java.awt.AWTEvent类派生,它也是EventObject类的子类。AWT事件共有10类,可以归为两大类:低级事件和高级事件。

java.util.EventObject类是所有事件对象的基础父类,所有事件都是由它派生出来的。AWT的相关事件继承于java.awt.AWTEvent类,这些AWT事件分为两大类:低级事件和高级事件,低级事件是指基于组件和容器的事件,当一个组件上发生事件,如:鼠标的进入,点击,拖放等,或组件的窗口开关等,触发了组件事件。高级事件是基于语义的事件,它可以不和特定的动作相关联,而依赖于触发此事件的类,如在TextField中按Enter键会触发ActionEvent事件,滑动滚动条会触发AdjustmentEvent事件,或是选中项目列表的某一条就会触发ItemEvent事件。

  ◇ 低级事件

  ComponentEvent( 组件事件:组件尺寸的变化,移动)

  ContainerEvent( 容器事件:组件增加,移动)

  WindowEvent( 窗口事件:关闭窗口,窗口闭合,图标化)

  FocusEvent( 焦点事件:焦点的获得和丢失)

  KeyEvent( 键盘事件:键按下、释放)

  MouseEvent( 鼠标事件:鼠标单击,移动)

  ◇ 高级事件(语义事件)

  ActionEvent(动作事件:按钮按下,TextField中按Enter键)

  AdjustmentEvent(调节事件:在滚动条上移动滑块以调节数值)

  ItemEvent(项目事件:选择项目,不选择"项目改变")

  TextEvent(文本事件,文本对象改变)

  每类事件都有对应的事件监听器,监听器是接口,根据动作来定义方法。

例如,与键盘事件KeyEvent相对应的接口是:

  public interface KeyListener extends EventListener {

     public void keyPressed(KeyEvent ev);

     public void keyReleased(KeyEvent ev);

     public void keyTyped(KeyEvent ev);

  }

  注意到在本接口中有三个方法,那么java运行时系统何时调用哪个方法?其实根据这三个方法的方法名就能够知道应该是什么时候调用哪个方法执行了。当键盘刚按下去时,将调用keyPressed( )方法执行,当键盘抬起来时,将调用keyReleased( )方法执行,当键盘敲击一次时,将调用keyTyped( )方法执行。

  又例如窗口事件接口:

  public interface WindowListener extends EventListener{

     public void windowClosing(WindowEvent e);

     //把退出窗口的语句写在本方法中

     public void windowOpened(WindowEvent e);

     //窗口打开时调用

     public void windowIconified(WindowEvent e);

     //窗口图标化时调用

     public void windowDeiconified(WindowEvent e);

     //窗口非图标化时调用

     public void windowClosed(WindowEvent e);

     //窗口关闭时调用

     public void windowActivated(WindowEvent e);

     //窗口激活时调用

     public void windowDeactivated(WindowEvent e);

     //窗口非激活时调用

  }

  AWT的组件类中提供注册和注销监听器的方法:

  ◇ 注册监听器:

  public void add<ListenerType> (<ListenerType>listener);

  ◇ 注销监听器:

  public void remove<ListenerType> (<ListenerType>listener);

  例如Button类:(查API)

  public class Button extends Component {

     ……

  public synchronized void addActionListener(ActionListener l);

  public synchronized void removeActionListener(ActionListener l);

     ……}

更多相关推荐:
计算器实训报告

报告编号第3组综合课程设计报告嵌入式计算器实训学生姓名指导教师所在系电子工程系所学专业电子信息工程年级20xx级201年6月1设计题目描述与总体要求22设计研究的主要工作23系统概述24设计原理与方法35小结9...

JAVA实训报告--计算器

Java实训设计报告专业班级学号姓名计算器软件技术0923090123037范付明石家庄科技信息职业学院信息工程系20xx年10月15日Java实训设计报告Java实训设计报告项目名称一项目需求本程序的主要功能...

计算器单片机实训报告

重庆电力高等专科学校单片机实训报告简易计算器专业电子信息工程技术班级信息1212组员张忠艳学号20xx03020xx7组员王传胜学号20xx03020xx3组员汤承练学号20xx03020xx2指导老师李景明任...

计算器实验报告

目录一系统开发的背景1二系统分析与设计1一二计算器的主要功能1系统模块结构设计1三系统的设计与实现2一二计算器的初始界面2一般计算3三解一元二次方程5四计算银行本利和5四系统测试7一二测试主函数MAIN7测试一...

简单的计算器实验报告

HUNANUNIVERSITY程序设计训练简单的计算器报告学生姓名田博鑫学生学号专业班级指导老师20xx年6月16日至20xx年7月10日1吴蓉晖1程序设计目的和要求目的此次程序设计的目的主要是为了我们能更好的...

计算器实验报告 (1)

HTML网页实验报告院系计算机控制与工程学院班级计1241学号姓名完成日期1一实验名称设计一个网页计算器二需求分析计算器是日常生活中十分便捷有效的工具能实现加减乘除开方求倒数等简单运算的工具要实现计算功能可以用...

C#计算器实验报告

C计算器实验报告班级学号20xx13432姓名蔡启林一实验目的和要求设计一个简单计算器具有一般计算功能能进行基本的加减乘除运算还具有求根号倒数等功能特点是能进行不同进制的运算和不同进制间的转换主要的工作主要是操...

计算器项目实训报告书

信息科学与技术学院项目实训报告书课程名称姓名班级学号指导教师VB程序设计高海涛10261139陈劲新盐城师范学院信息科学与技术学院20xx12123456789

简易计算器实训(2)

青岛大学软件技术学院C语言程序设计实训报告姓名冯勇澎专业计算机信息管理班级一班指导教师曲翠露二0一三年七月十七日目录第一章项目分析错误未定义书签111选题背景2111计算器程序设计的背景2112计算器程序设计的...

ARM计算器实训报告

广东科学技术职业学院广州学院实训报告题目简易计算器专业计算机应用技术班级学生姓名学号2011年6月一设计任务与要求实训的任务是基于ARM平台下进行简易电子计算器的设计实训设计要求是实现十以内数的加法实现简单的加...

vb 简易计算器实验报告

简易计算器课程设计报告一实验目的模拟计算器的功能系统启动后先清屏再在显示屏右侧显示0字样系统仅接收数字键加减乘除键退格键C键复位或回车键ESC键退出系统作为有效按键其余按键不响应按键后屏幕显示效果要达到一般计算...

java计算器代码及实验报告

一实验内容题目1设计一个计算器要求1使用layout进行布局使界面更加友好2实现整数的加减乘除运算不考虑优先级二实验过程这是实验报告极其重要的内容要抓住重点可以从理论和实践两个方面考虑这部分要写明依据什么知识点...

计算器实训报告(34篇)