9299.net
大学生考试网 让学习变简单
当前位置:首页 >> 高中教育 >>

Java计算器实现_图文

Java计算器实现_图文


Java 编程实践
计算器的实现 CCIT软件学院 Java教研室

1

CCIT软件学院

计算器(Applet实现)
?

学习目标
理解并掌握Java中的类、对象、继承、方法等 概念, 以及Applet的基本框架和事件处理的方 法 ? 学会使用JDK编写、调试和运行Java Applet应用 程序 ? 利用awt组件编写一个计算器,实现基本的四则 运算
?

2

CCIT软件学院

计算器(Applet实现)
?

编程要求
用编辑工具编写Java代码,在JDK 1.4.x环境下 编译运行,实现应用程序指定的功能 ? 程序代码格式整齐规范、便于阅读 ? 程序注释完整规范、简明易懂
?

3

CCIT软件学院

计算器(Applet实现)
?

学习内容
?

1. 回顾 AWT组件及事件编程方法
Java1.0.2的事件处理 ? Java1.1的事件处理
?

2. Applet编程方法 ? 3. 相关类与方法 ? 4. 程序实现 ? 5. 总结
?

4

CCIT软件学院

Java1.0.2的事件处理
?

?

?

使用单一的java.awt.Event类来接受所有类型的事 件; 使用action(), handleEvent( )以及其他的一些事件 处理方法(如鼠标事件、键盘事件、焦点事件) 来进行相应事件的事件处理。 缺点:造成长if分支语句组,不利于面向对象的 编程

5

CCIT软件学院

Java1.1 对事件处理的改进
? ? ?

?

引入java.awt.event包 更加面向对象,易于理解 定义了事件的“发生者”和“监听者”对象 按钮事件、文本事件、选择事件、调整事件、 鼠标事件、键盘事件等 事件以类层次来表达,取代了1.0.2中的单一的 类,并可以自定义事件类型

6

CCIT软件学院

事件及处理机制
?

?

? ?

?

?

?

用户操作GUI组件时会引发各种事件。 事件 :描述“发生了什么事情”的对象。 系统根据用户的操作构造出相应事件类的对象。 事件源:事件的产生地。 事件处理程序:是一个方法,它接收一个事件对象、 分析它、并完成对该事件的处理。 每个事件有一个相应的监听者接口,它规定了能够接收 (并处理)该类事件的方法的规范。 监听者:实现了监听者接口的类,它包含有事件处理 程序。 编程人员要为事件源指定监听者对象(即指定处理某种 事件的事件处理程序)。
CCIT软件学院

7

事件及处理机制
?

?

组件(事件发生者)触发一个相应类型的事 件 此事件由相应类型的Listener(事件监听者) 接收并处理
事件监听者 Button 1 事件发生者 点击 触发ActionEvent e ActionListener

接收事件e, 并做处理

8

CCIT软件学院

事件及处理机制
鼠标单击按扭 ActionEvent事件

触发

ActionEvent事件 ActionListener接口

public void actionPerformed(ActionEvent e) 实现 接口 监听者类 调用按扭的 addActionListener ( 监听者对象 ) 方法,为该按扭指定监听者。
9

CCIT软件学院

几个有用的概念
?

?

?

?

事件 - 在java.awt.event包中定义了若干类型 的事件类 监听者接口 - 特定类型的Listener接口,用于 监听特定类型的事件 监听者类 - 是实现了某种监听者接口的类,由编 程者定义 事件监听者 - 是某个监听者类的对象,由编 程者使用new创建

10

CCIT软件学院

实现步骤
?

? ?

?

根据需要定义相应类型的监听者类,在类的 定义中完成事件的处理; 创建事件监听者对象; 为将会触发事件的组件C注册相应的事件监听 者对象(使用C的addXXXListener()方法)。 例:ButtonAct.java

11

CCIT软件学院

public class ButtonAct extends Frame { ... ... ... public ButtonAct() { ... ... ... //为b1注册事件监听者B1 b1.addActionListener(new B1()); add(b1); ... ... ... } //利用inner class结构定义监听者类 class B1 implements ActionListener { //利用actionPerformed方法进行事件处理 public void actionPerformed(ActionEvent e){ who.setText("Button 1"); } } ... ... ... } ///:~
12

CCIT软件学院

事件与监听者类型
?

?

XXXListener接口与XXXEvent ? XXX为特定类型 ? 常用类型: Action, Item,Focus, Key, Window, MouseEvent vs. Mouse/MouseMotionListener 注册与取消:组件包含的新方法 addXXXListener()与removeXXXListener()

13

CCIT软件学院

监听者接口中有什么?
?

?

每种Listener接口均定义了一套abstract方法, 编程者必须在监听者类中实现这些方法来做事 件处理; 例: ActionListener: actionPerformed() WindowListener: windowOpened/Closing/Closed/Activated/ Deactivated/Iconified/Deiconified()
CCIT软件学院

14

事件类
?

?

ActionEvent类:属于动作事件,包括:点击按钮; 双击一个列表中的选项;选择菜单项;在文本框中 按回车。最典型的例子是:鼠标点击按钮所产生 的事件,经ActionListener接口触发一连串动作, 再由actionPerformed()方法完成这些动作。 ? e.getSource() 返回事件发生的对象(名) ? e.getActionCommand() 返回按扭名(动作事 件的命令字符串)。 ActionListener 接口
?

public void actionPerformed(ActionEvent e)
CCIT软件学院

15

2.Applet编程
? ? ?

?

Applet的生命周期及方法 Applet的绘图 Applet类的层次 Applet程序的运行

16

CCIT软件学院

Applet的生命周期
启动执行 Applet init()初始化 第一次 被载入 Browser转向 其他网页时 Applet暂停 执行 start()启动

构造方法

Applet回到当前 页,重新激活 Applet

vs.
init()方法
stop()终止 关闭 浏览器 destroy()消亡

结论: 构造方法的执行时间早于init()
17

CCIT软件学院

Applet生命周期各方法
?

? ?

Applet的建立、释放 init():初始化,Applet被浏览器载入时运行 start():启动Applet,每次回到当前页时运行 stop():暂停Applet,每次离开当前页时执行 destroy():释放对象资源,关浏览器时执行 生命周期称为Applet的主线程 一般由Browser或appletviewer自动调用

18

CCIT软件学院

Applet的绘图周期
? ?

绘图周期称为AWT线程 Applet一开始运行,就自动启动了这两个线程

1. 擦除并填充成背景色 编程 repaint() 调用 update() 2. 调用paint() 控制 paint( ) 第一次绘制 当某些操作破坏了显示,需重新绘制时

19

CCIT软件学院

Applet类
?

Applet类的层次结构
java.lang.Object java.awt.Component .Container .Panel .Applet Applet小程序的实现:extends Applet

?

20

CCIT软件学院

Applet的GUI编程
?

Applet是一种特殊的Panel, 它是Java Applet程序的 最外层容器。 Applet容器的缺省布局策略与Panel 一致, 都是FlowLayOut 。 ? 可放置简单构件(Label、Button等)以及其他 非顶层容器(Panel);
可绘制用户自定义成分(绘制图形、文字、显 示图象) ? 事件处理
?

21

CCIT软件学院

Applet执行方式
?

? ?

Applet编译生成的字节码文件(.class)存储于Web Server .class文件名嵌在HTML页面中 当Web Client的Browser下载并显示含有Applet的 HTML时,将自动执行该Applet:显示动画声音, 响应用户事件

22

CCIT软件学院

将Applet嵌入HTML
?

<Applet [codebase = applet_URL,] code = .class文件名, width = Applet宽度, height = Applet高度, ……. > [<param name =名字 value =“值” >] </Applet> HTML文件可以向它所嵌入的Applet传递参数, 这个任 务是通过HTML文件的一个专门标记<param >来完成

23

CCIT软件学院

3. 相关类与方法
? ?

?

?

Applet ? init() TextField ? String getText() [继承于TextComponent] ? void setText(String t) Component ? void setBackground(Color c) ? void setForeground(Color c) ? void setBounds(int x, int y, int width, int height) Color.gray (blue,pink,green) 常数
CCIT软件学院

24

3. 相关类与方法
?

?

?

?

Container ? void setLayout(LayoutManager mgr) ? add(Component comp) ActionEvent ? String getActionCommand() ? Object getSource() [继承于EventObject] Button ? void addActionListener(ActionListener L) Double ? double doubleValue()
CCIT软件学院

25

4.程序实现
? ? ?

?

1).定义相关组件和变量 2).Applet的初始化(init) 3).事件处理 (actionPerformed) 4).其他自定义方法
方法:doOperator, doClear, doForeScreen
?

26

CCIT软件学院

4.程序实现-基本过程
1)输入数据?ForeScreen 2)输入运算符?OpCurrent
ForeScreen?BackScreen(第一运算数), ForeScreen="" OpCurrent?OpPre

3)输入数据?ForeScreen 4)输入运算符?OpCurrent
BackScreen OpPre ForeScreen 运算

运算结果?BackScreen , ForeScreen="" OpCurrent?OpPre
27

CCIT软件学院

4.程序实现-事件处理流程
按钮为“.”且之前没有输入 过“.”,将小数点“.”追 加到输入的数据后


事件处理 开始

数字或”.”

按钮为数字



追加输入数据 doForeScreen(s)

“C” 是,判断按钮 “=”

清除doClear()

事件来源为Button

运算doOperator()

运算符 是

已有第二运算数


保存当前运算符, 运算doOperator()

结束

保存新输入的运算符到 OperatorPre

28

CCIT软件学院

4.程序实现-运算过程
为空表示还没有再次 输入运算符或“=”

开始 运算

OperatorPre为空



保存BackScreen(第 一个运算数), 第二运算数置为空

结束



两个运算数 都不为空



将运算数转换为 double型

根据运算符进行 相应运算

运算后将结果作为 第一运算数,而第 二运算数置为空

29

CCIT软件学院

1).定义相关组件和变量
//用于显示输入和输出的文本框 private TextField tfAnswer; //按钮:数字“0”-“9” private Button b0,b1,b2,b3,b4,b5,b6,b7,b8,b9; //按钮: 依次为--“.”,“=”,“+”,“-”,“C”,“*”,“/” private Button bPoint,bEqual,bPlus,bMinus,bClear,bMulti,bDivision; //当前输入的运算符,前一个运算符 private String OperatorCurrent,OperatorPre; //运算符前后的两个运算数(ForeScreen称为第二运算数,BackScreen称为第 一运算数) private String ForeScreen,BackScreen; //输入数据是否为浮点数 private boolean isFloat = false;

30

CCIT软件学院

2).Applet的初始化
public void init() { OperatorCurrent = new String(""); OperatorPre = new String(""); ForeScreen = new String(""); BackScreen = new String(""); //设置Applet组件的背景色和前景色 this.setBackground(Color.gray); this.setForeground(Color.blue); setLayout(null); //布局设置 tfAnswer = new TextField(); //定义文本框组件的位置(x,y)和大小 (宽width,高度height) tfAnswer.setBounds(5,5,100,20); //将文本框组件加入到Applet add(tfAnswer);
31

CCIT软件学院

//第1排按钮 bClear = new Button("C"); bClear.setBounds(5,30,20,20); bClear.setBackground(Color.pink); bClear.addActionListener(this); add(bClear); bDivision = new Button("/"); bDivision.setBounds(30,30,20,20); bDivision.setBackground(Color.green); bDivision.addActionListener(this); add(bDivision); bMulti = new Button("*"); bMulti.setBounds(55,30,20,20); bMulti.setBackground(Color.green); bMulti.addActionListener(this); add(bMulti); bMinus = new Button("-"); bMinus.setBounds(80,30,20,20); bMinus.setBackground(Color.green); bMinus.addActionListener(this); add(bMinus);

//第2排按钮 b7 = new Button("7"); b7.setBounds(5,55,20,20); b7.addActionListener(this); add(b7); b8 = new Button("8"); b8.setBounds(30,55,20,20); b8.addActionListener(this); add(b8); b9 = new Button("9"); b9.setBounds(55,55,20,20); b9.addActionListener(this); add(b9);
//第3排按钮 b4 = new Button("4"); b4.setBounds(5,80,20,20); b4.addActionListener(this); add(b4); b5 = new Button("5"); b5.setBounds(30,80,20,20); b5.addActionListener(this); add(b5); b6 = new Button("6"); b6.setBounds(55,80,20,20); b6.addActionListener(this); add(b6); bPlus = new Button("+"); bPlus.setBounds(80,55,20,45); bPlus.setBackground(Color.green); bPlus.addActionListener(this); add(bPlus);
32

//第4排按钮 b1 = new Button("1"); b1.setBounds(5,105,20,20); b1.addActionListener(this); add(b1); b2 = new Button("2"); b2.setBounds(30,105,20,20); b2.addActionListener(this); add(b2); b3 = new Button("3"); b3.setBounds(55,105,20,20); b3.addActionListener(this); add(b3); //第5排按钮 b0 = new Button("0"); b0.setBounds(5,130,45,20); b0.addActionListener(this); add(b0); bPoint = new Button("."); bPoint.setBounds(55,130,20,20); bPoint.addActionListener(this); add(bPoint); bEqual = new Button("="); bEqual.setBounds(80,105,20,45); bEqual.setBackground(Color.green); bEqual.addActionListener(this); add(bEqual); }

CCIT软件学院

3).事件处理方法
public void actionPerformed(ActionEvent e) { String s = new String(""); if(e.getSource() instanceof Button) //如果事件来源为按钮 { //按钮为数字和“.” if((e.getSource() == b0)||(e.getSource() == b1)||(e.getSource() == b2)|| (e.getSource() == b3)||(e.getSource() == b4)||(e.getSource() == b5)|| (e.getSource() == b6)||(e.getSource() == b7)||(e.getSource() == b8)|| (e.getSource() == b9)||(e.getSource() == bPoint)) { //按钮为数字,追加到输入的数据后 if(e.getSource() != bPoint) { s = e.getActionCommand(); doForeScreen(s); }
33

CCIT软件学院

//按钮为“.”且之前没有输入过“.”,将小数点“.”追加到输入的数据后 if((e.getSource() == bPoint)&&(!isFloat)) { isFloat = true; s = e.getActionCommand(); if(ForeScreen.equals("")) ForeScreen += "0."; else doForeScreen(s); } } //按钮为“C”,则进行清除 if(e.getSource() == bClear) doClear(); //按钮为“=”,进行运算 if(e.getSource() == bEqual) doOperator();

34

CCIT软件学院

//按钮为运算符 if((e.getSource() == bMulti)||(e.getSource() == bDivision)|| (e.getSource() == bPlus)||(e.getSource() == bMinus)) { //如果已有第二运算数则保存当前运算符,进行运算 if(ForeScreen != "") { OperatorCurrent = e.getActionCommand(); doOperator(); } //否则(如连续两次输入运算符或输入“=”运算后再输入运算符),保 存新输入的运算符到OperatorPre else OperatorPre =e.getActionCommand(); } } return true; }

35

CCIT软件学院

4).其他自定义方法
//方法:doForeScreen //功能:每次点击按钮"0"-"9"之后将文本追加到变量ForeScreen,并显示在 文本框中 public void doForeScreen(String s) { ForeScreen += s; tfAnswer.setText(ForeScreen); } //方法:doClear //功能:点击按钮"C"后,执行清除文本框和其他存储的变量,回到初始状态 public void doClear() { OperatorCurrent = ""; OperatorPre = ""; ForeScreen = ""; BackScreen = ""; isFloat = false; tfAnswer.setText(ForeScreen); }
36

CCIT软件学院

4).其他自定义方法
//方法:doOperator //功能:利用运算数和运算符进行运算以得到结果 public void doOperator() { double dFore,dBack; Double d; if(OperatorPre.equals("")) { //如果OperatorPre为空(还没有再次输入运算符或“=”),则将当前文 本框中的数据保存到BackScreen(第一个运算数),第二运算数置为空 BackScreen = ForeScreen; ForeScreen = ""; tfAnswer.setText(BackScreen); } else {
37

CCIT软件学院

if(ForeScreen.equals("") && !OperatorPre.equals("/")) ForeScreen="0"; if(BackScreen.equals("")) BackScreen="0"; //如果有运算数(两个都不为空)和运算符OperatorPre,则进行运算 if(!(ForeScreen.equals("") || BackScreen.equals(""))) { //将两个运算数取出并转化为double型 dFore = (new Double(ForeScreen)).doubleValue(); dBack = (new Double(BackScreen)).doubleValue(); //进行四则运算 if(OperatorPre.equals("+")) { d = new Double((dBack + dFore)); tfAnswer.setText(d.toString()); } if(OperatorPre.equals("-")) { d = new Double((dBack - dFore)); tfAnswer.setText(d.toString()); }
38

CCIT软件学院

if(OperatorPre.equals("*")) { d = new Double((dBack * dFore)); tfAnswer.setText(d.toString()); } if(OperatorPre.equals("/")) { d = new Double((dBack / dFore)); tfAnswer.setText(d.toString()); } //运算后将结果作为第一运算数,而第二运算数置为空 ForeScreen = ""; BackScreen = tfAnswer.getText();
}

}
//将输入的运算符OperatorCurrent赋给OperatorPre,等待再次输入运 算符,以备运算 OperatorPre = OperatorCurrent;

}
39

CCIT软件学院

计算器
? ? ?

?

编辑java代码 编译 编辑HTML文件 运行

40

CCIT软件学院

计算器
?

总结:
由于本程序事件处理比较简单,只有按钮点击 事件,采用Java1.1事件处理模型 ? 本程序为Applet程序,只能嵌入到HTML中让浏 览器来执行,最好能用窗体实现 ? 本程序只实现基本的四则运算,和windows附件 中的计算器还有很大差距,最好能实现科学型, 并有菜单控制,能独立作为一个程序执行
?

41

CCIT软件学院

计算器
?

作业(上机练习)
?

编程实现Applet计算器

?

改进和优化
利用Swing组件实现(并可在窗体中运行) ? 实现科学型计算器
?

42

CCIT软件学院

下课!

43

CCIT软件学院


推荐相关:
网站首页 | 网站地图
All rights reserved Powered by 大学生考试网 9299.net
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@qq.com