adf435编程

我将展示如何以编程方式“即时”将火车停靠站添加到ADF火车中。 在我的用例中,我有一些票务预订应用程序。 它具有训练模型的有限任务流。 在火车的第一站,用户输入乘客数量,在随后的站点,他们输入一些乘客信息。 必须根据在第一个火车停靠站提交的值来动态更改带有乘客信息的停靠站数量。 因此,描述的行为的结果应如下所示:

有界任务流具有以下结构:

StartView活动是一个页面片段,我们在其中输入乘客人数,而DynamicView活动提供了一个页面片段来输入乘客的信息。 目前,我们只有一个活动来提供乘客的信息,如果乘客人数大于一个,我将添加其他活动。
StartView页面片段的inputNumberSpinbox提交其值设置为某些PageFlowScope支持bean的passengersNumber财产和行动的提交按钮是同一个bean的方法:

public class MainTrain {//Extra added train stopsprivate List<ActivityId> dynamicStops = new ArrayList<ActivityId>();//Value of inputNumberSpinboxprivate int passengersNumber = 1;public String buttonPress(){//The number of extra added train stops is greater than neededif (passengersNumber <= dynamicStops.size())clearExtraStops();else //The number of extra added train stops is less than needed if (passengersNumber-1 > dynamicStops.size()) addDynamicStops(); return null;}

因此,通过按Submit按钮,我们可以根据inputNumberSpinbox的值添加一些火车停靠点或清除额外的停靠 。 我们将所有添加的动态停靠点保存在dynamicStops列表中。 让我们看一下clearExtraStops()方法:

private void clearExtraStops() {for (int i = dynamicStops.size(); i >= passengersNumber; i--) {//Get ActivityId to be removedActivityId removeActivityId = dynamicStops.get(i-1);//Get current train model and remove train stopTrainModel trainModel = TrainUtils.findCurrentTrainModel();trainModel.getTrainStops().remove(removeActivityId);//Remove activity from task flow definitiongetTaskFlowDefinition().getActivities().remove(removeActivityId);dynamicStops.remove(i-1);} }

该方法删除了两件事:火车模型中的火车停靠点和任务流定义中的活动。 addDynamicStops()方法将变得更加有趣:

private void addDynamicStops() { for (int i = dynamicStops.size(); i < passengersNumber - 1; i++) {//Creating new ActivityIdActivityId activityId = new ActivityId(getTaskFlowId(), new StringBuilder("DynamicView").append(i).toString()); //The main trick of the post.//We consider DynamicView activity as a base for new train stop and new activity//Get base activity (DynamicView) and its train stopActivity baseActivity = getBaseDynamicActivity();TrainStopContainer stopContainer = (TrainStopContainer)baseActivity.getMetadataObject();TrainStop baseTrainStop = stopContainer.getTrainStop();//Create new Activity based on DynamicView but with new ActivityId ActivityImpl activityImpl = new ActivityImpl(baseActivity, activityId); //Add created activity to the task flow definitiongetTaskFlowDefinition().getActivities().put(activityId, activityImpl);//Create new train stop based on the DynamicView's train stopTrainStopModel trainStopModel = new TrainStopModel(new TrainStopImpl(baseTrainStop, i+2), activityId);//Add created train stop to the train stop modelTrainModel trainModel = TrainUtils.findCurrentTrainModel();trainModel.getTrainStops().put(activityId, trainStopModel); //Add created activity to our listdynamicStops.add(activityId); }
}private Activity getBaseDynamicActivity() {ActivityId baseActivityId = new ActivityId(getTaskFlowId(), "DynamicView"); MetadataService metadataService = MetadataService.getInstance();return metadataService.getActivity(baseActivityId);
}private TaskFlowDefinition getTaskFlowDefinition() {MetadataService metadataService = MetadataService.getInstance();return metadataService.getTaskFlowDefinition(getTaskFlowId());
}private TaskFlowId getTaskFlowId() {ControllerContext controllerContext = ControllerContext.getInstance(); ViewPortContext currentViewPortCtx = controllerContext.getCurrentViewPort(); TaskFlowContext taskFlowCtx = currentViewPortCtx.getTaskFlowContext(); return taskFlowCtx.getTaskFlowId();
}

因此,本文的主要技巧是创建新活动,并基于DynamicView的现有活动停止站点。 为了实现这个想法,我创建了两个类: ActivityImplTrainStopImpl 。 这些类只不过是相应地实现Activity和TrainStop接口的代理类。 它们将接口实现委派给基本实例,除了某些特定的方法(例如,用于ID和DisplayName的getter)之外:

public class TrainStopImpl implements TrainStop { //Base instance private TrainStop baseTrainStop;private int mpassNo;private static final String PASSANGER_FORM = "Passenger's data: ";public TrainStopImpl(TrainStop trainStop, int passNo) {baseTrainStop = trainStop; mpassNo = passNo;}//Specific implementationpublic String getDisplayName() {return new StringBuilder(PASSANGER_FORM).append(mpassNo).toString();}public String getOutcome() {return baseTrainStop.getOutcome();}public String getSequential() {return baseTrainStop.getSequential();}...
public class ActivityImpl implements Activity {private Activity baseActivity;private ActivityId mid;public ActivityImpl(Activity activity, ActivityId id) {baseActivity = activity;mid = id;}//Specific implementationpublic ActivityId getId() {return mid;}public String getType() {return baseActivity.getType();}public Object getMetadataObject() {return baseActivity.getMetadataObject();}
...

并为该帖子添加了另一张图片,以表明其正常工作:

就这样! 您可以下载JDeveloper 11.1.1.2.0的示例应用程序 。

参考: 动态ADF列车。 通过ADF实践博客中的JCG合作伙伴 Eugene Fedorenko以编程方式添加火车停靠站 。

翻译自: https://www.javacodegeeks.com/2012/05/dynamic-adf-train-adding-train-stops.html

adf435编程

adf435编程_动态ADF列车:以编程方式添加列车停靠点相关推荐

  1. 深入理解python异步编程_深入理解Python异步编程

    1 什么是异步编程 1.1 阻塞程序未得到所需计算资源时被挂起的状态. 程序在等待某个操作完成期间,自身无法继续干别的事情,则称该程序在该操作上是阻塞的. 常见的阻塞形式有:网络I/O阻塞.磁盘I/O ...

  2. 高中生编程_高中生是否必须参加编程课程?

    高中生编程 孩子应该具备技术素养吗? 当然! 通过使他们成为程序员来教会他们这种技能的最好方法是吗? 好吧,这是一个更棘手的问题. 首先,直言不讳,在世界许多地方,即使在富裕地区,学校也没有能力处理这 ...

  3. python小海龟画房子编程_教孩子学Python编程之海龟画图(一)

    大家好,我是践行计算机教育刘老师,很高兴跟大家分享Python编程,建议5年级以上的学生学习.父母也可以陪着孩子一起学习Python编程,对于孩子学编程起到监督和辅助学习.下载我们Python编程工具 ...

  4. python积木式编程_实例讲解python函数式编程

    函数式编程是使用一系列函数去解决问题,按照一般编程思维,面对问题时我们的思考方式是"怎么干",而函数函数式编程的思考方式是我要"干什么". 至于函数式编程的特点 ...

  5. Python代码列主元消去法matlab编程_工业机器人用什么语言编程的?

    曾经有很多小伙伴一直问,工业机器人编程用的是什么语言啊?这次给大家总结一下机器人编程中常用的语言. 1.硬件描述语言(HDLs) 硬件描述语言一般是用来描述电气的编程方式.这些语言对于一些机器人专家来 ...

  6. 声明式编程与函数式编程_实用程序类与函数式编程无关

    声明式编程与函数式编程 最近,我被指控反对函数式编程,因为我将实用程序类称为反模式 . 绝对是错的! 好吧,我确实认为它们是一个糟糕的反模式,但是它们与函数式编程无关. 我相信有两个基本原因. 首先, ...

  7. python如何在exel中编程_如何使用Python以编程方式将行添加到现有Excel表中

    尽管有各种各样的pythonexcel操作库和资源,但我无法找到具体的解决方案.在 现在,我有一个表格存在的Excel模板文件.我想编写一个Python程序来填充这个表.对于任何现有的Excel库都可 ...

  8. 在线五子棋JAVA网络编程_实验五 Java网络编程及安全

    一.实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 二.实验步骤 1. 基于Java Socket实现安全传输 2. 基于TCP实现客户端和服务器,结对编 ...

  9. linux java socket编程_深入学习socket网络编程,以java语言为例

    了解java的socket编程与Linux Socket API之间的关系 一.java的网络编程 1.socket原理 socket通信就是通过IP和端口号将两台主机建立连接,提供通信.主机A的应用 ...

最新文章

  1. js 异步for each
  2. 排序算法java 简书_史上最全经典排序算法总结(Java实现)
  3. 用装饰器设计模式装饰
  4. pyqt5设置按钮,移上去变为手型
  5. opencv 绘制图像轮廓
  6. 使用插件扩展Docker
  7. 用automake建立共享库(动态链接库)Makefile
  8. MathType安装教程,以及部分功能变灰,重新点亮
  9. PDF文件切成图片然后拼接成长图
  10. JavaScript参考手册
  11. HR必看的86本书籍
  12. 内地见证可以办理哪些香港银行卡?哪家更方便门槛要求更低?
  13. Git submodule使用指南(二)
  14. MPI聚合通信之MPI_Bcast函数
  15. 因一个 Bug,谷歌、GitHub、亚马逊等网站全球大范围宕机!
  16. 嵌入式开发-浅谈嵌入式MCU开发中的三个常见误区
  17. 本地计算机 feifei pc,局域网中其它计算机对共享打印机的访问方法
  18. 《风雨张居正》 郦波
  19. 高频拨号、一键拨号,外呼系统功能多到你难以想象
  20. VMware虚拟机安装macos Big Sur 11.2.0 (20D64)镜像CDR/ISO下载

热门文章

  1. maven安装遇到的坑
  2. C++描述杭电OJ 2020.绝对值排序 ||
  3. 20级四班班级管理规章制度
  4. 《此生未完成》痛句摘抄(4)
  5. 每日top3热点搜索词统计案例
  6. JavaWeb前端之AJAX的初步学习
  7. 鸿蒙 电视 安卓,华为鸿蒙2.0来了!打通手机、电视、PC全平台,Mate 40 整装齐发...
  8. ffmpeg中文开发手册_快速调用复杂命令,支持中文注释,命令行备忘工具navi两天就火了...
  9. import openfire4.0.2 source code in eclipse
  10. AOP切点表达式及通知类参数传递方式