精品文档-Java程序设计项目化教程(陈芸)-第8章
第8章 任务8——处理登录界面中的事件
8.2.1 动作事件(ActionEvent类) 当用户按下按钮组件(JButton)、双击列表(JList)中的
选项、选择菜单项(JMenuItem),或是在文本框(JTextField) 或文本区(TextArea)输入文字后按下【Enter】键的同时,即 触发了动作事件。此时,触发事件的组件将ActionEvent类的 对象传送给向它注册的监听器ActionListener,由Action Listener负责启动并执行相关代码来处理这个事件。
MouseMotionListener
WindowsListener
事件监听器委派的事件处理者 actionPerformed(ActionEvent e) itemStateChanged(ItemEvent e) textValueChanged(TextEvent e) keyType(KeyEvent e) keyPressed(KeyEvent e) keyRelease(KeyEvent e) focusGained(FocusEvent e) focusLost(FocusEvent e) mouseClicked(MouseEvent e) mouseEntered(MouseEvent e) mousExited(MouseEvent e) mousePressed(MouseEvent e) mouseReleased(MouseEvent e) mouseDragged(MouseEvent e) mouseMoved(MouseEvent e) windowsClosing(WindowsEvent e) windowsOpen(WindowsEvent e) windowsConified(WindowsEvent e) windowsDeiconified(WindowsEvent e) windowsClosed(WindowsEvent e) windowsActivated(WindowsEvent e) windowsDeactivated(WindowsEvent e)
第8章 任务8——处理登录界面中的事件
Java中的所有事件都放在java.awt.AWTEvent包中,这些 事件都是从java.util.EventObject类继承而来的,而 java.util. EventObject类又继承于ng.Object类。 事件处理类及其继承关系如图8-5所示。图中,有阴影的7个 类是最基础的事件类,分别是动作事件(ActionEvent)、调整 事件(Adjustment Event)、选择事件(ItemEvent)、文本事件 (TextEvent)、窗口事件(WindowsEvent)、键盘事件 (KeyEvent)和鼠标事件(MouseEvent)。我们将在本章重点介 绍动作事件、键盘事件、焦点事件、鼠标事件和窗口事件,其 他部分事件类将结合考试系统的其他功能模块在后续章节中进 行介绍。
第8章 任务8——处理登录界面中的事件
图8-4描述了委派事件模型的运作流程。我们可以看到, 事件处理机制中包含了以下三个要素:事件源、事件(对象)及 事件监听器。
第8章 任务8——处理登录界面中的事件 图8-4 委派事件模型
第8章 任务8——处理登录界面中的事件
事件源是产生事件的组件,每个事件源可以产生一个或多 个事件。例如,文本框JTextField获得焦点时,按回车键则 产生动作事件,而修改文本框内容时产生的则是文本事件。为 了能够响应所产生的事件,事件源必须注册事件监听器,以便 让事件监听器能够及时接收到事件源所产生的各类事件。当接 收到一个事件时,监听器将会自动启动并执行相关的事件处理 代码来处理该事件。
第8章 任务8——处理登录界面中的事件
10 cancel = new JButton(“返回”);
11 exit = new JButton(“退出”);
12 ok.addActionListener(this);
//注册监听
器
13 cancel.addActionListener(this) ;
WindowsEvent
FocusEvent
KeyEvent
MouseEvent
第8章 任务8——处理登录界面中的事件
对于表8-1中的事件类都有与之对应的事件监听器。 Java中的事件监听器大多以接口形式出现。事件类、事件监 听器接口以及事件监听器委派的事件处理者之间存在一定的对 应关系,如表8-2所示。
表8-3列出了ActionEvent类的常用方法。
第8章 任务8——处理登录界面中的事件
表8-3 ActionEvent类的常用方法
方法 Public String getActionCommand() public Object getSource()
用途 获取触发动作事件的事件源的命令字符 获取发生 ActionEvent 事件的事件源对象的引用
第8章 任务8——处理登录界面中的事件
事实上,我们希望程序有如下的一系列的响应: (1) 在考试系统登录界面中,程序根据用户点击不同按 钮的操作,进入相关的功能模块。 (2) 输入正确的用户名及密码后,点击【登录】按钮可 以进入考试界面进行考试,如图8-1所示;当输入的用户名或 密码有误时,系统将提示相关错误信息,如图8-2所示;对于 新用户,可以点击【注册】按钮,进行用户注册,如图8-3所 示。 在Java中,要想使图形用户界面对用户的操作产生响应, 就必须对相应的组件添加事件处理代码。
14 exit.addActionListener(this);
15 getContentPane().add(ok);
16 getContentPane().add(cancel);
17 getContentPane().add(exit);
18 }
19 //完成事件触发时的相关处理
20 public void actionPerformed(ActionEvent
e){
第8章 任务8——处理登录界面中的事件
21 if(e.getSource()==ok) 22 System.out.println("确定"); 23 if(e.getSource()==cancel) 24 System.out.println("返回"); 25 if(e.getSource()==exit) 26 System.exit(0);; 27 } 28 public static void main(String args[]) { 29 ButtonListener pd=new ButtonListener("ActionEvent Demo"); 30 pd.setSize(250,100);
第8章 任务8——处理登录界面中的事件 图8-5 事件处理类及其继承关系
第8章 任务8——处理登录界面中的事件
表8-1列出了常见的用户行为、事件源和相关的事件类型。 其中, Component是所有GUI组件的父类,因此每个组件都可 以触发ComponentEvent下的FocusEvent、FocusEvent、 MouseEvent、KeyEven事件。在java.awt.event包中,提供 AWT事件所需的大部分的事件类和事件监听器接口,一些 Swing组件所特有的事件监听器接口则在javax.swing.event 中声明。如ListSelectionEvent是包含在javax.swing.event 中的类。
第8章 任务8——处理登录界面中的事件
表8-1 常见用户行为、事件源和事件类型
用户行为 点击按钮 在文本域按下回车键 选定一个新项 选定(多)项 点击复选框 选定菜单项 移动滚动条 窗口打开、关闭、图标(最小化、还 原或正在关闭) 组件获得或失去焦点
释放或按下键
移动鼠标
事件源 JButton JTextField JComBox JList JCheckBox JMenuItem JScrollBar
第8章 任务8——处理登录界面中的事件
动作事件的监听器接口ActionListener中只包含一个方 法,语法格式如下:
public void actionPerform(ActionEvent e) 重写该方法对ActionEvent事件进行处理,当Action Event事件发生时该方法被自动调用,形式参数e引用传递过 来的动作事件对象。 在Java图形用户界面中,处理事件时所必需的步骤是: (1) 确定接受响应的组件并创建它。 (2) 实现相关事件监听接口。 (3) 注册事件源的动作监听器。 (4) 事件触发时要进行的相关处理。
第8章 任务8——处理登录界面中的事件 第8章 任务8——处理登录界面中的事件
8.1 任务描述 8.2 技术要点 8.3 任务实施
第8章 任务8——处理登录界面中的事件
8.1 任 务 描 述 本章的任务是完善用户登录界面中的事件处理。在第7章 中介绍了利用Swing创建的图形界面,可以通过AWT中的布局 管理器对界面中的组件进行布局。但点击界面中的按钮没有任 何相关程序的执行,这是因为程序中缺少对这些组件上所发生 的一系列操作的响应,也就是缺少相应这些组件行为的代码。
例8-1 ButtonListener.java 1 import java.awt.*; 2 import java.awt.event.*; 3 import javax.swing.*; 4 class ButtonListener extends JFrame
implements ActionListener{ //实现监听 5 JButton ok, cancel,exit; 6 public ButtonListener(String title){ 7 super(title); 8 this.setLayout(new FlowLayout()); 9 ok = new JButton("确定");
Java语言程序设计第8章习题参考答案.docx
习题八参考答案1.什么是组件?什么是容器?并说明各自的作用。
答:从实现角度来看,组件(Component)是构成GUI的基本要素,作用是通过对不同事件的响应来完成和用户的交互或组件之间的交互;容器是能容纳和排列组件的对象,如Applet> Panel (面板)、Frame (窗口)等,作用就是放置组件并控制组件位置。
2.简述Swing组件的优点。
答:Swing是在AWT基础上扩展而来的,提供了非常丰富的组件,远远多于AWT,并且引入了新的概念和性能,这使得基于Swing开发GUI应用程序比直接使用AWT开发更为灵活、方便、效率高,而且能设计出更优美的、感受更好的GUI。
3.简述容器的概念,结合8.4.7小节的内容,解释什么是应用程序的主框架?答:容器是用来容纳其他组件和容器的特殊组件,是由容器类(Container类)创建的对象。
在Java语言中,容器类是组件类(组件类Component类)的一个子类,具有组件的所有性质。
在AWT 技术中,容器类由java. awt包提供,主要包括面板类Panel、窗口类Window、结构类Frame、对话框类Dialog等。
在Swing技术中,容器类由javax. swing包提供,并可分为如下三类:>顶层容器:JFramc. JApplet. JDialog、JWindow;>中间容器:JPanel、JScrollPane^ JSplitPane、JDesktopPaneJToolBar;特殊容器:在GUI上起特殊作用的中间层,如J Interna IFrame、JLayeredPane、 JRootPaneo 应用程序的主框架由可以容纳应用程序各种组件的顶层容器创建,除了负责组件的管理外,通常还提供最大化、最小化、关闭按钮等,实现应用程序展现方式以及关闭等。
4.总结JFrame的使用要点,并说明内容面板的作用。
答:JFrame类包含很多设置窗体的方法,可以用setTitle(String tille)方法设置窗体标题,用setBounds(inl x,int y,int width,int height)方法设置窗体显示的位置及大小,用setVisable (Boolean b)方法设置可见与否(默认不可见)。
Java程序设计案例教程 第8章 多线程编程
Java程序设计案例教程
第8章 多线程编程
第12页
Thread类和Runnable接口
在Java中创建多线程的方法有两种:继承Thread类和实 现Runnable接口。
Thread类实现了Runnable接口,并封装了线程的执行。 所以,使用实现接口Runnable的方法与创建Thread类的 子类的方法没有本质差别,但由于Java不支持多继承, 任何类只能继承一个类,所以当已经继承了某一类时,就 无法在继承Thread类,这种情况下只能通过实现 Runnable接口的方法来实现程序的多线程。
Java程序设计案例教程
第8章 多线程编程
第11页
消息传递
将程序分隔到独立的线程之后,需要定义它们之间相互通 信的方式。Java为两个或更多个线程之间的相互通信提 供了一种简洁的低成本方式。Java的消息传递系统允许 某个线程进入对象的同步方法,然后进行等待,直到其他 线程显式地通知这个线程退出为止。
► 一个线程可以创建和撤销另一个线程,同一进程中的多个线程 之间可以并发执行。
Java程序设计案例教程
第8章 多线程编程
第8页
Java中的线程
Java运行时系统在许多方面依赖于线程,并且所有类库 在设计时都考虑了多线程。事实上,Java通过利用线程 使得整个环境能够异步执行。
在过去几年,多核系统已经变得很普遍了。当然,单核系 统仍然在广泛使用。Java的多线程系统在这两种类型的 系统中都可以工作。在单核系统中,并发执行的线程共享 CPU,每个线程得到一片CPU时钟周期。所以,在单核 系统中,两个或更多个线程不是真正同时运行的,但是空 闲时间被利用了。然而,在多核系统中,两个或多个线程 可能是真正同步执行的。
Java程序设计实用教程_第8章_内部类与异常类
11
§8.4 断言
断言语句用于调试代码阶段。在调试代码阶段让 断言语句发挥作用,这样就可以发现一些致命的错误, 当程序正式运行时就可以关闭断言语句,但仍把断言 语句保留在源代码中,如果以后应用程又需要调试, 可以重新启用断言语句。 使用关键字 assert 声明一条断言语句,断言语句有 以下两种格式:
8
§8.3.1 try~catch语句 Java 使用 try~catch 语句来处理异常,将可能出现 的异常操作放在 try~catch语句的 try 部分,将发生异常 后的处理放在catch部分。 try~catch语句的格式如下:
try {
包含可能发生异常的语句
} catch(ExceptionSubClass1 … … } catch(ExceptionSubClass2 … … }
6
例8-3
Example8_3.java
7
§8.3 异常类
所谓异常就是程序运行时可能出现一些错误,比 如试图打开一个根本不存在的文件等,异常处理将会 改变程序的控制流程,让程序有机会对错误作出处理。 异常对象可以调用如下方法得到或输出有关异常的 信息:
public String getMessage(); public void printStackTrace(); public String toString();
匿名类的常用的方式是向方法的参数传值。
void f(A a){ }
4
例8-2
InputAlphabet.java , InputEnglish.java ShowBoard.java, Example8_2.java
(Java程序设计课件)第8章 继承、抽象类和接口(第4版)
☻覆盖父类的方法:子类继承父类中所有可被访问的 成员方法时,若子类的不方能覆法盖与父父类类中的方法同名,则不 能继承,此时子类的方声法明是的f覆ina盖l或父类的方法。
☻在子类中覆盖的方法s时tat,ic的可方扩法大父类中的方法权限 但不能缩小其权限。
10
见教材 例8.4
它们声明为final。 ☻最终类:用final修饰的类。该类不能有子类。 ☻成员变量若同时被static和final修饰,则表示常量,若
没有初始化则按默认值初始化。 ☻仅用final不用static修饰则必须且只能赋值一次,不能
默认。方式:定义时赋值;构造方法赋值。www.th见eme例gal1le82ry..c6om
非字符串变量来说,两者都是用来比较其所指对
象在堆中的首地址。
13
见教材例8.7
8.1 类的继承
8.1.5 Object类
☻toString( )方法:将调用该方法的对象的内容转换成 字符串,并返回其内容,但返回的是一些没有意义且 看不懂的字符串。若要用该方法返回对象的内容,可 以重新定义该方法以覆盖父类中的此方法以满足需求
☻getClass()方法:返回调用该方法的对象所属的类 ☻对象运算符instanceof()方法:可利用对象运算符
instanceof来测试一个指定对象是否是指定类或它的子 类的实例,若是,则返回true,否则返回false。 14
见教材例8.9
8.2 抽象类
8.1 类的继承
8.1.1 子类的创建
☻调用父类中特定的构造方法
♦ 但如果父类中有多个构造方法时,如何才能调 用父类中某个特定的构造方法呢?
♦ 例8.2 具体说明见教材。
在子类的构造方法中 通过super()来调用 父类特定的构造方法。
Java程序设计精编教程5-8章知识点
b) 如果变量名由多个单词组成,从第 2 个单词开始的每个单词的首字母要大写。
方法
方法的定义包括两部分:方法声明和方法体。一般格式为:
方法声明部分 {
方法体的内容
}
方法声明
方法声明包括返回值类型、方法名和参数。
double getArea() { //返回值类型为 double,无参数。
…
}
方法的返回值类型可以是 Java 中的任意数据类型。如果一个方法不返回数据,返回值类型必须是 void。
2. 有一个类 Singleton,为该类设计单例模式(该类只能有一个实例,且不能在类的外部 new 对象),只能通过该类 的静态方法 getInstance()获取该类的唯一对象。在主类 Homework2 中测试单例模式的有效性。
b) 在实例方法中,不仅可以调用实例方法,也可以调用类方法。 2) 类名调用类方法
a) 在类方法中,只能调用类方法、操作类变量。 b) 也可以通过对象调用类方法。 c) 如果一个方法不需要操作实例变量就可以实现某种功能,可以考虑将其声明为类方法。(例 5-8) 5.7 方法重载与多态 Java 中有两种多态:重载(overload)和重写(override)。 方法重载(overload):一个类中可以有多个名字相同的方法,但这些方法的参数必须不同,或者参数的个数不同, 或者参数的类型不同。方法的返回值类型与重载无关。
5.8 this 关键字 this 只能出现在实例方法和构造方法(也属于实例方法)中,表示调用该方法的当前对象。 一般情况下,方法中 this.实例变量的 this 可省略、类名.类变量的类名可省略,但当局部变量与成员变量同名时,
this 或类名不能省略。 5.9 包
包是 Java 语言管理类的一种机制,类似于操作系统中的目录,使用包名可以有效区分名字相同的类。 包语句
Java程序设计课件第八章_流和文件
18
7.2 字节流
7.2.1 字节输入流(FileInputStream)
FileInputStream构造方法:
FileInputStream(String name) FileInputStream(File file)
import java.io.*; public class ReadTextFile { public static void main(String[] args) throws IOException { FileInputStream s=new FileInputStream("c:/Hello.txt"); int c; while ((c = s.read()) != -1) //读取1字节,结束返回-1 System.out.print((char)c); s.close(); } }
21
7.2 字节流
例:从数据文件中读取3个int型数字,显示相加结果
1. 2. 3. 4. 5. 6.
7. 8.
9. 10. 11. 12. 13. 14. 15. 16. 17.
import java.io.*; public class ReadBinaryFile { public static void main ( String[] args ) { String fileName = "c:\\data1.dat"; int sum = 0; try { DataInputStream instr = new DataInputStream(new FileInputStream( fileName )); sum += instr.readInt(); sum += instr.readInt(); sum += instr.readInt(); System.out.println( "The sum is: " + sum ); instr.close(); } catch ( IOException iox ) { System.out.println("Problem reading " + fileName ); } } }
java程序设计chap8
8-21
Object类
• Object类包含了一些有用的方法,可以被所有类继承
• 例如, Object类包含了toString方法的定义
• 每次我们定义toString方法,我们实际覆盖了继承的定义 • Object类中的toString方法返回表示一个对象名字字符串, 并且在对象名后跟随一个唯一表示该对象的数值
8-17
Outline
创建子类
覆盖方法
类层次 继承与可见性 继承设计 继承与GUI Timer类
Copyright © 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
8-18
类层次结构
• 从一个父类派生出的子类还可以是它自己子 类的父类,因此继承关系发展为一个类层次 结构
8-13
Outline
创建子类
覆盖方法 类层次 继承与可见性 继承设计
继承与GUI
Timer类
Copyright © 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
8-14
覆盖方法
• 子类方法可覆盖它所继承的父类方法
• See Words.java • See Book.java • See Dictionary.java
Copyright © 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
8-7
Protected修饰符
• 可见性修饰符用于控制对类成员的访问,这种控制也延伸 到继承的过程中 • 采用private可变修饰符定义的变量和方法不能通过名字被 子类引用
Java语言程序设计课件第8章Java多线程编程
8.2.2 实现RUNNABLE接口
• 如果要创建的线程类已经有一个父类,这时就不能再继承Thread类,因为Java不支 持多继承,所以需要实现Runnable接口来应对这样的情况。
• 实现Runnable接口的语法格式如下:
• public class thread extends Object implements Runnable
• 自定义线程类中的实例变量针对其他线程可以有共享与不共享之分,这在多个线程 之间进行交互时是很重要的一个技术点。
• 在不共享数据时每个线程都拥有自己作用域的变量,且多个线程之间相同变量名的 值也不相同。
• 共享数据的情况就是多个线程可以访问同一个变量,比如在实现投票功能的软件时, 多个线程可以同时处理同一个人的票数。
Java语言的特点就是单根继承,所以为了支持多继承,完全可以实现Runnable接口 的方式,一边实现一边继承。
8.2.1 继承THREAD类
• 构造方法
方法 Thread() Thread(String name) Thread(Runnable target)
Thread(Runnable target, String name)
• 在Java中,并发机制非常重要,但并不是所有程序语言都支持线程。在以往的程序 中,多以一个任务完成以后再进行下一个任务的模式进行,这样下一个任务的开始 必须等待前一个任务的结束。
• Java语言提供了并发机制,允许开发人员在程序中执行多个线程,每个线程完成一 个功能,并与其他线程并发执行。这种机制被称为多线程。
8.4 JAVA多线程的同步机制
• 如果程序是单线程的,就不必担心此线程在执行时被其他线程“打扰”,就像在现实 世界中,在一段时间内如果只能完成一件事情,不用担心做这件事情被其他事情打 扰。但是,如果程序中同时使用多线程,好比现实中的“两个人同时通过一扇门”, 这时就需要控制,否则容易引起阻塞。
《Java程序设计案例教程》第08章
public static void main(String[] args) {
int a = 0;
int b = 8 / a;
// a 的值为0,被0除是无法计算的
}
}
❖ 因为除数为0,产生的异常名为算术异常ArithmeticException
❖ 其它常见的异常有
▪ 空指针异常NullPointerException
} catch (ArithmeticException e) { System.out.println("出现算术异常, 异常信息是: " + e.getMessage());
}
Java程序设计案例教程
幻灯片 11,共24页
11
8.1.2 捕获异常
❖ 把可能产生异常情况的语句放在try语句块中,这个语句块用来启动Java的异 常处理机制
System.out.println("其它异常." + e.getMessage());
return;
} finally {
// 不论出现异常与否,这部分总会执行
System.out.println("善后处理.");
}
System.out.println("程序正常结束.");
}
}
Java程序设计案例教程
} } public class ExceptionDemo7 {
public static void main(String[] args) { int i = -1; try { i = Example.readScore(); System.out.println(i); } catch (ScoreException e) { System.out.println(e.getMessage()); }
Java语言程序设计基础教程课件(第8章)
分类 抽象基类 访问文件
字节输入流
字节输出流
字符输入流
字符输出流
InputStream
OutputStream Reader FileReader
CharArraБайду номын сангаасReader
Writer FileWriter
FileInputStream FileOutputStr eam
访问数组
访问管道
ByteArrayInput Stream
2.字符流( Reader/Writer )
B u ffered R ead er C h arA rray R ead er I n p u tS tr e a m R e a d e r R ead er F ilte r R e a d e r P ip e d R e a d e r S tr in g R e a d e r F ile R e a d e r P u sh b a c k R e a d e r L in e N u m b e r R e a d e r
ByteArrayOut putStream
CharArrayW riter
PipedWriter
PipedInputStrea PipedOutputS PipedReader m tream
访问字符 串
缓冲流
StringReader
BufferedInputSt BufferedOutp ream utStream BufferedReader
◇ 文件属性相关方法 boolean exists( ); boolean canWrite( ); boolean canRead( ); boolean isFile( ); boolean isDirectory( ); long lastModified( ); long length( );
