2009年4月30日星期四

ArcGIS Server Java ADF 案例教程 23

三 Task的渲染

Task的功能类中还有一个属性,IDE默认生成的名字是taskInfo,它对应这个另外一个Java类(如上面QueryTaskTaskInfo类)的对象。这个类主要控制Task的渲染,我们可以回想一下,如果光在Task的功能类中定义了Command是一个void类型的query方法,Task面板怎么会生成一个标签为“查询”的按钮出来的呢?答案就在taskInfo中。

打开上面生成的“QueryTaskTaskInfo.java”文件,我们可以看到以下的内容:
public class QueryTaskTaskInfo extends SimpleTaskInfo
{
public TaskDescriptor getTaskDescriptor()
{
TaskDescriptor descriptor = new TaskDescriptor(QueryTask.class, "queryTask", "查询任务");
return descriptor;
}

public TaskParamDescriptorModel[] getParamDescriptors()
{
TaskParamDescriptor[] descriptors = new TaskParamDescriptor[1];
descriptors[0] = new TaskParamDescriptor(QueryTask.class, "keyWord", "关键词", "getKeyWord", "setKeyWord");
return descriptors;
}

public TaskActionDescriptorModel[] getActionDescriptors()
{
TaskActionDescriptor[] descriptors = new TaskActionDescriptor[1];
descriptors[0] = new TaskActionDescriptor(QueryTask.class, "query", "查询");
return descriptors;
}

public TaskToolDescriptorModel[] getToolDescriptors()
{
TaskToolDescriptor[] descriptors = new TaskToolDescriptor[1];
descriptors[0] = new TaskToolDescriptor(QueryTask.class, "select", "选择", "EsriMapPolygon");
return descriptors;
}
}


简单的说,TaskInfo类中包含4个主要的属性:TaskDescriptor对象、TaskParamDescriptor[]数组、TaskActionDescriptor[]数组、TaskToolDescriptor[]数组。很好理解,TaskDescriptor对应整个Task的外观,比如Task的标题等;TaskParamDescriptor[]描述所有Parameter的外观;TaskActionDescriptor[]描述所有Command的外观;TaskToolDescriptor[]描述所有Tool的外观。一个Task中肯定包含不定数目的Parameter、Command或Tool,因此他们的描述需要数组来存放。

让我们通过TaskToolDescriptor来更详细地看一下,上面的代码设置“select”这个TaskTool表现为一个“选择”按钮,并在点击时通知Map执行“EsriMapPolygon”操作。现在我想让它渲染成一个自定义的图片按钮,并随鼠标移上或点击切换不同的图片,用下面的代码可以实现这样的功能:
descriptors[0].setRendererType(TaskToolDescriptor.IMAGE_RENDERER_TYPE);
descriptors[0].setDefaultImage("images/tasks/maptools/polygon.gif");
descriptors[0].setHoverImage("images/tasks/maptools/polygonU.gif");
descriptors[0].setSelectedImage("images/tasks/maptools/polygonD.gif");
descriptors[0].setDisabledImage("images/tasks/maptools/polygonX.gif");


现在我还想调整一下这些按钮、文本框的布局,怎么办?TaskInfo还可以指定Task各个子元素的布局,让我们在刚刚的QueryTaskTaskInfo类中再添加以下的代码:
public TaskLayout[] getTaskLayout()
{
TabularLayout[] descriptors = new TabularLayout[1];
descriptors[0] = new TabularLayout();
descriptors[0].addComponent(getParamDescriptors()[0], new TabularPosition(0, 0, 0, 0));
descriptors[0].addComponent(getActionDescriptors()[0], new TabularPosition(1, 0, 0, 0));
descriptors[0].addComponent(getToolDescriptors()[0], new TabularPosition(2, 0, 0, 0));
return descriptors;
}


经过上面的两次修改,我们会发现Task面板的Tool变成了使用图片渲染,并且布局方式更加我们的定义进行了变化,效果如图 17所示。
图 17 更改Tool渲染方式和布局后的Task面板

顺便回头再看看页面中Task的定义,其中有taskInfo属性,它对应的就是这个Task的TaskInfo对象:
taskInfo="#{queryTask.taskInfo}"

最后稍微总结一下吧,Task的外观主要通过TaskInfo来定义,ADF会根据Task所对应的TaskInfo,通过XSL样式文件渲染成DHTML代码,并输出到浏览器。到现在为止,一个Task面板包含什么内容、对应后台什么对象、怎么控制它们的表现,你应该都清楚了吧?

3 条评论:

匿名 说...

魔王大哥:
能否讲一下分页查询相关的内容,我在论坛上找了好久,好像到目前为止还没有比较成熟的解决办法,能否针对这一话题开堂课啊,先谢谢了!

匿名 说...

感谢魔王大哥,希望您继续坚持下去啊

匿名 说...

你好,现在我想实现类似meature工具条的功能就是根据一些操作动态设置task中的内容,如:我task中有输入框A和B,一个按钮C,开始只显示A,按下C显示B,隐藏A再按一下 A,B显示切换。这样做设置?