|
java事件模型 |
|
|
JAVA事件处理机制事件事件的概 念与事件对象事件源事件类型事件处理机制事件处理器(事件处理方法)事件监听器接口与事件监听器类事件监听器适配器GU I的设计步骤建立用户界面设计一个顶层容器对象,如JFrame确定布局,增加组件改变组件颜色、字体增加事件处理编写事件监 听器类(内含事件处理方法)在事件源上注册事件监听器对象显示用户界面事件处理机制的几个重要概念事件事件是用户在界面上的 一个操作(通常使用各种输入设备,如:鼠标、键盘等来完成)。当一个事件发生时,该事件用一个事件对象来表示。事件对象有对应的事件类。 不同的事件类描述不同类型的用户动作。事件类包含在java.awt.event和javax.swing.event包中。事件源产 生事件的组件叫事件源。在一个按钮上单击鼠标时,该按钮就是事件源,会产生一个ActionEvent类型的事件。事件处理机制的几 个重要概念事件处理器(事件处理方法)事件处理器是一个接收事件对象并进行相应处理的方法。事件处理器包含在一个类中,这个类的对象负 责检查事件是否发生,若发生就激活事件处理器进行处理。事件处理机制的几个重要概念事件监听器类包含事件处理器,并负责检查事件 是否发生,若发生就激活事件处理器进行处理的类叫做事件监听器类。其实例就是事件监听器对象。事件监听器类必须实现事件监听器接口或继承事 件监听器适配器类。事件监听器接口定义了处理事件必须实现的方法。事件监听器适配器类是对事件监听器接口的简单实现。目的是为了减少编程 的工作量。事件监听器接口和事件监听器适配器类也都包含在java.awt.event和javax.swing.event包中。 事件处理机制的几个重要概念注册事件监听器为了能够让事件监听器检查某个组件(事件源)是否发生了某些事件,并且在发生时激活事件处 理器进行相应的处理,必须在事件源上注册事件监听器。这是通过使用事件源组件的以下方法来完成的:addXxxListener(事件监 听器对象)Xxx对应相应的事件类。事件处理机制---委托事件处理图形界面程序(一个类)1监听器类(含事件处理器 )监听器对象(含事件处理器)2实例化3注册外部动作事件对象产生并传递事件对象接收事件对象,激活事件处理器, 实现预定功能事件源(例如一个按钮)含有序号1、2、3是用户的应用程序需要完成的,其余为JAVA内部机制自动完成。事件处理 实例:关闭窗口图形界面程序(TestFrame)窗口监听器类MyWindowListener(含关闭窗口事件处理器 )窗口监听器对象(含关闭窗口事件处理器)实例化注册单击关闭按钮事件对象e产生并传递窗口事件对象W indowEvente接收事件对象e,激活事件处理器,实现关闭窗口功能。事件源窗口对象frame含有在重复一遍GUI的 设计步骤建立用户界面设计一个顶层容器对象,如JFrame确定布局,增加组件改变组件颜色、字体增加事件处理编写事件监听器 类(内含事件处理方法)在事件源上注册事件监听器对象显示用户界面监听器类-MyWindowListener.javaim portjava.awt.event.WindowListener;importjava.awt.event.WindowE vent;publicclassMyWindowListenerimplementsWindowListener{ … publicvoidwindowClosing(WindowEvente)//事件处理器{ e.get Window().setVisible(false); e.getWindow().dispose(); System.e xit(0); }…}图形界面程序-TestFrame.javaimportjava.awt.; publicclassTestFrame{ publicstaticvoidmain(String[]args ) { Framefr=newFrame(“事件处理实例"); fr.setSize(500,500); //设置窗口的大小 fr.setBackground(Color.green);//设置窗口背景颜色 //注册事件监听器对象,Frame组件对象fr为事件源fr.addWindowLis tener(newMyWindowListener()); fr.setVisible(true); //显示窗口 }}再论事件处理机制事件、事件监听器接口、事件监听器类:每一类事件有一个相应的事件监听器接口,该接口定 义了接收和处理事件的抽象方法。实现该接口的类,就是监听器类。其对象可作为监听器对象向相应的组件注册。事件的类名通常为:XxxEv ent对应的事件监听器接口名通常为:XxxListener一个监听器接口定义了一种以上的抽象事件处理方法(事件处理器)。事件 监听器类实现事件监听器接口,其类名可以由我们自己取。事件监听器类需要我们自己编写。一个组件可以注册一个或多个监听器对象,事件对 象只向已注册的监听器对象报告事件的发生。事件监听器类的编写要点事件监听器类应该包括以下两部分内容:1.在事件监听器类的声 明中指定要实现的监听器接口名,如:publicclassMyListenerimplementsXxxListener { …}2.实现监听器接口中的事件处理方法,如:publicvoid事件处理方法名(XxxEvente){ ...//处理某个事件的代码...}然后,在一个或多个组件上可以进行监听器类的实例的注册。如:组件对象.addXxxLis tener(MyListener对象);事件监听器类实例importjavaawt.event.;publ icclassButtonHandlerimplementsActionListener{publicvoi dactionPerformed(ActionEvente){ System.out.println(“Action occurred”); System.out.println(“Button’slabelis:”+ e.getAct ionCommand());}}使用事件监听器类importjava.awt.;publicclass TestButton{publicstaticvoidmain(Stringargs[]){ Fra mef=newFrame(“Test”); Buttonb=newButton(“PressMe!”); b .addActionListener(newButtonHandler()); f.add(b,“Center”); f .pack(); f.setVisible(true);}}事件处理的编程方法总结要处理某GUI组件(假 定为c)上发生的XXXEvent事件,其通用的编程方法是:编写一个监听器类,该监听器类实现了XXXListener接口,(假定监 听器类的类名为MyXXXListener);在MyXXXListener中的相应事件处理方法中编写事件处理代码(事件处理器)。 调用GUI组件c的addXXXListener()方法注册事件监听器对象。c.addXXXListener(newMyXXXL istener());要处理C上的多种事件,可以编写多个相应的监听器类,进行多次注册。也可以编写一个实现了多个监听器接口的类,进 行一次注册。图形用户界面编程技巧通常将图形组件作为类的成员将事件监听器类写成GUI类的内部类,方便对组件进行访问。 监听器适配器类JAVA中提供了大部分监听器接口的适配器类,其目的是简化事件监听器类的编写,监听器适配器类是对事件监听器接口的简单 实现(方法体为空),这样用户可以把自己的监听器类声明为适配器类的子类,从而可以不管其他方法,只需重写需要的方法。对应于监听器接口 XxxListener的适配器接口的类名为XxxAdapter。?…publicclassMouseClickHandl erextendsMouseAdapter{ publicvoidmouseClicked(MouseEvente){ …. }}事件、接口、适配器与事件处理方法对应表事件监听器接口监听器适配器类事件处理方法Acti onEventActionListener无actionPerformedAdjustmentEventAdjust mentListener无adjustmentValueChangedComponentEventComponen tListenerComponentAdaptercomponentHiddencomponentMoved componentResizedcomponentShownContainerEventContainerListene rContainerAdaptercomponentAddedcomponentRemovedFocusEvent FocusListenerFocusAdapterfocusGainedfocusLostItemEventI temListener无itemStateChanged事件监听器接口监听器适配器类事件处理方法KeyEv entKeyListenerKeyAdapterkeyPressedkeyRele asedkeyTypedMouseEventMouseListenerMouseAdaptermouseClick edmouseEnteredmouseExitedmousePressedmouseReleasedMouseM otionEventMouseMotionListenerMouseMotionAdaptermo useDraggedmouseMovedTextEventTextListener无textValueChange dWindowEventWindowListenerWindowAdapterwindowActivatedwind owClosedwindowClosingwindowDeactivatedwindowDeiconifiedwi ndowIconifiedwindowOpened事件、接口、适配器与事件处理方法对应表一个监听器实现多个监听器接口 一个监听器对象注册到多个组件实例一个监听器实现多个监听器接口一个监听器对象注册到多个组件实例在同一个组件上注册 多个监听器。方法是根据需要多次调用addXXXListener()方法注册多个监听器。使用内部类进行事件处理(有名内 部类)优点既可使用Adaptor类,又避免多重继承的限制。便于访问类中的各种成员。方法在一个类中定义内部类,由内部类继承 相应Adaptor类。例publicclassMyClassextendsApplet{//MyClass不 能再继承MouseAdapter类 ... someObject.addMouseListener(newMyAdapte r());//注册监听器对象 ... classMyAdapterextendsMouseAdapter{// 实现监听器的内部类 publicvoidmouseClicked(MouseEvente){ ...//Eve nthandlerimplementationgoeshere... } }}使用内部类进行事件处 理(匿名类)匿名类(AnonymousClass)是没有名字的类。可以使用匿名内部类进行事件处理。例:publiccla ssMyClassextendsApplet{ ... someObject.addMouseListener( newMouseAdapter(){ publicvoidmouseClicked(MouseEvente){ ...//事件处理器代码}}); ...}实例代码习题习题:利用图形界面编写一个简单的文本编辑器,包含一个文本域和一个保存按钮。单击保存按钮将文本域(TextArea)中的内容保存到一个文本文件mytext.txt中。提示:使用TextArea的getText()方法可以获得文本域中的内容。使用内部类定义事件监听器,实现事件监听器接口ActionListener。可使用fileWriter的Write(Stringstr,intoff,intlen)方法将内容写入文件。 |
|
|
|
|
|
|
|
|
|
|