1 / 43

Java 编程实践

Java 编程实践. 计算器的实现. CCIT 软件学院 软件教研室. 计算器 (Applet 实现 ). 学习目标 理解并掌握 Java 中的类、对象、继承、方法等概念, 以及 Applet 的基本框架和事件处理的方法 学会使用 JDK 编写、调试和运行 Java Applet 应用程序 利用 awt 组件编写一个计算器,实现基本的四则运算. 计算器 (Applet 实现 ). 编程要求 用编辑工具编写 Java 代码,在 JDK 1.4.x 环境下编译运行,实现应用程序指定的功能 程序代码格式整齐规范、便于阅读 程序注释完整规范、简明易懂.

hye
Download Presentation

Java 编程实践

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

  3. 计算器(Applet实现) • 编程要求 • 用编辑工具编写Java代码,在JDK 1.4.x环境下编译运行,实现应用程序指定的功能 • 程序代码格式整齐规范、便于阅读 • 程序注释完整规范、简明易懂 CCIT软件学院

  4. 计算器(Applet实现) • 学习内容 • 1. 回顾 AWT组件及事件编程方法 • Java1.0.2的事件处理 • Java1.1的事件处理 • 2. Applet编程方法 • 3. 相关类与方法 • 4. 程序实现 • 5. 总结 CCIT软件学院

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

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

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

  8. 事件监听者 点击 ActionListener Button 1 触发ActionEvent e 接收事件e,并做处理 事件发生者 事件及处理机制 • 组件(事件发生者)触发一个相应类型的事 件 • 此事件由相应类型的Listener(事件监听者) 接收并处理 CCIT软件学院

  9. ActionEvent事件 鼠标单击按扭 触发 ActionEvent事件 ActionListener接口 public void actionPerformed(ActionEvent e) 实现 接口 监听者类 监听者对象 事件及处理机制 调用按扭的 addActionListener () 方法,为该按扭指定监听者。 CCIT软件学院

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

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

  12. 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"); } } ... ... ... } ///:~ CCIT软件学院

  13. 事件与监听者类型 • XXXListener接口与XXXEvent • XXX为特定类型 • 常用类型: Action, Item,Focus, Key, Window, MouseEvent vs. Mouse/MouseMotionListener • 注册与取消:组件包含的新方法 addXXXListener()与removeXXXListener() CCIT软件学院

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

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

  16. 2.Applet编程 • Applet的生命周期及方法 • Applet的绘图 • Applet类的层次 • Applet程序的运行 CCIT软件学院

  17. 启动执行 Applet init()初始化 start()启动 第一次 被载入 Applet回到当前 页,重新激活 Applet Browser转向 其他网页时 Applet暂停 执行 stop()终止 destroy()消亡 关闭 浏览器 Applet的生命周期 构造方法 vs. init()方法 结论: 构造方法的执行时间早于init() CCIT软件学院

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

  19. 编程控制 repaint() 调用 1. 擦除并填充成背景色 update() 2. 调用paint() paint( ) 第一次绘制 当某些操作破坏了显示,需重新绘制时 Applet的绘图周期 • 绘图周期称为AWT线程 • Applet一开始运行,就自动启动了这两个线程 CCIT软件学院

  20. Applet类 • Applet类的层次结构 java.lang.Object java.awt.Component .Container .Panel .Applet • Applet小程序的实现:extends Applet CCIT软件学院

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

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

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

  24. 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软件学院

  25. 3. 相关类与方法 • Container • void setLayout(LayoutManager mgr) • add(Component comp) • ActionEvent • String getActionCommand() • Object getSource() [继承于EventObject] • Button • void addActionListener(ActionListener L) • Double • double doubleValue() CCIT软件学院

  26. 4.程序实现 • 1).定义相关组件和变量 • 2).Applet的初始化(init) • 3).事件处理 (actionPerformed) • 4).其他自定义方法 • 方法:doOperator, doClear, doForeScreen CCIT软件学院

  27. 4.程序实现-基本过程 1)输入数据ForeScreen 2)输入运算符OpCurrent ForeScreenBackScreen(第一运算数), ForeScreen="" OpCurrentOpPre 3)输入数据ForeScreen 4)输入运算符OpCurrent BackScreen OpPre ForeScreen 运算 运算结果BackScreen , ForeScreen="" OpCurrentOpPre CCIT软件学院

  28. 4.程序实现-事件处理流程 CCIT软件学院

  29. 4.程序实现-运算过程 CCIT软件学院

  30. 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; CCIT软件学院

  31. 2).Applet的初始化 //第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); 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); CCIT软件学院

  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); } //第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); CCIT软件学院

  33. 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); } CCIT软件学院

  34. //按钮为“.”且之前没有输入过“.”,将小数点“.”追加到输入的数据后//按钮为“.”且之前没有输入过“.”,将小数点“.”追加到输入的数据后 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(); CCIT软件学院

  35. //按钮为运算符 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; } CCIT软件学院

  36. 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); } CCIT软件学院

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

  38. 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()); } CCIT软件学院

  39. 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; } CCIT软件学院

  40. 计算器 • 编辑java代码 • 编译 • 编辑HTML文件 • 运行 CCIT软件学院

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

  42. 计算器 • 作业(上机练习) • 编程实现Applet计算器 • 改进和优化 • 利用Swing组件实现(并可在窗体中运行) • 实现科学型计算器 CCIT软件学院

  43. 下课! CCIT软件学院

More Related