来的多可选_您的框架有多可扩展性?

来的多可选

在参加会议时,我们总是会遇到高素质的决策者,他们经常问同样的问题:' 您的框架有多可扩展性?如果我需要的比您开箱即用的功能还多呢? '。 这个问题非常合理,因为他们只是不想被卡在开发曲线的中间,然后意识到框架只是不允许实现某些功能,或者,如果您使用开源产品,它可能需要花费很长的时间才能深入探究框架中记录较差的部分。

通常会特别注意用户界面部分:框架有多少个组件? 是否可以集成第三方小部件? 最后,将它们集成到您的应用程序中有多么容易。

即使框架为您提供了许多现成的组件,有时您可能仍需要具有非常特定的,通常不使用的内容,因此未在框架中实现。

在本文中,我将说明如何将第三方视觉组件集成到CUBA平台中 。

CUBA平台中的通用用户界面

为了让您简要了解CUBA平台中现成的视觉组件,请查看以下图片:

1个

2

如您所见,有大量可用的现成组件集,但是所有组件都是非常通用的,广泛用于企业应用程序。 现在假设我们需要集成更具体的内容。

从CUBA Studio的2.1版开始,此过程已针对Vaadin,JavaScript和GWT组件进行了大幅简化,因为Studio脚手架存根并添加了新组件的所有必需定义。 新组件到平台的集成分为三个级别:

  1. 由于该框架的通用UI是基于Vaadin构建的,因此新组件可以作为本机Vaadin组件使用。 开发人员已经可以在CUBA应用程序中使用此组件,并将其添加到未包装的CUBA容器中。
  2. 新组件已集成到CUBA通用UI中。 在这种情况下,从应用程序开发人员的角度来看,它看起来与可视组件库中的标准组件相同。 开发人员可以在屏幕XML描述符中定义组件,也可以通过控制器中的ComponentsFactory创建组件
  3. 新组件在Studio组件面板上可用,并且可以在所见即所得布局编辑器中使用,如下图所示。

3

在本文中,我们将研究Vaadin组件的第一级集成,并创建一个示例应用程序,以了解在此阶段如何在您的CUBA应用程序中使用它。

整合Vaadin组件

如前所述,CUBA平台中的通用UI基于Vaadin框架构建,将其组件集成到CUBA应用程序中非常容易:

  1. 向第三方Vaadin附加工件添加依赖项。
  2. 在您的项目中创建Web-toolkit模块。 此模块包含GWT小部件集文件,并允许您创建可视化组件的客户端部分。 只需将附加控件集添加到项目的控件集即可。
  3. 如果组件的外观不适合应用程序主题,请创建主题扩展并为新组件定义一些CSS。

让我们以Stepper组件为例,看看它在CUBA Studio中如何工作:

第一步,我们单击Create web toolkit module ,以集成Vaadin组件,然后单击Create new UI组件

4

现在,距CUBA中新的Vaadin组件大约10分钟的路程:

  1. 在“ 组件类型”组框中选择“ Vaadin附加 组件 ”。
  2. 要定义Add-on Maven依赖项值,请转到stepper插件页面 ,按Install绿色按钮,从出现的文本框中复制它,然后粘贴到CUBA Studio的Add-on Maven依赖项字段中。
    5
  3. 最棘手和最令人困惑的部分是Inherited Widgetset (对于那些初次使用Vaadin的用户而言) (您可以在此处了解有关Vaadin WidgetSets的更多信息,但您并不需要真正了解它就可以继续进行此操作文章)。 在stepper附加页面的Related links部分中有一个Source code链接,单击它。 该链接将带您到该组件的GitHub存储库 。 要定义Vaadin组件的小部件集,您需要在源代码中找到* .gwt.xml文件。 继续至addon / src / main / resources文件夹。 在这里,您将看到包含StepperWidgetset.gwt.xml文件的org / vaadin / risto / stepper /小 部件 集 。 这足以构造我们的Inherited widgetset值: org.vaadin.risto.stepper.widgetset.StepperWidgetset 。 简而言之,它是在Java中作为导入类编写的* .gwt.xml文件的路径。
    6
  4. 现在取消选中“ 集成到通用UI”框,然后说“ 确定”
  5. Studio将显示通知“ Component created ”并重建项目,因为它需要向gradle构建脚本中添加新的依赖项,下载所需的库并重新编译widgetset。 因此,我们只需要等待几分钟,直到该过程完成。
  6. 最后,我们调整组件以适合我们的应用主题。

如果看一下源代码 ,我们可以看到该组件是SCSS样式的,因此我们需要将其样式添加到项目依赖项中。 为此,请转到“ 项目属性”部分,单击“ IDE” 。 IDE将显示build.gradle ,在其中应将主题(“ org.vaadin.addons:stepper:2.3.0”)行添加到configure(webModule)任务的依赖项子句中,如下图所示。

7

现在我们可以应用所需的样式。 转到“ 项目属性”部分,然后单击“ 创建主题扩展” 。 选择halo作为默认值,然后单击Create 。 Studio会在应用程序的Web模块中添加themes / halo / halo-ext.scss文件,您可以在其中为新组件指定样式或修改现有组件的样式。 它还将在构建脚本中进行必要的更改,并为您的IDE重新创建项目文件。

8

在您的IDE中打开halo-ext.scss文件,并粘贴以下CSS,如下图所示:

…
@import "../VAADIN/addons/stepper/stepper";
…@include stepper;/* Basic styles for stepper inner textbox */.stepper input[type="text"] {@include box-defaults;@include valo-textfield-style;&:focus {@include valo-textfield-focus-style;}}
…

9

而已! 现在我们已经可以在CUBA应用程序中使用该组件了!

在CUBA应用程序中使用3rd Party Vaadin组件

最后,让我们用步进器创建一个屏幕。 由于我们仅完成了第一级集成,因此它仍然不是通用CUBA UI的一部分,因此不能直接在xml屏幕描述符中使用它,但是已经可以通过编程方式创建。

让我们开始吧:

  1. 从我们的网站下载 CUBA Studio,进行安装,启动CUBA Studio服务器,然后在浏览器中打开Studio。 如果您在此阶段遇到任何麻烦,请按照视频指南 (“快速入门”页面的第1部分)进行操作。
  2. 创建一个名为vaadin-component的项目。 Studio会自动命名项目名称空间和根包。
    10
  3. 请遵循整合Vaadin组件中的步骤
  4. 由于步骤3已完成,请转到Studio左侧面板中的屏幕部分,将重点放在Web模块项上,然后单击新建 。 Studio会提示您选择是要从头创建新屏幕还是扩展现有屏幕(例如,用户编辑器或“文件上传”对话框)。 我们将从头开始尝试新的屏幕。
  5. 现在,我们直接进入“ 布局”选项卡,在此处可以直观地设计屏幕。 我们需要使用一些容器,该容器将用作步进器的占位符。 在组件搜索字段中输入“ hbox ”,Studio会按名称过滤UI组件。 将HBox组件拖放到窗体或层次结构中
    11
  6. 右键单击位于可视表单布局中的组件表示形式; 或在“ 层次结构”部分中选择组件,然后切换到“ 属性”选项卡(“组件面板”旁边)。

我们将需要使用屏幕控制器上的Hbox,以便能够通过控制器访问CUBA组件,我们需要定义其id 。 只需在ID字段中按右按钮,Studio就会自动生成一个ID。

另外,我们希望步进器的宽度为250px,因此我们为其容器指定此尺寸。

应用我们所做的所有更改。

12

  1. 启动您的IDE,转到屏幕设计的控制器选项卡,然后按IDE的Studio将生成的项目文件,并在IDE中打开屏幕控制器。
    13
  2. 移至IDE,Studio已经在其中安装了屏幕控制器。 让我们编码一下。 您需要添加的所有行均带有详细注释:
package com.company.vaadincomponent.web.screens;import com.haulmont.cuba.gui.vaadincomponent.AbstractWindow;
import com.haulmont.cuba.gui.vaadincomponent.HBoxLayout;
import com.vaadin.ui.Layout;
import org.vaadin.risto.stepper.DateStepper;import javax.inject.Inject;
import java.util.Map;public class Screen extends AbstractWindow {/* Getting access to the hbox component, using CUBA mechanism for UI components injection */@Injectprivate HBoxLayout hbox;/* Create stepper to be placed into the prepared hbox container */private DateStepper stepper = new DateStepper();/* Overriding init method, which will be called by the framework after creation of all components and before showing the screen */@Overridepublic void init(Map<String, Object> params) {super.init(params);/* Unwrapping hbox to get access to the native Vaadin layout to place stepper */Layout box = hbox.unwrap(Layout.class);/* Placing stepper component into the unwrapped hbox container */box.addComponent(stepper);/* Defining stepper size to fit 100% of the parent hbox component width */stepper.setWidth("100%");/* Adding listener to show notification when stepper value is changed */stepper.addValueChangeListener(event -> showNotification("Value has been changed to " + stepper.getValue(), NotificationType.HUMANIZED));}
}
  1. 要从应用程序的主菜单访问我们的屏幕,请转到Studio右面板的Main Menu(主菜单)部分,单击Edit(编辑),将焦点放在应用程序项上,然后按New(新建) 。 默认情况下,我们保留了步进器屏幕ID,因此,在下拉列表中找到屏幕值,然后按添加
    14
  2. 现在是启动应用程序并查看其全部工作方式的时候了。 按“ 播放 ”按钮,该按钮位于Studio主菜单中“ 构建”项目的正下方。 Studio会征得您的许可更新数据库,并同意。

当应用程序启动并运行时,您将在左下方看到localhost:8080 / app链接,单击它。

15

CUBA应用程序将在登录屏幕上显示您的身份,默认用户为admin ,您猜密码是多少? 只需按Submit 。 单击主菜单的“ 应用程序”->“屏幕”项,然后开始!

16

您可以在此处找到工作的步进器示例项目的源代码。

结论

最初,我将写一篇文章,介绍Vaadin,GWT和JavaScript组件的所有集成级别,但是正如您所看到的那样,一篇文章太过复杂了。 因此,下一次我将介绍JavaScript组件。

另外,我想承认该过程的某些部分可以大大简化甚至完全消除,但这是第一步,可以立即帮助用户使用很少使用但有时非常有用的小部件使我们的通用用户界面饱和。 因此,如果您有关于如何改进它的建议或想法,请在我们的论坛上与我们分享。

翻译自: https://www.javacodegeeks.com/2016/07/how-extensible-is-your-framework.html

来的多可选

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335917.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【H.264/AVC视频编解码技术】第六章【指数哥伦布编码】

H264中语法元素描述符 指数哥伦布 (Exponential-Golomb) 熵编码 指数哥伦布编码同哈夫曼编码一样,都是变长编码。 二者的显著区别: 信源相关性:哈夫曼编码依赖于信源的概率分布;指数哥伦布与信源无关。 额外信息:哈夫曼编码的数据必须额外携带与信源匹配的码表;指…

C++ 11 深度学习(七)位运算常见操作

1. 取出数中任意k位置的二进制位是0还是1 n >> k & 1 原理&#xff1a;先把想要取出的位置移动到个位&#xff0c;1的二进制是 0001 , 进行与操作就可以提取出最后一位是0还是1&#xff1b;二进制是从右向左&#xff0c;由低到高&#xff0c;从0到7。 2. 右移操作 …

聚合项目访问后台接口失败_聚合支付系统和免签支付系统对未来支付市场有哪些影响...

时势所趋&#xff0c;在如今支付通道不稳定的情况下&#xff0c;四方聚合支付的出现弥补了通道不稳的情况&#xff0c;四方聚合支付可以接入多个三方&#xff0c;实现在三方不稳的情况直接后台切换三方&#xff0c;实现一秒切换&#xff0c;还可以接入个人免签支付系统&#xf…

activemq消息持久化_ActiveMQ 5.x中的消息持久性

activemq消息持久化我被问了很多关于ActiveMQ如何存储消息&#xff08;或在某些情况下不存储&#xff09;的基本知识。 这是它的高级解释。 注意&#xff0c;上下文在JMS中。 如果您使用ActiveMQ的非JMS客户端&#xff08;即STOMP&#xff0c;AMQP&#xff0c;MQTT等&#xff0…

【安卓开发 】Android初级开发(十一)Android中多线程

线程的创建 1.创建一个Thread类&#xff0c;或者创建一个Thread子的对象&#xff1b; 2.创建一个Runnable接口的类对象; 传入Runnable对象创建线程 package com.sina.baode;import android.util.Log;/** 自定义一个继承于Runnable*/public class DemoThread implements Run…

td 内单选框不可用_在TD,我和曾经的老师变成了同事,也收获了最满意的“课外活动”...

早就想找个时间好好写一篇文章记录一下我在TD的学习工作经历了&#xff0c;同时表达一下我对TD深深的爱和感谢。一、结缘TD一年前&#xff0c;我第一次报了TD的AP环境科学寒假班。由于当时我在冲刺三月的SAT&#xff0c;整个寒假我一心扑在了SAT上&#xff0c;没来得及听TD的直…

activiti脚本任务_Activiti中的安全脚本如何工作

activiti脚本任务最近的Activiti 5.21.0版本的突出特点之一是“安全脚本”。 Activiti用户指南中详细介绍了启用和使用此功能的方法 。 在这篇文章中&#xff0c;我将向您展示我们如何实现其最终实现以及它在幕后所做的事情。 当然&#xff0c;因为这是我通常的签名风格&#x…

C++ 11 深度学习(八)重定义override

1.动态联编&#xff0c;本质是在运行时多态的表现。 2.其本质是因为维护了一张虚函数表&#xff0c;虚函数表以链表的形式存在。每个结点存储了对象指针的地址&#xff0c;通过一个指针进行遍历索引。 #include <iostream> #include <armadillo> using namespace …

逻辑回归模型_联邦学习体系下——逻辑回归模型

联邦学习的体系我们在前期介绍过&#xff0c;这里我们简单回顾一下纵向联邦学习的定义&#xff1a;在两个数据集的用户重叠较多而用户特征重叠较少的情况下&#xff0c;将数据集按照纵向 (即特征维度)切分&#xff0c;并取出双方用户相同而用户特征不完全相同的那部分数据进行训…

C++ 11 深度学习(九)C++文件IO

1.将数据写入文件 #include <iostream> #include <fstream> using namespace std;int main() {ofstream p1;p1.open("outfile.txt");p1 << "向文件写入信息" << endl;p1.close();return 0; } 2.将数据从文件中读出 #inclu…

plsql例外_大例外背后的真相

plsql例外异常可能是最被滥用的Java语言功能。 这就是为什么 让我们打破一些神话。 没有牙仙子。 圣诞老人不是真实的。 TODO评论。 finalfinalversion-final.pdf。 无皂肥皂。 而且…例外实际上是例外。 后者可能需要更多说服力&#xff0c;但是我们可以帮助您。 在这篇文章…

滴滴java开发面试题_Java开发经典面试题(十二)

好久没有来更新我的面试题了&#xff0c;不知道关注我的小伙伴有没有失联啊&#xff1f;&#xff01;呼叫&#xff01;好了开始我们今天的正题分享&#xff01;1、如何从FutureTask不阻塞获取结果get(long timeout,TimeUnit unit)&#xff0c;超时则返回轮询&#xff0c;先通过…

hashmap大小_调整HashMap的大小:未来的危险

hashmap大小最近&#xff0c;我偶然发现了一个错误&#xff0c;该错误是由于多个线程对java.util.HashMap的使用不当引起的。 该错误是泄漏抽象的一个很好的例子。 只有了解数据结构的实现级别详细信息&#xff0c;才能帮助我解决当前的问题。 因此&#xff0c;我希望与他人分享…

apache spark_Apache Spark软件包,从XML到JSON

apache sparkApache Spark社区为扩展Spark付出了很多努力。 最近&#xff0c;我们希望将XML数据集转换为更易于查询的内容。 我们主要对每天进行的数十亿笔交易之上的数据探索感兴趣。 XML是一种众所周知的格式&#xff0c;但是有时使用起来可能很复杂。 例如&#xff0c;在Apa…

【OpenGL从入门到精通(七)】OpenGL中的数学

1.向量单位化 2.三维向量点乘/点积&#xff08;结果为标量&#xff09; 3.三维向量叉乘&#xff08;叉积&#xff09;结果为向量 3.坐标平移 因为在OpenGL中使用的都是齐次坐标&#xff0c;即x , y , z , w 如果使得点(0, 0, 0) 平移到(1, 2, 3)位置。将坐标表示为矩阵的形式&…

javafx窗体程序_JavaFX实际应用程序:SkedPal

javafx窗体程序“真实世界的应用程序”系列中的一个新条目。 这次是SkedPal &#xff0c;这是一个用于智能管理忙人生活的应用程序。 我一直在咨询SkedPal团队有关JavaFX的事务&#xff0c;并且在他们决定开始使用我的CalendarFX框架来满足他们的日历要求时&#xff0c;我也在咨…

kafka 发布订阅_在Kafka中发布订阅模型

kafka 发布订阅这是第四个柱中的一系列关于同步客户端集成与异步系统&#xff08; 1&#xff0c; 2&#xff0c; 3 &#xff09;。 在这里&#xff0c;我们将尝试了解Kafka的工作方式&#xff0c;以便正确利用其发布-订阅实现。 卡夫卡概念 根据官方文件 &#xff1a; Kafka是…

apache camel_使用Apache Camel进行负载平衡

apache camel在此示例中&#xff0c;我们将向您展示如何使用Apache Camel作为系统的负载平衡器。 在计算机世界中&#xff0c;负载平衡器是一种充当反向代理并在许多服务器之间分配网络或应用程序流量的设备。 负载平衡器用于增加容量&#xff08;并发用户&#xff09;和应用程…

lombok 自动使用_Lombok,自动值和不可变项

lombok 自动使用我喜欢布兰登&#xff08;Brandon &#xff09;在博客文章中比较Project Lombok &#xff0c; AutoValue和Immutables的建议 &#xff0c;而这篇文章试图做到这一点。 我已经简要概述了Project Lombok &#xff0c; AutoValue和Immutables &#xff0c;但是这篇…

邮箱批量登录接验证码_记一次莫名的需求(临时邮箱|企业邮箱)

目录&#xff1a;前言行情伪需求过程1.前戏2.买域名3.网易企业邮箱4.模糊的需求5.晚饭后6.临时邮箱16.临时邮箱27.域名版临时邮箱8.遇见问题8.1.DNSPOD8.2.换种思路拓展1.思路2.后续2.1.简单2.2.自建临时邮箱后话记一次需求不明的亏看完这篇文章你会学到&#xff1a; 免费企业邮…