资源描述
GWT开发者手册格式规范:这种字体表示代码或术语文档目的:对新进员工进行GWT技术培训,使他们可以在以前没有接触过GWT的基础上,通过本文档,经过短期学习,即可使用GWT进行日常开发工作。GWT 版本:gwt-windows-1.3.3面向读者:熟悉JAVA语言,有用J2EE开发三层架构软件系统的经验WEB应用程序开发 者。目录 基本概念.3GWT编译器.3跨浏览器支持.5在主机模式中调试.6在WEB模式中部署.6HTML主页.6客户端代码.7服务端代码.8项目结构.8模块.9入口类.10原代码路径.10公共路径.10特殊规范.10命令行工具.14二、构建用户界面.19三、远程过程调用(RPC).36规范.37四、JUnit集成.44五、国际化(internationalization).46六、JavaScript本地接口(JSNI)(未完成,不提倡使用).50七、GWT应用程序自定义应用程序框架.52八、自定义组件部分.54一基本概念核心GWT概念,诸如:把JAVA原码编译为JAVASCRIPT原码,调试,跨浏览器支持,和定义模块(module)等。GWT编译器主要用于把JAVA应用程序转换成对应的JAVASCRIPT应用程序GWT的核心是一个编译器,它可以把JAVA代码转换成JAVASCRIPT代码,把用于实际开 发工作的JAVA应用程序转变成等价的JAVASCRIPT应用程序,一般来说:1.如果你的GWT应用在主机模式中编译运行,2.并且GWT把你的应用程序编译成JAVASCRIPT应用程序,而没有报错,3.那么的你的应用程序将会以同样的方式在WEB浏览器中工作,就像在主机模式中一样。GWT编译器支持大多数JAVA语言特性。GWT运行时库仿真了 JAVA运行时 库的一个子集。注意:1.语言支持:GWT可以编译J2SE 1.4.2或更早版本。但有一些不一致需要注意。固有类型byt,char,short,int,long,float,double,Obj ct,String,和数组者B是支持的。毕竟,在JAVASCRIPT语言中没有64位整型,所以long类型变量被映射到JAVASCRIPT的双精度浮点类型值。为了保证主机模式和WEB模式中最大的一致性,我们推荐使用int类型变量 异常try,catch,finally和用户自定义的异常都可以正常支持,但是注意,在WEB模式中Throwabl.gtStackTrac()方法不被支持。断言GWT编译器解析JAVA ass工t声明,但是它们不会被生成对应的JAVASCRIPT 代码。多线程和同步JAVASCRIPT解析器是单线程的,所以GWT自然接受synchronizd关键字,但是没有实际作用。同步相关的类库方法也不可用,包括Objct.wait(),Objct,notify(),和 Objct.notifyAll()反射为了效率最大化,GWT把你的JAVA原代码编译成单块集成脚本,并且不支持 类的并发动态装载(我也不大懂是怎么何事,总之不要在GWT中使用JAVA的 反射机制),另外,其他最佳化选项也不包括对反射的一般支持。但是可以使用GWT.gtTypNam(Ob jct)来查询个对象的类名。无用对象清理JAVASCRIPT不支持垃圾回收阶段的对象清理,所以GWT不能支持WEB模式 下的JAVA对象清理。严格浮点JAVA语言规范精确地定义了浮点支持,包括单精度和双精度,还有strictfp关键字。GWT不支持strictfp关键字,并且不能保证在转换后的代码中的浮 点的详细精度,所以如果你需要保证精度的计算,则要避免在客户端代码中进行。2.运行时库支持GWT只支持JAVA2标准版和企业版类库的一个小的子集,由于这些库非常大,并且有很多在WEB浏览器中不可用的功能。详细请参考:java.lang and java.util的API,那里列出了被支持的类和两个类库(GWT和标准JAVA类库)行为上的 不同。一些特定领域GWT与JAVA标准运行时不同。正则表达式JAVA正则表达式的语法类似但也不同于JAVASCRIPT的正则表达式语 法。例如,replaceAll和split方法。你可能只想使用和JAVASCRIPT同效的JAVA正则表达式。序列化JAVA的序列化依赖于很少的机制,但这些机制在编译后的JAVASCRIPT中不 可用,例如动态类装载和反射。所以GWT不支持标准JAVA序列化,但是GWT 有一个RPC机制,它提供了调用远程方法时与服务器交互的自动对象序列化。注意:如果你确保在一开始你的客户端代码中只使用了可以转换的类,你将会避 免很多麻烦。为了能够尽早确定问题所在,你的代码将会在主机模式中运行时被 检查是否符合JRE仿真库。所以,不支持的类库将会在第一次运行应用程序时 被检测到。应该尽早运行并经常运行你的程序。跨浏览器支持GWT架构可以在单一代码的基础上支持多浏览器。GWT使你不用过于担心跨浏览器的不相容性。如果你关注嵌入式的界面元素和 组件,你的应用程序在最近版本的Internet Explorer,Firefox,和Safari浏览器 中的表现是一致的(大多数情况下,Opera浏览器也是这样)。DHTML用户界 面是非常复杂的,虽然这样,也要确定在每个浏览器中彻底测试你的应用程序。只要可能,GWT符合浏览器的本地用户界面元素。例如:GWT的Button元素是一个真正的HTMLbutton,而不是一个合成的类似按钮的界面元素,比如,一个div。这说明GWT按钮在不同的浏览器和不同的客户端操作系统中 都能恰当地显示。我们喜欢本地浏览器控制是因为它们是快速、可用并且被用户 熟悉。当开发一个风格化的WEB应用程序,CSS是非常理想的。开发者应该在样式表 中定义样式,这些样式使用样式名(stylnames)链接到应用程序代码。在主机模式中调试GWT有一个嵌入式的DHTML浏览器,你可以在转换成JAVASCRIPT应用之 前,在任何JAVA开发环境中运行和调试你的应用程序。你将会花费你的大部分的开发时间在主机模式上,这是说你和你的GWT应用程 序互动时,不需要先把它转换成JAVASCRIPT。任何时候你在JAVA集成开发 环境中编辑、运行和调试应用程序,你都是在主机模式下工作。当运行在主机模 式,JAVA虚拟机实际上是在执行编译后的JAVA字节码,使用GWT输出到一 个嵌入的浏览器窗口。在这种传统的“编码一测试一调试”的开发周期中,主机 模式是快速开发你的应用的最有效的方式。启动一个主机模式会话,你的启动类应该是com,googl,gwt.dv.GWTSh11,这个类可以在 gwt-dv-windows.j ar(或 gwt-dv-linux.j己工)中找至U。小提示:在主机模式下,GWT开发命令工具(development shell)会使用虚拟机的类路 径查找模块(和客户端原代码)。在运行GWT开发命令工具(development shell)时要确保把原代码路径加入到了你的类路径中。在WEB模式中部署为便于部署,首先把你的应用编译成JAVASCRIPT。当你从开发阶段转移到端到端测试和生产,你会开始更多地和你的应用程序在 WEB模式下交互。WEB模式是指从通常的浏览器来访问你的应用程序一在浏览 器中它作为纯净的JavaScript运行一正如它最终要被部署的样子。为你的模块创建一个WEB模式版本,你需要使用主机模式浏览器中的“Compile/Browse”按钮或命令行编译器com.googl,gwt.dv.GWTCompilr.WEB模式论证了是什么使GWT不同凡响:当你的应用在WEB模式中启动时,它完 全作为JAVASCRIPT运行,并且不需要任何浏览器插件或JVMoHTML主页一个HTML文档形式的主页,它包含GWT模块。任何符合适当规范的HTML页面可以包含GWT创建的代码,作为一个主页被引用。一个经典的HTML主页如下所示:ad!-The fully-qualified modul nam-mta 11&111巳=1 gwt:proprty1 contnt=11。己1巳=巳!1_1;1link rl=stylsht”hrf=Calndar,css”titlCalndar App/titl/hadfram id=_gwt_historyFramstyM=width:0;knight:0;bo rd r:0 ram 这个结构是可以向现存的WEB应用程序添加功能而把改动最小化。客户端代码“客户端”意思是指将要被转换并在WEB浏览器中以JAVASCRIPT形式运行 的原代码。你的应用程序将要被通过网络送向客户,在那里它作为JAVASCRIPT运行在 WEB浏览器中。用户浏览器中所发生的一切,可以看作是客户端处理。当你写 在WEB浏览器中运行的客户端代码时,记住它们最终要变成JAVASCRIPTo 所以,要使用那些可以被转换的类库和JAVA语言结构是非常重要的。服务端代码“服务端”意思是指不会被转换,并且只作为字节码运行在服务器端的原代码。发生在服务器端的一切可以被看作是服务器端处理。当你的应用程序需要与服务 器互动(例如,上载或下载数据),这会产生一个穿过网络的客户端请求(从浏 览器)使用remote procedure call(RPC)O在进行处理时RPC,服务器要执行服 务端代码。小提示:GWT不会去管你的服务器运行JAVA字节码的能力。服务端代码不需要被转换,所以你可以使用你认为有用的任何JAVA类库。项目结构GWT项目由一个推荐包布局构建而成。GWT项目以JAVA包的方式进行布局,这样,大多数的配置可以从类路径(classpath)和你的模块定义(moduldefinitions)中推导出。如果你要从代码片断开始一个GWT项目,你应该使用标准GWT包结构,这种 结构可以很容易地区分客户端代码和服务端代码。例如:假定你的新项目叫“Calendar。则标准包结构会如下所示:包com/example/cal/com/xampl/cal/clint/com/xampl/cal/srv工/com/example/cal/public/目的项目根包,包含模块XML文件客户端代码文件和子包服务端代码和子包静态资源例子文件组织如下:文件com/xampl/cal/Calndar.gwt.xmlcom/xampl/cal/CalendarApp.gwt.xml目的一个通用基本模块,用于你的项目,它继承了com.google.gwt.userUsr模块继 承 了com.xampl,cal Cal endar模块(见上)并且加入 一个入口类com/xampl/cal/CalndarTst.gwt.xml com/xampl/cal/clint/CalndarApp.j ava一个你的项目定义的模块客户端JAVA原代码,用于入口 类。com/xampl/c己l/clint/splling/Spl lingSrvic,j ava com/xampl/cal/srvr/splling/Sp1 lingSrvic工mpl.j avacom/xampl/cal/public/Calndar.htmlcom/xampl/cal/public/Calndar.csscom/exampl/cal/public/imags/logo.g if一个定义在子包中的RPC服务 接口服务端JAVA原代码,它实现了 后台服务业务逻辑。一个HTML页面,用于装载应 用程序。一个样式表,用于风格化应用 程序。一个题头标志模块模块是一个XML文件,它包含与应用程序或类库相关的设置。一个GWT配置的单独单元,是XML格式的文件。包括所有的你的GWT项目需要的配置 信息,即下列信息:继承模块 一个入口点应用类名;这些是可选的,虽然任何关系到HTML的模块都必须至少 有一个指定的入口类。原代码路径 公共路径 延期绑定规则,包括属性提供者和类生成器。模块(Modules)可以出现在你的类路径的任何包里,但是强力推荐它应该出现在标准项目 布局的根包里。入口类一个模块入口是任何实现EntryPoint接口的类,并且可以被无参数构造实例。当装载 一个模块时,每个入口类被实例化,并且它们的EntryPoint.onModulLoad()方 法被调用。原代码路径模块能够指定哪个子包包含可转换原代码,方法是把命名包和它的子包被加入原代码路径。只有在建立在原代码路径上的文件才可能被转换成JAVASCRIPT,客户端代码和服务端代 码也可以无冲突地混合在同一个类路径中。当模块继承其他模块,它们的原代码路径被绑定,这样每个模块将会能够访问到它需要的可 转换原代码。公共路径模块能够指定哪个子包是公共的,方法是命名包和它的子包被加入到公共路径。当你把你的 应用程序编译成JAVASCRIPT时,在公共路径中能找到的所有的文件都被复制到模块的输 出目录。净效果是用户可见的URLs不需要包含一个完整的包名。当模块继承其他模块时,它们的公共路径被绑定,这样每个模块都可以访问它所需要的静态 资源。特殊规范 模块XML格式在XML文件中定义模块,并且置入你的项目包层级。模块定义在XML文件中,它的文件名扩展是.gwt.xml。模块XML文件应当位于你的项目的根包如果你正在使用标准项目结构,你的模块XML可以像以下这样简单:modul 装载模块在JAVA类路径中发现的模块XML文件,被它们的逻辑模块引用,从主页用名字引入,也 被其他模块引入。模块总是关联到它们的逻辑名。模块的逻辑名遵守这种形式pkgl.pkg2,ModuleName 且不包括实际文件系统路径和文件扩展名。例如:模块XML文件的逻辑名位于:/src/com/exampl/cal/Calnd己r.gwt.xml是com.exampl,cal.Calendar可用元素从指定的模块继承所有的设置,就像被继承的模块的XML被逐字复制。一些模块可被用这 种方式继承。指定的入口点类。一些入口类能够被从被继承模块加入、包含。通过绑定包向原代码路径加入包,在包中,模块XML可以在特定的子包路径中找到。任何出现在这个子包下的JAVA原代码文件,或任何下层子包内,假定都是需要被转换的。如果在模块XML文件中没有定义sourc这个元素,客户(client)子包会被隐含地原代码路径,就像模块XML文件中有定义sourcpath=clint”一样。这个默认设置帮助保持模块XML使用标准项目 结构。public path=npa/通过绑定包向公共路径中加入包,在绑定包中,模块XML将会在指定路径中被发现来指定为了 RPC测试的方便性,这个元素装载一个SERVLET类,它应用到指定的URL路径。这 个URL路径应该是绝对路径,并且符合目录形式(例如:/spllchCk)。你的客户端 代 码 指 定 这 个 URL 映 射 到一个 调 用 SrvicDfTargt.stSrvicEntryPoint(String)。一些 SERVLET 可 以用这种方式装载,包括那些从继承模块里来的。script js-url”script ready-function body自动注入夕卜部的javascr工pt文件,这个文件位于src指定的位置。script ready-function body是一个JAVASCRIPT函数体,当这个脚本已知被初始化时,它返回tru自动注入外部的CSS文件,这个文件位于S4指定的位置。为一个已存在的客户属性值集合进行扩展。一些值可以用这种方式添加,并且客户属性值通 过继承模块进行累积。你可能只是发现它对于“在国际化中指定本地”(spcifying locals in internationalization)有用 自动资源注入模块组(Modules)能够包含到外部JAVASCRIPT和CSS的引用,方法是当模块自身装载 时,它们也被自动装载。模块可以包含到外部JAVASCRIPT和CSS文件的引用,方法是当模块自我加载时自动加载。注入夕卜音B JAVASCRIPT对于在你的模块自动地关联外部JAVASCRIPT文件,脚本注入是一个方便的方法。脚本注 入使用下面的语法:(ready-function body”部分是JAVASCRIPT函数主体部分,当脚本被装载并可用后,它返(Utru。脚本被装载进主页(host page)的名字空间(namespace),其作川与你显式地使川HTML 元素进行引入是相同的。例如:假定你的模块需要的脚本名为:InjectedScript.jso那么示例代码如下:function foo()/do somthing nat doSomthingTimConsuming();)function bar()/do somthing else nat你的模块应该如下所示:modulinherits name=ncom.googl gwt us工,Usr”/可用一函数(ready-function)的目的就是明确地指出脚本已被完全装载,这样,你的GWT 代码就能够使用JSNI,并且可以确定被引用的标识符是可用的。在上面的例子中,函数bar 的存在就说明了脚本已经就绪了。注入外部的样式表样式表注入是把外部的CSS文件自动关联到你的模块的一个便捷方式。使用如下语法可以 把CSS文件自动附加到你的主页(host page)上。你能够用这种方式加入一些样式表,包含入页面时的顺序就是元素在你的模块XML文件中 出现的顺序。注入和模块继承模块继承使资源注入更加方便。如果你想要创建一个可重用类库,这个库依赖特定的样式表 的JAVASCRIPT文件,你可以确定你的类库的客户可以用从模块继承的方式自动得到所需 之物。过滤公共包在你的公共路径中滤进或滤出文件,以避免无意地发布文件。public元素不支持完全的Fileset语义。当前只有下列属性和嵌套元素被 支持:includes 属性 xcludes属性 defaultexcludes 属性 casesensitive 属性 嵌套标志includ 嵌套标志xclud其他属性和嵌套元素不被支持工重要注意事项Dfaultxcluds 的默认值是 tru。命令行工具开始开发时需要的一些有用的命令行工具。GWT只有很少的几个命令行工具。它们也可以用于向现存项目加入新的东西。例如,pro j ectCreator可以用于使个Eclipse项目符合GWT的规范。projectCreator生成基本的项目骨架。一个可选的Ant build文件,和/或Eclipse项目。projctCrator-ant projctNam 一clips projctNam-out dir-ovrwrit 一ignore-ant生成一个Ant build文件,用于编译源代码(将会加 入,ant.xml)一clips生成一个eclipse项目。-out输出文件写入到这个目录(默认是当前目录)一ovrwrit覆盖任何已经存在的文件。一ignore忽略任何已经存在的文件;不覆盖 示例/Foo projctCrator-ant Foo-clips FooCratd directory srcCratd directory tstCratd fil Foo.ant.xmlCreatd file.project Cratd fil.classpath运行ant-f Foo.ant.xml将会把src编译至(J bin。这个build文件也包含 一个目的包,这个包用于把项目打包成一个jar文件。.project能够被引入到Eclipse工作区 applicationCreator生成一个初始的应用程序,这个应用程序可以从主机模式启动,并且可以编译成 JAVASCRIPTapplicationcreator 一clips projctNam 一out dir 一ovrwrit 一ignore classNam-clips 为命名的eclipse项目生成一个调试启动配置项。-out 这个目录用于写入输入文件(默认为当前目录)一ovrwrit覆盖任何已经存在的文件一ignoreclassNam忽略任何已经存在的文件;不覆盖 创建一个合乎规格应用程序类名字 示例/Foo applicationCrator-clips Foocom.xampl,foo clint.Foodi工ctory src/coIn/x己mpl/foo/clintCr己td di工ctory src/com/xampl;/foo/publicCr己td f il src/coIn/xampl/foo/Foo.gwt.xmlCratd fil5工。/。0111/巳又&111巳/00及110110/500.htmlCratd filsrc/com/ex己mpl/foc/clint/Foo.j avaCratd fil Foo.launchC工atd fil Foo-sh11Cratd fil Foo-compil运行Foo-shell命令行在主机模式中生成新的应用。Foo-compile把JAVA应用转换成JAVASCRIPT,在目录www.Foo.launch下创建一个WEB文件夹,这是一个用于Eclipse的启动配置。junitCreator生成JUnit测试程序 生成一个JUnit tst测试程序和脚本,可用于主机模式和WEB模式。junitCreator-junit pathToJUnitJar-eclipse projctNam-out dir-overwrite-ignore className-junit指定到你的junit.jar的路径(必须)一moduli指定要使用的应用模块名(必须)。一clips为命名的eclipse项目创建一个调试启动选项-out用于写入输出文件的目录(默认是当前目录)一ovrwrit覆盖任何已经存在的文件。ignore忽略任何已经存在的文件;不覆盖classNam要创建的合乎规格的测试类名字。示例/Foo junitCrator-junit/opt/eelipse/plugins/org.j unit_3.8.1/junit.j ar 一modul com.xampl,foo Foo一clips Foocom.xampl,foo,clint.FooTstCratd directory tst/com/xample/foo/tstCratd filtst/com/x己mpl/fc)o/clint/FooTst.j avaCratd filCratd filCratd filCratd filFooTst-hostd,launchFooTstwb.launchFooT st-hostedFooTst-wb运行FooTst-hostd在JVM中以字节码方式测试。FooTst-wb测试是以JAVASCR工PT方式。Eclipse中的启动配置(launch configurations)有同样的效果。il8nCreator 生成一个il8n属性文件和同步脚本。为静态国际化(static int61Tlationalizatioe)生成国际化(internationalization)脚本,它遵 循样本属性文件(properties files)。il8nCrator clips projctNam 一out dir 一ovrwrit 一ignor 一cratMssags intrfacNam一clips为命名的Eclipse项目生成一个调试启动配置。-out这个目录用于写入输入文件(默认为当前目录)一ovrwrit覆盖任何已经存在的文件。一ignore忽略任何已经存在的文件;不覆盖一cratMssags为消息(Messages)接口生成脚本,而不是一 个常量。intrfacNam要创建的完全符合规范的接口名字。示例/Foo il8nCreator-eclipse Foo一cratMssagscom.xampl,foo clint.FooMssagsCratd fil5/00111/巳数111巳/00/01正11t/500$&9巳$,prclprtisCratd fil FooMssags-il8n.launchCratd fil FooMssags-il8n/Foo il8nCrator-clips Foocom.xampl,foo,clint.FooConstantsCratd filsre/com/xampl/foo/client/FooConstants.proprtisCratd fil FooConstants-il8n.launchCratd file FooConstants-il8n运行 FooMssags-il8n 将会从 FooMssags,proprtis产生i个接口,这个接口扩展了 Mssags(消息会需要参数,用第N个参数,替换n)运行FooConstants-il8n 将会从 FooConstants.proprtis 生成i个接口(常量不会使用参数)在Eclipse项目中,这个启动配置和脚本有同样的效果。二、构建用户界面正如在画廊(thgallery)中展示的,GWT包含了各种预先构建的JAVA界面元素(widgets)和面板(panels),它们可以为你的应用程序提供跨浏览器的构建块。GWT用户界面类是类似于已有的用户界面框架的,例如Swing和SWTO除了界面元素(widgets)是用动态创建HTML的方式进行显示而不是直接面向像素的图形。当需要操作浏览器的DOM可以直接使用DOM接口,更方便的方式是使用界面元素的类层 级结构。你应该很少需要直接访问DOM。使用界面元素会是更方便快捷构建界面,而且在 所有的浏览器中都能正确工作。特别规范 界面元素和面板界面元素和面板是客户端JAVA类,用于构建用户界面。GWT应用程序使用界面元素(widgts)构建用户界面,界面元素包含在面板(pan1s)内。界面元素的例子有:Button,TextBox,和Tr等。界面元素和面板在所有的浏览器中都有同样的表现。使用它们,你可以避免对每 种浏览器写特定的代码。但是你会受到工具箱所提供的界面元素集合的限制。有 若干种方式使你可以创建自定义的界面元素。面板面板,诸如 DockPan1,HorizontalPari1,和 RootPan1,包含界面元素,并且用于定义如何在浏览器中对界面元素进行布局。样式 视觉风格通过级联样式表(CSS)应用到界面元素上。具体做法如下:每个界面元素都有一个关联的样式名,它绑定到对应的css规则。一个界面元素的样式名 使用stStylNam()来设置。例如:Button元素的默认样式名是gwt-Button。为了给所有的按钮一个更大的字体,你可以把下列规则加入到你的应用程序css 文件中。.gwt-Button font-size:150%;4复杂样式一些界面元素有稍微复杂的样式。例如:MenuBar,有下列样式:gwt-MnuBar th mnu bar itsIf.gwt-MnuBar.gwt-Mnu工tm mnu itms gwt-MnuBar.gwt-Mnu工七巳111-319。七巳4 slectd mnu itms 在这个例子中,有两个样式规则应用到菜单项目。第一个应用到所有的菜单项(已 选中和未选中的),同时,第二个(有-selected后缀)应用到已经选中的菜单 项。一个选中的菜单项的样式名字会设置成gwt-Mnu工tmgwt-MenuItem-selectedH,指定这两种被应用的样式规则。最通常的方式 是使用setStyleName来设置基本样式名,然后用addStyleName()和 remove St yleName()来添加和去除第二个样式名。4 CSS文件通常,样式表被置于你的模块的公共路径下的包里。然后简单地在你的主页中包 含它,如下:界面元素画廊一个界面元素和面板的展示区下列界面元素和面板都可以GWT用户界面库中找到。,按钮(Button)Normal Button示例代码:public class ButtonExampl implmnts EntryPoint public void onModulLoad()/Mak a nw button that does somthing when you click it.Button b=new Button(H Jump!n r new ClickListener()public void onClick(Widget sender)Window,alrt(How high?););/Add it to th root pan1.RootPan1.get().add(b);,单选按钮(RadioButton)Choice 1 1 Choice 2(Disabled)示例代码:public class RadioButtonExampl implmnts EntryPoint public void onModulLoad()/Mak som radio buttonsA all in on group.RadioButton rbO=nw RadioButton(HmyRadioGroupH r H foon);RadioButton rbl=nw RadioButton(myRadioGroupr bar);RadioButton rb2=new RadioButton(myRadioGroupr baz);/Check 1baz1 by dfault.rb2,stChckd(true);/Add them to the root pan1.FlowPan1 pan1=new FlowPan1();pan1,add(rbO);pan1,add(rbl);pan1,add(rb2);RootPan1.gat().add(pan1);,复选框(CheckBox)r Normal Check Disabled Check示例代码:public class ChckBoxExampl implmnts EntryPoint public void onModulLoad()/Mak a nw check box,and select it by dfault.CheckBox cb=new CheckBox(HFoon);cbstChckd(tru);/Hook up a listnr to find out whn it1s clickd.cb.addClickListnr(nw ClickListnr()public void onClick(Widgt sender)boolan checked=(CheckBox)sndr),isCheckd();Window,alrt(工t is”+(chckd?:not)+“checked”););/Add it to th root pan1.RootPan1,gt().add(cb);,文本框(TxtBox)|textbox.|代码示例:public class TxtBoxExampl implmnts EntryPoint public void onModulLoad()/Mak som txt boxs.Th password txt box is idntical to th txt/box,except that the input is visually masked by the brows工.Passwo工dTxtBox ptb=nw Passwo工dTxtBox();TxtBox tb=nw TxtBox();/Lt s disallow non-numric ntry in th normal txt box.tb,addKeyboardListnr(nw KeyboardListenerAdaptr()public void onKeyPress(Widgt sndr,char kyCod,int modifirs)if(!Charactr,isDigit(kyCod)/TxtBox.cancIKy()supprsss th currntkeyboard vnt.(TxtBox)sndr).cancIKy(););/Lts mak an 80 x50 txt ara to go along with th othr two.TxtA工a ta=new TxtAra();ta,stCharactrWidth(80);ta,stVisiblLins(50);/Add them to th root pan1V工ticalPan1 panel=nw VrticalPan1();panel.add(tb);pan1,add(ptb);pan1,add(ta);RootPan1,gt().add(panel);4 密码框(PasswordTxtBox)!示例代码:public class TxtBoxExampl implmnts EntryPoint public void onModulLoad()/Mak som txt boxs.Th password txt box is idntical to th txt/box,xcpt that th input is visually maskd by th brows工.PasswordTxtBox ptb=nw PasswordTxtBox();TxtBox tb=nw TxtBox();/Lt s disallow non-num工ic ntry in th normal txt box.tb.addKyboardListnr(naw KyboardListnrAdaptr()public void onKeyPress(Widgt sndr,char kyCod,int modifirs)if(!CharactrisDigit(kyCod)/TxtBox.cancIKy()supprsss th currentkeyboard vnt.(TxtBox)sndr).cancIKy(););/Lts mak an 80 x50 txt ara to go along with th othr two.TxtAr己 ta=nw TxtAra();ta,stCharactrWidth(80);ta,stVisiblLins(50);/Add thm to th root pan1.VrticalPari 1 pan 1=nw VrticalPari1();pan1.add(tb);pan1,add(ptb);pan1,add(ta);RootPan1.gt().add(pan1);,文本区(TxtAra)ITixs xs a bxg text area.示例代码:public class TextBoxExample implements EntryPoint public void onModuleLoad()/Make some text boxes.The password text box is identical to the text/box,except that the input is visually masked by the browser.PasswordTextBox ptb=new PasswordTextBox();TextBox tb=new TextBox();/Let*s disallow non-numeric entry in the normal text box.tb.addKeyboardListener(new KeyboardListenerAdapter()public void onKeyPress(Widget senderf char keyCode r int modifiers)if(!Character.isDigit(keyCode)/TextBox.cancelKey()suppresses the
展开阅读全文