- 1、本文档共16页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
7.5 使用与自定义GWT控件
通过自定义控件,可以极大地扩展GWT程序界面,还能封装常用的界面功能,以便在其他项目中重用。GWT开发自定义控件并不复杂,本节将带领大家一同开发一个可以编辑的下拉框。
有时候我们希望下拉框既能通过下拉框选择预定值,又能让用户输入值。但是在HTML中并不提供这样的元素,GWT也没有提供这样的控件。在这种情况下,我们就可以通过自定义控件进行扩展。本节的这个自定义控件取名为ComboInput,支持通过AddItem()添加可选项,当用户选择一个项目时,会触发SelectedEvent事件。
我们先来了解一下ComboInput的静态类结构,如图7-21所示。
图 7-21 ComboInput类图
从通用性考虑,我们首先实现一个TriggerInput抽象类,它实现了通用的带下拉选项的输入框控件。我们将ComboInput派生于TriggerInput控件。如果将来我们被要求开发一个既可以让用户选择,又可以输入的日期控件,那么我们就可以直接从TriggerInput类派生。
TriggerInput派生于GWT的Composite控件,Composite控件的作用是包装另一个控件,它隐藏被包装控件的成员函数及其行为。我们的TriggerInput是由输入框和下拉按钮这两个控件组成的,所以我们需要用Composite类隐藏输入框和按钮的行为。
当用户选择了控件中的某一项时,我们需要触发一个自定义事件——Selected。按照GWT的事件模型,我们添加一个HasSelectedHandler接口类。HasSelectedHandler接口类有一个成员函数addSelectedHandler(),通过这个函数我们可以注册Selected事件句柄。
当用户单击ComboInput的下拉按钮时,会弹出一个待选列表。我们用另一个自定义控件ListBox作为弹出列表。同样,ListBox也实现了HasSelectedHandler接口。
ListBox由一系列ListBoxItem组成。ListBoxItem是普通的HTML元素,我们可以在ListBoxItem中嵌入图片或文字,也可以是两者的组合。ListBoxItem的构造函数可以接受一个DataItem作为参数。DataItem在这里作为一个可扩充点,如果需要动态加载下拉选项时,以后从远程服务器获取DataItem列表,然后动态装载到ListBoxItem中。我们将ListBox类派生于ScrollPanel,因为当ListBox中有很多选项时,ListBox需要通过滚动条进行滚动。
考虑DataItem是一个多用途的数据容器。除了这里用到的ComboInput,如果以后还要扩展Grid这样的控件,我们都可以用DataItem承载数据。所以在DataItem内部用Map结构保存数据,Map的key是数据项的名称,类型为String;value是数据项的值,类型为Object,如代码清单7-23所示。
代码清单7-23 DataItem
1 package chapter8.widget.client;
2
3 import java.util.HashMap;
4 import java.util.Map;
5
6 public class DataItem{
7 private Map<String,Object>data;
8
9 public DataItem(){
10 data=new HashMap<String,Object>();
11 }
12
13 @SuppressWarnings(unchecked)
14 public<T>T get(String name){
15 return(T)data.get(name);
16 }
17
18 public void set(String name,Object value){
19 data.put(name,value);
20 }
21 }
在这里我们用了点小【技巧】,把get()函数的返回值做了泛型处理。避免了调用者将get()函数返回的Object转换成它所需要的数据类型。当然,对泛型Map进行强制类型转换会产生【警告】,所以这里要加上一个@SuppressWarnings(unchecked)以避免编译器的【警告】。
ListBoxItem是ListBox中的可选项。我们用GWT中的HTML类实现ListBoxItem,如代码清单7-24所示。
代码清单7-24 ListBoxItem
1 package chapter8.widget.client;
2
3 import com.google.gwt.user
文档评论(0)