java AWT教程.docx_第1页
java AWT教程.docx_第2页
java AWT教程.docx_第3页
java AWT教程.docx_第4页
java AWT教程.docx_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

5.2.1 事件类 与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(文本事件,文本对象改变) 5.2.2 事件监听器 每类事件都有对应的事件监听器,监听器是接口,根据动作来定义方法。 例如,与键盘事件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 (listener); 注销监听器: public void remove (listener); 例如Button类:(查API) public class Button extends Component public synchronized void addActionListener(ActionListener l); public synchronized void removeActionListener(ActionListener l); 5.2.3 AWT事件及其相应的监听器接口(1) 5.2.3 AWT事件及其相应的监听器接口(2) 例5.10说明事件处理模型的应用。 例5.10 import java.awt.*; import java.awt.event.*; public class ThreeListener implements MouseMotionListener,MouseListener,WindowListener /实现了三个接口 private Frame f; private TextField tf; public static void main(String args) ThreeListener two = new ThreeListener(); two.go(); public void go() f = new Frame(Three listeners example); f.add(new Label(Click and drag the mouse),North); tf = new TextField(30); f.add(tf,South); /使用缺省的布局管理器 f.addMouseMotionListener(this); /注册监听器MouseMotionListener f.addMouseListener(this); /注册监听器MouseListener f.addWindowListener(this); /注册监听器WindowListener f.setSize(300,200); f.setVisible(true); public void mouseDragged (MouseEvent e) /实现mouseDragged方法 String s = Mouse dragging : X=+e.getX()+Y = +e.getY(); tf.setText(s); public void mouseMoved(MouseEvent e) /对其不感兴趣的方法可以方法体为空 public void mouseClicked(MouseEvent e) public void mouseEntered(MouseEvent e) String s = The mouse entered; tf.setText(s); public void mouseExited(MouseEvent e) String s = The mouse has left the building; tf.setText(s); public void mousePressed(MouseEvent e) public void mouseReleased(MouseEvent e) public void windowClosing(WindowEvent e) /为了使窗口能正常关闭,程序正常退出,需要实现windowClosing方法 System.exit(1); 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) 上例中有如下几个特点: 1可以声明多个接口,接口之间用逗号隔开。 implements MouseMotionListener, MouseListener, WindowListener; 2可以由同一个对象监听一个事件源上发生的多种事件: f.addMouseMotionListener(this); f.addMouseListener(this); f.addWindowListener(this); 则对象f 上发生的多个事件都将被同一个监听器接收和处理。 3事件处理者和事件源处在同一个类中。本例中事件源是Frame f,事件处理者是类ThreeListener,其中事件源Frame f是类ThreeListener的成员变量。 4可以通过事件对象获得详细资料,比如本例中就通过事件对象获得了鼠标发生时的坐标值。 public void mouseDragged(MouseEvent e) String s=Mouse dragging :X=+e.getX()+Y=+e.getY(); tf.setText(s); Java语言类的层次非常分明,因而只支持单继承,为了实现多重继承的能力,Java用接口来实现,一个类可以实现多个接口,这种机制比多重继承具有更简单、灵活、更强的功能。在AWT中就经常用到声明和实现多个接口。记住无论实现了几个接口,接口中已定义的方法必须一一实现,如果对某事件不感兴趣,可以不具体实现其方法,而用空的方法体来代替。但却必须所有方法都要写上。 5.2.4 事件适配器 Java语言为一些Listener接口提供了适配器(Adapter)类。可以通过继承事件所对应的Adapter类,重写需要方法,无关方法不用实现。事件适配器为我们提供了一种简单的实现监听器的手段, 可以缩短程序代码。但是,由于java的单一继承机制,当需要多种监听器或此类已有父类时,就无法采用事件适配器了。 1事件适配器-EventAdapter 下例中采用了鼠标适配器: import java.awt.*; import java.awt.event.*; public class MouseClickHandler extends MouseAdaper public void mouseClicked(MouseEvent e) /只实现需要的方法 java.awt.event包中定义的事件适配器类包括以下几个: 1ComponentAdapter( 组件适配器) 2ContainerAdapter( 容器适配器) 3FocusAdapter( 焦点适配器) 4KeyAdapter( 键盘适配器) 5MouseAdapter( 鼠标适配器) 6MouseMotionAdapter( 鼠标运动适配器) 7WindowAdapter( 窗口适配器) 2. 用内部类实现事件处理 内部类(inner class)是被定义于另一个类中的类,使用内部类的主要原因是由于: 一个内部类的对象可访问外部类的成员方法和变量,包括私有的成员。 实现事件监听器时,采用内部类、匿名类编程非常容易实现其功能。 编写事件驱动程序,内部类很方便。 因此内部类所能够应用的地方往往是在AWT的事件处理机制中。 例5.11 import java.awt.* ; import java.awt.event.*; public class InnerClass private Frame f; private TextField tf; public InnerClass() f=new Frame(Inner classes example); tf=new TextField(30); public voidi launchFrame() Label label=new Label(Click and drag the mouse); f.add(label,BorderLayout.NORTH); f.add(tf,BorderLayout.SOUTH); f.addMouseMotionListener(new MyMouseMotionListener();/*参数为内部类对象*/ f.setSize(300,200); f.setVisible(true); class MyMouseMotionListener extends MouseMotionAdapter /*内部类开始*/ public void mouseDragged(MouseEvent e) String s=Mouse dragging: x=+e.getX()+Y=+e.getY(); tf.setText(s); ; public static void main(String args) InnerClass obj=new InnerClass(); obj.launchFrame(); /内部类结束 3匿名类(Anonymous Class) 当一个内部类的类声名只是在创建此类对象时用了一次,而且要产生的新类需继承于一个已有的父类或实现一个接口,才能考虑用匿名类,由于匿名类本身无名,因此它也就不存在构造方法,它需要显示地调用一个无参的父类的构造方法,并且重写父类的方法。所谓的匿名就是该类连名字都没有,只是显示地调用一个无参的父类的构造方法。 例5.12 import java.awt.* ; import java.awt.event.*; public class AnonymousClass private Frame f; private TextField tf; public AnonymousClass() f=new Frame(Inner classes example); tf=new TextField(30); public void launchFrame() Label label=new Label(Click and drag the mouse); f.add(label,BorderLayout.NORTH); f.add(tf,BorderLayout.SOUTH); f.addMouseMotionListener(new MouseMotionAdapter() /匿名类开始 public void mouseDragged(MouseEvent e) String s=Mouse dragging: x=+e.getX()+Y=+e.getY(); tf.setText(s); ); /匿名类结束 f.setSize(300,200); f.setVisible(true); public static void main(String args) AnonymousClass obj=new AnonymousClass(); obj.launchFrame(); 其实大家仔细分析一下,例5.11和5.12实现的都是完全一样的功能,只不过采取的方式不同。5.11中的事件处理类是一个内部类,而5.12的事件处理类是匿名类,可以说从类的关系来说是越来越不清楚,但是程序也越来越简练。熟悉这两种方式也十分有助于大家编写图形界面的程序。 5.3 AWT组件库(1) 本节从应用的角度进一步介绍AWT的一些组件,目的使大家加深对AWT的理解,掌握如何用各种组件构造图形化用户界面,学会控制组件的颜色和字体。下面是一些常用的组件的介绍: 1 按钮(Button) 按钮是最常用的一个组件,其构造方法是:Button b = new Button(Quit); 当按钮被点击后,会产生ActionEvent事件,需ActionListener接口进行监听和处理事件。 ActionEvent的对象调用getActionCommand()方法可以得到按钮的标识名,缺省按钮名为label。 用setActionCommand()可以为按钮设置组件标识符。 2.复选框 (Checkbox) 复选框提供简单的on/off开关,旁边显示文本标签。 构造方法如下: setLayout(new GridLayout(3,1); add(new Checkbox(one,null,true); add(new Checkbox(two); add(new Checkbox(three); 复选框用ItemListener 来监听ItemEvent事件,当复选框状态改变时用getStateChange()获取当前状态。使用getItem()获得被修改复选框的字符串对象。 例5.13 class Handler implements ItemListener public void itemStateChanged(ItemEvent ev) String state = deselected; if (ev.getStateChange() = = ItemEvent.SELECTED) state = selected System.out.println(ev.getItem()+ +state); 3.复选框组(CheckboxGroup) 使用复选框组,可以实现单选框的功能。方法如下: setLayout(new GridLayout(3, 1); CheckboxGroup cbg = new CheckboxGroup(); add(new Checkbox(one, cbg, true); add(new Checkbox(two, cbg, false); add(new Checkbox(three, cbg, false); 5.3 AWT组件库(2) 4. 下拉式菜单(Choice) 下拉式菜单每次只能选择其中的一项,它能够节省显示空间,适用于大量选项。 Choice Colorchooser=new Choice(); Colorchooser.add(Green); Colorchooser.add(Red); Colorchooser.add(Blue); Choice 用ItemListener接口来进行监听 5. Canvas 一个应用程序必须继承Canvas类才能获得有用的功能,比如创建一个自定义组件。如果想在画布上完成一些图形处理,则Canvas类中的paint()方法必须被重写。 Canvas组件监听各种鼠标,键盘事件。当在Canvas组件中输入字符时,必须先调用requestFocus()方法。 例5.14 import java.awt.*; import java.awt.event.*; import java.util.*; public class MyCanvas implements KeyListener, MouseListener Canvas c; /声明一个画布对象 String s=; public static void main(String args) Frame f=new Frame(Canvas); MyCanvas mc=new MyCanvas(); mc.c=new Canvas(); f.add(Center,mc.c); f.setSize(150,150); mc.c.addMouseListener(mc); /注册监听器 mc.c.addKeyListener(mc); /注册监听器 f.setVisible(true); public void mouseClicked(MouseEvent ev) System.out.println(MouseClicked); c.requestFocus();/获得焦点,表示该窗口将接收用户的键盘和鼠标输入 public void keyTyped(KeyEvent ev) System.out.println(KeyTyped); s+=ev.getKeyChar(); /获取每个输入的字符,依次添加到字符串s中 c.getGraphics().drawString(s,0,20); /显示字符串s public void keyPressed(KeyEvent ev) System.out.println(KeyPressed); public void keyReleased(KeyEvent ev) System.out.println(KeyReleased); public void mousePressed(MouseEvent ev) System.out.println(MousePressed); public void mouseReleased(MouseEvent ev) System.out.println(MouseReleased); public void mouseEntered(MouseEvent ev) System.out.println(MouseEntered); public void mouseExited(MouseEvent ev) System.out.println(MouseExited); 6. 单行文本输入区(TextField) 只能显示一行,当回车键被按下时,会发生ActionEvent事件,可以通过ActionListener中的actionPerformed()方法对事件进行相应处理。可以使用setEditable(boolean)方法设置为只读属性。 单行文本输入区构造方法如下: TextField tf1,tf2,tf3,tf4: tf1=new TextField(); tf2=new TextField(,20); /显示区域为20列 tf3=new TextField(Hello!); /按文本区域大小显示 tf4=new TextField(Hello!,30); /初始文本为Hello!, 显示区域为30列 5.3 AWT组件库(3) 7. 文本输入区(TextArea) TextArea可以显示多行多列的文本。使用setEditable(boolean)方法,可以将其设置为只读的。在TextArea中可以显示水平或垂直的滚动条。 要判断文本是否输入完毕,可以在TextArea旁边设置一个按钮,通过按钮点击产生的ActionEvent对输入的文本进行处理。 8. 列表(List) 列表中提供了多个文本选项,列表支持滚动条,可以浏览多项 List lst=new List(4,false); /两个参数分别表示显示的行数、是否允许多选 lst.add(Venus); lst.add(Earth); lst.add(JavaSoft); lst.add(Mars); cnt.add(lst); 9. 框架(Frame) Frame是顶级窗口,可以显示标题,重置大小。当Frame被关闭,将产生WindowEvent事件,Frame无法直接监听键盘输入事件。 10. 对话框(Dialog) 它是Window类的子类。对话框和一般

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论