用于对事件进行处理的方法和设备的制作方法

文档序号:6562077阅读:147来源:国知局
专利名称:用于对事件进行处理的方法和设备的制作方法
技术领域
本发明一般涉及面向对象的图形用户界面(GUI)领域。更具体地,本发明提供了一种用于在事件驱动的面向对象的图形用户界面(GUI)中对事件进行记录和重放的方法、计算机程序产品和数据处理系统。
背景技术
最早的交互式计算机依赖于电传打字机(TTY)或文本终端与操作人进行交互通信。人-机交互(HCI)的这些早期的形式只能实现基于文本或基于字符的信息交换。今天,许多计算机软件产品利用图形用户界面或GUI。GUI是可视的人-机交互手段,其除了文本或字符之外还利用图片或者其他可视的表示形式。
大多数GUI系统使用显示在用户显示屏上并由用户输入激活的可视控件。典型的可视控件包括但并不局限于按钮、文本框(用来输入文本)、单选按钮、复选框、选择框和菜单栏。在一个典型的GUI中,指示设备,如鼠标,用来在显示屏上移动光标并激活可视控件。GUI还常常包括静态显示组件,如标签和图标等,它们是用于显示的,但是其本身通常不具有输入功能。但是有时,当这些静态显示组件在显示屏上相对于显示屏上其他特征移动时,它们可以起到输入的作用(比如拖放一个文件的图标到回收站可以表示删除一个文件)。
很多GUI是所谓的“窗口”界面,因为它们将信息可视地排列在面板形式的显示屏上或叠置于称作“桌面”的背景上的“窗口”上。在很多系统中,窗口可以被指示设备拖放到显示屏上的不同位置,被放大、缩小或者同其他的窗口交迭。典型地,一个窗口将含有多个可视控件以允许用户通过激活窗口中的控件来与计算机程序进行交互。一种叫做“对话框”的特定形式的窗口,就是在需要由用户进行一些输入时,由程序显示的。
窗口、可视控件以及静态显示组件,都称作GUI组件,因为它们都是GUI的构造模块。有些GUI组件,比如窗口,叫做“容器组件”(或简称为“容器”),因为它们可以包含其他的组件。例如,一个窗口可以包含可视控件,诸如按钮或者菜单栏;以及静态显示组件,诸如文本标签和图标等。一个容器还可以包含另一个容器。比如,在某些基于窗口的文字处理器中,文字处理器本身占用一个(主)窗口,同时正在编辑的每个文件占用在主窗口内的另一窗口。
容器组件包括窗口,但也可以包括其他的可视的或者不可视的组件。比如,由美国芒廷维尤市(Mountain View)的SUN微系统公司出品的JAVATM编程语言,其中就详细定义了各种各样的可视容器组件,诸如窗口和对话框;以及不可视的容器组件,诸如“java.awt.Panel”容器组件,它可以单独地用于将多个可容纳的组件分组为一个单个的单元。容器的许多例子包括但不局限于窗口、对话框、面板、页签面板、记事本页面,或可包含一个或多个其他GUI组件的任意其他GUI组件。
用于在GUI组件上提供基本的操作的实际功能性,比如显示组件或者检测在组件处导入的用户输入(如通过指示设备在组件处指示或点击)等等,通常由系统级别的软件来提供,比如由操作系统来完成。一般来说,应用程序将对系统级别的软件进行调用以创建和维护GUI,同时系统级别的软件检测在特定GUI组件处导入的用户输入事件,并且向负责这些GUI组件的应用程序发出事件通告。
比如,华盛顿的雷德蒙德市(Redmond)的微软公司出品的WINDOWS操作系统可以提供用于创建GUI并且将用户输入事件转发给适当的应用程序的服务。WINDOWS操作系统的主界面本身也是一个GUI。在其他的设置中,较高级的系统软件可以在操作系统内核的顶层进行操作(例如,作为后台程序或后台进程)来提供GUI服务。例如,是一个开放源代码的GUI引擎,其作为操作系统中的进程运行。X11采用客户机-服务器模型,其中,一个X11服务器进程接受来自应用程序(客户机)的用于提供GUI服务的请求并将与特定GUI组件有关的用户输入事件转发给与这些组件相关联的应用程序。
作为替代,应用程序也可以有自己的代码来提供GUI服务。典型地,该代码来自用于执行基本GUI操作的可重复使用的代码库。
现在的许多编程语言实现都具有用于产生GUI的内置功能,这通常通过为由系统级别的软件所提供的GUI服务提供界面来完成,或者通过包括低级别GUI代码的库并在该编程语言中为之提供界面来完成。比如JAVATM编程语言就是面向对象的编程语言,其包括用于定义GUI的标准应用编程接口(API)。当前JAVATM编程语言标准包括的两个API是抽象窗口工具包(AWT)API和Swing API(其是在AWT API的基础上建立起来的)。在作为典型的面向对象的GUI API的JAVATM编程语言中,每一种类型的GUI组件都被定义成一个类。
在面向对象的编程语言中,一个类就是一个数据类型的定义,其包括数据的集合,称为成员变量;可以针对数据执行的操作的集合,称为方法(或者作为替代,称为成员函数)。所定义的数据类型中的数据的一个实际的集合称为对象。在面向对象的编程(OOP)的概念中,一个对象被称为类的一个“实例”,因为它是根据类定义的数据结构。在面向对象的程序设计语言中,用来产生一个对象的运行时进程称为“实例化”,并且在运行时存在的对象称为是“已实例化的”。
面向对象的编程语言还提供所谓的“继承性”。使用继承性,可以根据一个或几个现有的类(也叫“基”类)来定义一个新的类(称为“派生”类),以便派生类继承基类的一个或多个成员变量或方法。比如在JAVATM编程语言的AWT API中,“容器”就是称为“组件”的基类的一个派生类,“容器”将包括“组件”的至少某些方法和成员变量。因此,可以说,“容器”是由“组件”派生出来的。在很多例子中,派生类将包含并非从基类继承而来的其他的方法或成员变量。
并且,可以将一个派生类编写为替换掉(override)基类的用于特定方法的代码。比如一个基类“组件”可能具有一个方法叫做“显示”(show),用来显示GUI组件,派生类“容器”继承了该方法。因为显示一个容器(可能还包含其他的一些组件)比显示一个普通的GUI组件更特殊,所以“容器”类会定义与“组件”类的代码不同的用于“显示”的代码。
这一点非常重要,因为在大多数面向对象的语言中,派生类中的对象被看作是基类的更特殊的实例。因此,“容器”对象可以存储在属于“组件”类型的变量中,或者采用“组件”作为参量的方法还可以采用“容器”作为参量,因为“容器”可以继承“组件”的特征(即,成员变量和方法)。这种将派生类的对象看作它们好像仍是基类的实例的能力称为“多态”。
在一个面向对象的GUI API(诸如由JAVATM编程语言提供的那些)中, GUI组件被实例化为对象,并且在实例化的对象之间建立关系,以便定义GUI组件相对于彼此的位置和行为。比如“包含关系”就是GUI组件之间的关系,其将容器组件关联到由该容器组件所包含的组件。例如,在JAVATM编程语言中,组件典型地通过容器的一个称为“加入”(add)的方法来进入与容器的包含关系中。
一个典型的GUI组件具有定义该组件的特征的一个或多个属性。比如在典型的窗口GUI中的“按钮”组件将具有用于定义该按钮在显示屏上的大小、显示在按钮表面上的文本和图形、该按钮的背景色、与该按钮相关联的快捷键等等的属性。通常,实例化GUI组件的一部分程序代码(比如,函数、方法、子程序、步骤等)还将包含用于将该组件的属性设定为期望值的多行代码。例如,在JAVATM编程语言以及其他的面向对象的编程系统中,组件通常具有能够被执行来设定组件的特定属性的方法。
在许多实例中,能够记录对于GUI的输入(比如来自键盘或鼠标)以便保存和重放这些输入将会是很有用的。比如记录和重放输入事件的能力将提高反复的GUI测试的效率。在许多GUI工具包中,诸如Eclipse公司开发的标准窗口小部件工具包(SWT)或JAVATMAWT/Swing API中,不存在给GUI组件分配永久的唯一标识符的工具。所以每一次再现GUI(诸如在GUI应用程序的后续运行中),都要给GUI控件分配新的标识符。这就使持久地保存输入以便随后回放变得很困难,因为没有浅显的方法来记住特定的输入事件是以持久方式指向哪一控件的。
2005年4月28日的美国公开专利申请20050091510(MC KEON等人)提供了一种创建持久标识符的方法。但是这种方法需要创建冗长且复杂的路径标识符来保持标识符的唯一性。
所以,需要一种简单且透明的方法,用于以持久的方式唯一地识别GUI元素以便随后对所记录的事件进行回放。本发明提供了一种解决这一问题和其他问题的解决方案,并且提供优于以往的解决方案的更多的优势。

发明内容
本发明提供了一种用于记录GUI事件以及用于持久地识别事件的目标GUI组件以便随后回放所记录事件的方法、计算机程序产品和数据处理系统。根据本发明的优选实施例,通过以明确限定的次序(例如深度优先遍历)遍历组件层级结构,为每一个GUI组件分配一个数字标识符。随着在遍历中访问这些GUI组件,根据组件被访问的次序顺序地对组件进行编号。当接收到事件时,将这些事件与对应于事件目标组件的编号一起进行记录。在GUI程序的后续执行中,再次以相同的次序对层级结构进行遍历,这可以和之前一样使相同组件与相同标识符相关联。因此,通过将每个记录的事件应用到其由编号标识的相应的目标组件,可以回放所记录的事件。
前述内容仅是概述并且因此必然包含对细节的简化、概括和省略,所以,本领域内的普通技术人员能认识到这些概述只是说明性的,并且不以任何方式进行限制。本发明的其他方面、发明特征和优势,仅通过权利要求书来限定,并将在随后提出的非限制性详细描述中变得更加明显。


参照附图,本领域的普通技术人员可以更好的理解本发明,并且本发明的多个目的、特征和优势将变得更加明显,其中图1是根据本发明一个优选实施例的GUI组件层级结构的示图;图2是根据本发明一个优选实施例的修改的GUI组件层级结构的示图;图3是根据本发明一个优选实施例的经过重新编号的GUI组件层级结构的示图;图4是根据本发明一个优选实施例的将旧的GUI组件标识符映射到新的GUI组件标识符的关联数据结构的示图;图5是一个流程图,它描述了根据本发明一个优选实施例的对GUI组件层级结构进行标注的处理;图6是一个流程图,它描述了根据本发明的一个优选实施例的对事件进行记录以便随后回放的处理;图7A是诸如经由图6所示处理而生成的事件记录的阵列的示图;图7B是根据本发明的一个优选实施例的事件记录的串行化形式的示图;图8是一个流程图,它描述了根据本发明的一个优选实施例的对所记录事件进行回放的处理;以及图9是其中能够实现本发明的一个优选实施例的数据处理系统的框图。
具体实施例方式
以下将提供对本发明的一个例子的详细描述,并且其不应当被理解为限制本发明本身。相反,任意数目的变型都落入在说明书所附的权利要求中限定的本发明的范围内。
图1是根据本发明的一个优选实施例的GUI组件层级结构100的示图。GUI组件层级结构100可以以包括但不限于Eclipse SWT和JAVATMAWT/Swing API的多个GUI工具包中的任意一种工具包来实现。根据该优选的实施例,使用标识符来标识层级结构100中的每个组件(例如,组件102、104和106)。在本例中,所选的标识符是整数,但是任意相似的可列举的数字类型都可以用于表示标识符。可以根据明确限定的有序遍历处理将这些标识符编号分配给层级结构100中的组件。
在这个特例中,根据从左到右的深度优先遍历(用虚线108表示)对组件进行编号。如此,层级结构100的根元素,即组件102的编号为“1”,因为它是在对层级结构100的从左到右的深度优先遍历中被访问的第一个组件。类似地,组件104是在从左到右的深度优先遍历中被访问的第二个组件,因此它的编号为“2”;组件106是第三个被访问的组件,因此它的编号为“3”,依次类推。因此,所得到的对层级结构100中的组件的标注完全由层级结构100的拓扑来确定,而不是由任何其他数据(诸如组件自身内部的其他数据)来确定。因此,该标注是持久的,即任何时候再现(具有同一拓扑的)同一层级结构,都可以通过对该层级结构执行相同的明确限定的有序遍历来重新创建相同的标注。
此外,本领域的普通技术人员将能够认识到,所选择的特定遍历形式(例如,深度优先、宽度优先、从左到右、从右到左等)对于正确实施本发明来说并非是很关键的,只要所选择的遍历形式是一种使得对于每个可能的拓扑只可能有一种访问组件的次序即可。尽管从左到右的深度优先遍历必然有此特性,但还有无数的其他可能的有序遍历形式有此特性。
按图2所示,一旦对组件层级结构进行了标注,就可以对该层级结构做出后续的修改。例如,在图2中,修改的层级结构200(其由图1中的层级结构100修改而来)中的组件202(标注为“11”)与组件204(标注为“7”)交换了位置。并且,还在层级结构200中增加了附加的组件206,并将给定标识符“12”,即依次为(“11”之后的)下一个数字标识符。
如果必要或者如果方便,组件层级结构一旦被修改,就要被重新编号。例如,图3示出了层级结构200的重新编号的版本300。当这种重新编号发生时,可以创建诸如图4中的表400(对应于图2和图3中所示的标注)之类的关联数据结构,以便将先前定义的标识符(图4中的列402)映射到相应的新定义的标识符(图4中的列404)。
图5-图8示出了创建如图1所示的已标注的层级结构,以及使用该层级结构来识别事件的目标组件以便能够记录和回放这些组件和其相应的目标组件的处理。
图5是表示根据本发明的一个优选实施例的为GUI分配标识符的处理的流程图。这个处理在首次创建GUI本身时执行,或者在对层级结构进行重新编号时执行,以便与层级结构中的组件相关联的标识符正确地反映层级结构的当前拓扑。
当给GUI层级结构标注或重新标注标识符时,GUI组件的现有标识符(如果有的话)的当前值将被清除(方框502)。(在图1提供的例子中,这些标识符是数字标识符。)然后,根据预先规定的次序对层级结构进行遍历,并且随着在遍历中访问各个GUI组件,顺序地对每个组件进行编号(或者利用标识符进行标记)(方框504)。
图6是表示根据本发明的一个优选实施例的对事件进行记录以便随后回放的处理的流程图。在本发明的一个优选的实施例中,图6所描述的处理被包括在事件处理器例程中,每当事件发生时该例程就被异步地调用。当检测到事件时(方框600),检测事件的目标组件(方框602)。
随后,创建与该事件相应的事件记录(方框604)。在该事件记录中记录与所标识的目标组件相对应的数字标识符(方框606)。还在该事件记录中存储与该事件有关的其他信息(方框608)。该信息可以包括事件类型(例如,键盘按压、鼠标点击等)、屏幕坐标或对应于该事件的其他相似参数,以及时戳或延迟信息。该时戳或延迟信息是可以用于在回放中重新创建事件的定时的任选信息,其诸如是从记录最后事件开始已经逝去的时间量。如图8所示,该信息可以用于在所记录的事件的应用程序到GUI之间插入延迟的测量值。
图6所描述的处理的结果是如图7A所示的事件记录(例如记录701)的阵列700。阵列700表示所记录事件的序列。阵列700中的每条记录都包含与该事件相关的GUI组件的标识符(标识符702)、在该事件之前发生的延迟时间(延迟时间703),以及事件对象706的引用或指针704,其为事件的GUI工具包的表示形式,并且其包含与所关注事件的类型有关的信息。
阵列700中包含的信息可以存储在持久存储器中以供后续的使用。在本发明的一个优选实施例中,完成该存储的一种方式是将每条记录(例如记录701)转换为串行化(文本)表示形式708,如图7B所示。作为如何对事件记录进行串行化的一个例子,串行化的表示形式708包含前导符710,其表示串行化事件记录的开始;所代表的事件的目标组件的标识符(标识符712);延迟时间714;以及对该事件记录所代表的事件的类型的识别(事件类型716)。本领域的普通技术人员能够理解,在不偏离本发明的范围和本质的情况下并且没有限制地,可以在本发明的实施例中使用事件记录的各种各样的不同串行化形式。此外,可以以这种串行化形式来存储/代表不同数量的信息。例如,“键盘按压”事件可以串行化为具有与所按压的特定的键有关的附加信息。
作为替代,可以使用其他形式的持久存储。这种其他形式的持久存储可以作为图7B中的串行化/平面文件(serialized/flat-file)存储的补充或替代。例如,可以使用关系数据库或其他形式的数据库管理系统来存储事件信息。
图8是表示根据本发明的一个优选实施例的对所记录事件进行回放的处理的流程图。当存在要进行回放的事件时(方框800是),(从持久存储器或从存储器中)读取下一个事件记录(方框802)。然后,将当前进程或线程挂起(使其休眠)在事件记录中所记录的特定延迟时间量(方框804)。然后,从事件记录中读取与该事件的目标组件相对应的标号,并通过如图1所示地对GUI组件层级结构进行遍历来对相应的组件进行定位(方框806)。然后,将所记录的事件应用到所识别的目标组件(方框808)。重复该处理,直到没有更多的事件需要回放为止(方框800)。
图9示出了信息处理系统901,其是能够执行在此针对本发明的一个优选实施例而描述的计算操作的计算机系统/服务器的简化的例子。计算机系统901包括与主机总线902相连的处理器900。与总线902相连的还有层二(L2)高速缓冲存储器904。主机-PCI桥906连接到主存储器908,包括高速缓冲存储器和主存储器控制功能,并提供总线控制以处理PCI总线910、处理器900、L2高速缓存904、主存储器908以及主机总线902之间的传送。主存储器908连接到主机-PCI桥906以及主机总线902。仅由主机处理器900使用的设备,诸如LAN(局域网)卡930,连接到PCI总线910。服务处理器接口和ISA访问通道912提供PCI总线910与PCI总线914之间的接口。以这种方式,PCI总线914与PCI总线910被隔离开。诸如闪存918之类的设备连接到PCI总线914。在一种实现中,闪存918包括BIOS(基本输入输出系统)代码,其包括用于各种低级别系统功能和系统引导功能的必要的处理器可执行代码。
PCI总线914提供了用于由主机处理器900和服务处理器916所共享的各种设备(包括,例如闪存918)的接口。PCI-ISA桥935提供处理PCI总线914与ISA总线940、通用串行总线(USB)功能性945、电源管理功能性955之间的传送的总线控制,并且可以包括未示出的其他功能元件,诸如实时时钟(RTC)、DMA(直接存储器访问)控制、中断支持以及系统管理总线支持等。非易失性RAM 920连接到ISA总线940。服务处理器916包括JTAG和I2C总线922,其用于在初始化步骤中与处理器900通信。JTAG/I2C总线922还连接到L2高速缓存904、主机-PCI桥906以及主存储器908,以便在处理器、服务处理器、L2高速缓存、主机-PCI桥以及主存储器之间提供通信路径。服务处理器916还可以访问系统电源资源以便关闭信息处理设备901。
还可将外围设备和一些输入输出(I/O)设备连接到各种接口(例如,连接到ISA总线940的并行接口962、串行接口964、键盘接口968和鼠标接口970)。作为替代,很多I/O设备还可以由连接到ISA总线940的高级I/O控制器(未示出)来供应。
为了将计算机系统901连接到另一个计算机系统以便通过网络来复制文件,将LAN卡930连接到PCI总线910。类似地,为了通过电话线连接将计算机系统901连接到ISP(服务提供商)以便连接到因特网,将调制解调器975连接在串行端口964和PCI-ISA桥935。
尽管在图9中描述的计算机系统能够执行在此描述的处理,但这种计算机系统只是计算机系统的一个例子。本领域的普通技术人员将能够理解,很多其他的计算机系统设计也能够执行在此描述的处理。
本发明的优选实施例之一是客户端应用,即例如可以驻留在计算机随机访问存储器中的代码模块中的一组指令(程序代码)或其他功能描述性资料。在计算机需要之前,该组指令可以存储在另一个计算机存储器中,例如,在硬盘驱动器中,或者在诸如光盘(以便最终在CD ROM中使用)或软盘(以便最终在软盘驱动器中使用)之类的可移动存储器中,或者通过因特网或其他计算机网络下载。如此,本发明可以作为在计算机中使用的计算机程序产品来实现。此外,尽管所描述的各种方法都方便地以由软件选择性地激活或重新设置的通用计算机的形式来实现,但是本领域的普通技术人员还能够理解,这些方法还可以以硬件形式、以固件形式或者以构造来执行所需方法步骤的更专门的设备的形式来实现。功能描述性资料是为机器赋予功能性的信息。功能描述性资料包括但不限于计算机程序、指令、规则、事实、可计算函数的定义、对象以及数据结构。
权利要求
1.一种计算机实现的方法,包括根据对图形用户界面组件层级结构进行的有序遍历,为所述层级结构中的多个组件分配标识符;检测事件;将与所述事件相关联的目标组件的相应标识符与所述事件一起进行记录。
2.根据权利要求1所述的方法,其中所述对所述层级结构进行的有序遍历是深度优先遍历。
3.根据权利要求1所述的方法,其中所述标识符是数字标识符。
4.根据权利要求1所述的方法,其中将所述事件连同与从前一事件开始已经逝去的时间量相对应的延迟量一起进行记录。
5.根据权利要求1所述的方法,其中将所述事件记录在持久存储器中。
6.根据权利要求1所述的方法,还包括通过再现关于所述目标组件的所记录事件,回放所记录事件,其中使用所记录的标识符来识别所述目标组件。
7.根据权利要求1所述的方法,还包括对所述组件层级结构进行修改以获得已修改的层级结构;以及根据对所述已修改的层级结构进行的有序遍历为所述多个组件分配新的标识符。
8.根据权利要求7所述的方法,还包括生成一个定义到所述新的标识符的映射的关联数据结构。
9.根据权利要求1所述的方法,还包括将另外的组件增加到所述组件层级结构;以及响应于增加所述另外的组件,为所述另外的组件分配下一个标识符,其中所述下一个标识符顺序地跟在已经分配的最后的标识符后面。
10.一种数据处理系统,包括至少一个处理器;与所述至少一个处理器相关联的存储器;以及所述存储器中的一组指令,其中所述至少一个处理器执行所述一组指令以执行以下操作根据对图形用户界面组件层级结构进行的有序遍历,为所述层级结构中的多个组件分配标识符;检测事件;以及将与所述事件相关联的目标组件的相应标识符与所述事件一起进行记录。
11.根据权利要求10所述的数据处理系统,其中将所述事件连同与从前一事件开始已经逝去的时间量相对应的延迟量一起进行记录。
12.根据权利要求10所述的数据处理系统,其中将所述事件记录在持久存储器中。
13.根据权利要求10所述的数据处理系统,其中所述至少一个处理器执行所述一组指令以执行以下操作通过再现关于所述目标组件的所记录事件,回放所记录事件,其中使用所记录的标识符来识别所述目标组件。
14.根据权利要求10所述的数据处理系统,其中所述至少一个处理器执行所述一组指令以执行以下操作对所述组件层级结构进行修改以获得已修改的层级结构;以及根据对所述已修改的层级结构进行的有序遍历为所述多个组件分配新的标识符。
全文摘要
本发明公开了一种用于记录GUI事件以及用于持久地识别事件的目标GUI组件以便随后回放所记录事件的方法、计算机程序产品和数据处理系统。根据本发明的优选实施例,通过以明确限定的次序遍历组件层级结构,为每一个GUI组件分配一个数字标识符。随着在遍历中访问这些GUI组件,根据组件被访问的次序顺序地对组件进行编号。当接收到事件时,将这些事件与对应于事件的目标组件的编号一起进行记录。在GUI程序的后续执行中,再次以相同的次序对层级结构进行遍历,这使得以相同的方式将标识编号分配给组件。因此,通过将每个记录的事件应用到经由编号进行识别的相应的目标组件,可以回放所记录的事件。
文档编号G06F9/44GK1987775SQ20061013711
公开日2007年6月27日 申请日期2006年10月20日 优先权日2005年12月21日
发明者巴里·A·费根鲍姆 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1