使用JacpFX和JavaFX2构建富客户端

创建快速且可扩展的桌面客户端始终是一个挑战,特别是在处理大量数据和长时间运行的任务时。 尽管Eclipse RCP和Netbeans RCP是已建立的平台,但其想法是建立一个轻量级的框架来异步处理组件,类似于Web组件。 开发人员在线程主题上的工作应较少,并且应该能够自己对应用程序的消息流进行建模。 这些以及许多其他想法产生了JacpFX项目。

JacpFX

JacpFX(Java异步客户端平台)项目是一个框架,可使用JavaFX 2Spring和类似于Actor的组件方法以MVC样式创建Rich Client (桌面和/或Web)。 它提供了一个简单的API,用于创建工作区,透视图和组件。 与所有部分进行通信并轻松组成您的客户应用程序。

JacpFX为您提供什么?

  • 使用Java中的小型和简单API (〜120Kb)实现扩展和响应式Rich Clients
    • 与Spring和JavaFX 2完全集成
  • 在运行时在用户界面中添加/移动/删除定义的组件
    • 在Perspectives中创建基本布局,并为组件UI定义“占位符”
  • 在FX应用程序线程之外处理组件
    • “ handle”方法在工作线程中执行,“ posthandle”方法由FX应用程序线程执行
  • 有状态和无状态回调非UI组件
    • 外包长期运行的流程和计算
  • 轻松处理异步过程
    • 不需要显式线程或类似Runtime.invoke()的东西
  • 通过异步消息进行通信
  • 组件之间没有共享数据
  • 不变的讯息

以下文章将为您简要介绍JacpFX以及如何使用它创建基于JavaFX 2的Rich Clients。 这里显示的示例客户端是一个(伪)联系人管理器,您可以在这里尝试: http : //developer.ahcp.de/demo/JACPFX2Demo.html ; 您可以在此处下载完整的源代码: http : //code.google.com/p/jacp/downloads/list

前提条件:

必须安装有效的JavaFX2运行时才能运行演示应用程序(当前仅在Windows上可用)。 为了编译随附的演示代码,假定已安装JavaFX2 SDK(也适用于Mac和Linux)和Apache Maven。 请参阅本文末尾的详细说明:

图1:第一次选择类别,客户会要求您生成250.000个联系人。 生成这些联系人并将其增量添加到表格视图后,您可以选择下一个类别,浏览到下一个表格页面,查看消费者图表数据或仅编辑联系人。 请记住,演示客户端代码中未使用任何显式线程

应用–结构

JacpFX应用程序由应用程序启动器,工作台,至少一个透视图和至少一个组件组成。 示例客户端使用三个UI组件和三个非UI(回调)组件来创建数据并模拟大量数据访问。

应用程序–启动器(AFX2SpringLauncher)

应用程序-启动器是定义Spring上下文的应用程序的主类。 JacpFX –应用程序使用xml声明来定义应用程序和所有元数据的层次结构,例如“ component-id”和“ execution-target”。 Spring main.xml位于资源目​​录中,并将在启动程序构造函数中声明:

public class ContactMain extends AFX2SpringLauncher {public ContactMain() {super("main.xml");}public static void main(String[] args) {Application.launch(args);}@Overridepublic void postInit(Stage stage) {// define your css and other config stuff here}
}

清单1:应用程序启动器

应用程序–工作台(AFX2Workbench)

工作台是JacpFX应用程序的UI根节点。 在这里,您可以配置应用程序,设置分辨率,定义工具–条,菜单,并参考JavaFX阶段。

public class ContactWorkbench extends AFX2Workbench {@Overridepublic void handleInitialLayout(IAction<Event, Object> action,IWorkbenchLayout<Node> layout, Stage stage) {layout.setWorkbenchXYSize(1024, 768);layout.registerToolBar(ToolbarPosition.NORTH);layout.setMenuEnabled(true);}@Overridepublic void postHandle(FX2ComponentLayout layout) {final MenuBar menu = layout.getMenu();final Menu menuFile = new Menu("File");final MenuItem itemHelp = new MenuItem("Help");/// add the event listener and show an option-pane with some help textmenuFile.getItems().add(itemHelp);menu.getMenus().addAll(menuFile);    }
}

清单2:工作台

透视图(AFX2Perspective)

透视图的任务是提供当前视图的布局,并注册视图的根节点和所有叶节点。 叶节点是与此透视图关联(注入)的所有组件的“执行目标”(容器)。 演示透视图基本上定义了两个SplitPanes ,并将它们注册为“执行目标”,以在左侧显示ContactTreeView的内容。 右上方的ContactTableView和右下方的ContactChartView

图2:演示中的透视图定义的三个目标
public class ContactPerspective extends AFX2Perspective {@Overridepublic void onStartPerspective(FX2ComponentLayout layout) {// create button in toolbar; button should switch top and bottom id's ToolBar north = layout.getRegisteredToolBar(ToolbarPosition.NORTH);
...north.getItems().add(new Button("switch view");) ;}@Overridepublic void onTearDownPerspective(FX2ComponentLayout layout) {   }@Overridepublic void handlePerspective(IAction<Event, Object> action,FX2PerspectiveLayout perspectiveLayout) {if (action.getLastMessage().equals(MessageUtil.INIT)) {createPerspectiveLayout(perspectiveLayout);}     
}private void createPerspectiveLayout(FX2PerspectiveLayout perspectiveLayout) {define your UI layout...// Register root componentperspectiveLayout.registerRootComponent(mainLayout);// register left menuperspectiveLayout.registerTargetLayoutComponent("PleftMenu", leftMenu);// register main content TopperspectiveLayout.registerTargetLayoutComponent(“PmainContentTop”,mainContentTop);// register main content BottomperspectiveLayout.registerTargetLayoutComponent("PmainContentBottom",mainContentBottom);}}

清单3:透视图

UI组件(AFX2Component)

AFX2Components是JacpFX应用程序中实际的UI组件,它们呈现为JavaFX组件。 该演示定义了左侧( ContactTreeView ),主顶部( ContactTableView )和主底部( ContactDemoChartViewAFX2Component 。 JacpFX组件有四种实现方法: “ onStartComponent”和“ onTearDownComponent”以及“ handleAction”和“ postHandleAction”。 在工作线程中执行“ handleAction”时,在FX应用程序线程中运行“ postHandle”。

图3:AFX2Component的组件生命周期

您可以根据需要使用组件的延迟初始化以及关闭或重新启动组件。

public class ContactTreeView extends AFX2Component {private ObservableList<Contact> contactList;...@Overridepublic Node handleAction(final IAction<Event, Object> action) {if (action.getLastMessage().equals(MessageUtil.INIT)) {this.pane = new ScrollPane();        ...return this.pane;}return null;}@Overridepublic Node postHandleAction(final Node node,final IAction<Event, Object> action) {if (action.getLastMessage() instanceof Contact) {this.contactList.addAll((Contact) action.getLastMessage());}return this.pane;}@Overridepublic void onStartComponent(final FX2ComponentLayout layout) {final ToolBar north = layout.getRegisteredToolBar(ToolbarPosition.NORTH);…north.add(new Button("add category"));}@Overridepublic void onTearDownComponent(final FX2ComponentLayout layout) {    }...    
}

清单4:ContactTreeView(左视图)

清单4中的“ handleAction”方法用于初始化组件UI。 在演示的“ postHandle”操作中,添加了新联系人; contactList已绑定到现有的TreeView,因此您无法在FX应用程序线程之外对其进行更新,因此必须使用“ postHandle”方法。

回调组件

JacpFX回调组件是非UI /服务组件。 与AFX2Component相似,它们具有一种称为“处理”的方法,该方法在工作线程中执行。 结果可以是任何类型的对象,并将自动传递回调用组件或重定向到任何其他组件。

在这些类型的组件中,您将执行长时间运行的任务,调用服务调用或仅从存储中检索数据。 JacpFX提供两种类型的回调组件,“ AStatelessCallbackComponent ”和(有状态的)“ ACallbackComponent ”。 演示客户端使用“ ACallbackComponent ”组件为选定的联系人表生成随机图表数据。

为了生成大量联系人,需要使用两个“ AStatelessCallbackComponents ”。 其中一个组件将总金额分成大块,第二个组件仅创建联系人。 结果将直接发送到UI组件并添加到表中。

讯息传递

消息传递是JacpFX框架的本质。 JacpFX使用异步消息传递来通知应用程序的组件和观点。

在演示应用程序中为类别创建初始数据量的消息流如下所示:

图4:在演示应用程序中创建初始数据量的消息流

JacpFX组件的状态始终由消息更改。 如果应该在后台线程中处理任务,则只需向组件发送一条消息,然后使用“ handle”方法处理工作。 结果可以发送回调用方组件,或由FX应用程序线程在“ postHandle”方法中进行处理(对于UI组件)。 您应始终避免在FX应用程序线程上执行长时间运行的任务; 而是在“ handle”方法中调用您的服务或数据库操作。

JacpFX在两种消息类型( 本地消息和全局消息)之间有所不同。

本地留言

要触发本地消息,只需获取一个侦听器

IActionListener<EventHandler<Event>, Event, Object> listener =   this.getActionListener(“message”);

仅带有一个参数–消息本身。 可以将此侦听器分配给任何JavaFX eventHandler(例如onMouseEvent等),也可以通过调用将其触发

listener.performAction(event);

全局消息

通过全局消息,您可以与其他已注册组件通信。 默认情况下,回调组件会响应消息,因此您无需显式创建响应消息-也可以。 消息传递是在组件之间交换数据和触发任务的首选方式。 与本地消息类似,您可以创建一个侦听器实例,但具有明确的目标ID:

IActionListener<EventHandler<Event>, Event, Object> listener =   this.getActionListener(“id“,“message”);

从源代码构建演示应用程序

在本地Maven存储库中注册JavaFX

所有JacpFX-Projects都是Maven项目,并且需要JavaFX 2(jfxrt.jar)。 其中一些包含JavaFX 2作为系统依赖项,但是我们更愿意在本地存储库中注册jfxrt.jar。 要创建可部署文件(jnlp和html),您还需要注册JavaFX Ant-Tasks(ant-javafx.jar)。 为此,请更改您的$ {SDK-home} / rt / lib并输入:

mvn install:install-file -Dfile=jfxrt.jar -DgroupId=com.oracle -DartifactId=javafx-runtime -Dpackaging=jar -Dversion=2.0

然后将“ bin”目录(在Linux i386上)复制到您的.m2 \ repository \ com \ oracle \ javafx-runtime文件夹中。 接下来转到$ {SDK-home} / tools目录,然后键入:

mvn install:install-file -Dfile=ant-javafx.jar -DgroupId=com.oracle -DartifactId=ant-javafx -Dpackaging=jar -Dversion=2.0

建立项目

要构建项目,只需解压缩项目文件夹并键入mvn package 。 jar,jnlp和html文件在$ {projectHome} / target / deploy中创建 。 要创建Eclipse项目,只需键入mvn eclipse:eclipse

接下来会发生什么?

JacpFX当前是1.0版; 在使用Echo3和Swing进行了多年的原型设计之后,JacpFX是基于JavaFX 2和已定义的发布计划的第一个稳定版本。 您可以在项目Wiki页面( http://code.google.com/p/jacp/wiki/Documentation )上找到详细的文档。 我们的发布计划(也位于Wiki上)在今年6月定义了1.1版。 主要的变化将是注释支持和官方的FXML支持(您也已经可以使用FXML)。 随时欢迎您提供反馈,请随时与我们联系。

参考: W4G合作伙伴 Andy Moncsek的 JacpFX和JavaFX2构建富客户端


翻译自: https://www.javacodegeeks.com/2012/03/building-rich-clients-with-jacpfx-and.html

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

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

相关文章

lob移表空间 oracle_Oracle数据库(1)Oracle体系结构概述(一)

Oracle数据库的体系结构主要包括&#xff1a;物理存储结构、逻辑存储结构、内存结构和实例进程结构。了解了Oracle的体系结构&#xff0c;就可以对Oracle数据库有一个整体认识&#xff0c;这样有利于后续Oracle的学习。下面我们分别来了解逻辑存储结构、物理存储结构、内存结构…

java 对象的上转型对象(父类)

Example5_10.java class 类人猿 {void crySpeak(String s) {System.out.println(s); } } class People extends 类人猿 {void computer(int a,int b) { int ca*b;System.out.println(c); }void crySpeak(String s) {System.out.println("***"s"***"); }…

手机mstsc远程工具_远程桌面连接,只需3步,轻松远程操控电脑!

远程桌面的好处远程桌面有很多好处的1.对于运维技术人员来说&#xff0c;可以随时随地管理远程主机&#xff0c;查看系统信息和硬件信息等系统性能诊断&#xff0c;远程应用管理内存、CPU等敏感信息报警提醒&#xff0c;对远程主机的一切尽收眼2.对于客户服务来说&#xff0c;可…

qbytearry有数据上限吗_金仕达大数据开发岗位面试题

金仕达-上海(1)自我介绍(2)在离线数仓&#xff0c;实时数仓中担任的角色是什么&#xff0c;介绍项目&#xff1f;数据量有多大&#xff1f;(3)实时的指标和离线指标怎么消除掉&#xff1f;有没有必要一致&#xff1f;(4)Flink上有多少个指标&#xff0c;一个指标一个jar包吗&am…

BZOJ 1012 单调队列+二分

思路&#xff1a; 维护一个单减的序列 序号是单增的 每回二分查找第一个比询问的大的值 我手懒 用得lower_bound //By SiriusRen #include <cstdio> #include <algorithm> using namespace std; #define int long long int m,mod,top,jy,ans,tot; char ch[3]; st…

Linux入门笔记——cat、sort、uniq、wc、head、tail、tee

cat &#xff0d; 连接文件 cat 命令读取一个或多个文件&#xff0c;然后复制它们到标准输出。你可以使用 cat 来显示 文件而没有分页cat 经常被用来显示简短的文本文件。案例 意义 cat ls-output.txt 读取文件标准输出 cat movie.mpeg.0* > movie.mpeg 连接文件&#x…

fir.im Log Guru 正式开源,快速找到 iOS 应用无法安装的原因

很开心的宣布 Log Guru 正式开源&#xff01; Log Guru&#xff0c;是 fir.im 开发团队创造的小轮子&#xff0c;用在 Mac 电脑上的日志获取&#xff0c;Github 地址&#xff1a;FIRHQ/LogGuru. Log Guru 使用方法 当有测试者反馈应用装不上的时候&#xff0c;将其测试设备连接…

python求解三元一次方程_北师大版八上数学5.2 求解二元一次方程组 知识点微课精讲...

知识点总结代入消元法代入消元法的实质是将二元一次方程组中的某一个方程进行未知数的分离&#xff0c;即将该方程进行变换&#xff0c;完整分离出一个独立的未知数&#xff0c;而这个未知数将用含有另一个未知数的式子来表示。设某二元一次方程组为&#xff1a;将第(1)式进行变…

Java 7:完整的invokedynamic示例

我当前的Java 7系列中的另一个博客条目。 这次&#xff0c;它处理的是invokedynamic&#xff0c;这是JVM上用于方法调用的新字节码指令。 invokedynamic指令允许在呼叫站点和呼叫接收者之间进行动态链接。 这意味着您可以将正在执行方法调用的类链接到在运行时正在接收调用的类…

VC6兼容性及打开文件崩溃问题解决

VC6虽然老&#xff0c;但是一些工程还非得用它打开&#xff0c;没办法…… 今天偶然用到&#xff0c;因为新装了系统&#xff0c;之前的问题又要重新解决一遍 在这记录下解决过程&#xff0c;方便以后查阅&#xff1a; 一.兼容问题&#xff1a; XP以上windows系统打开VC6时可能…

Linux入门笔记——echo

echo Display a line of text(显示一行文本)这个命令的作用相当简单明了。传递到 echo 命令的任一个参数都会在&#xff08;屏幕上&#xff09;显示出来。 小插曲&#xff1a; 每当你输入一个命令&#xff0c;然后按下 enter 键后&#xff0c;bash 会在执行你的命令之前对输入 …

dataframe 空值替换为0_Python数据分析:Pandas之DataFrame

内容目录 DataFrame简介DataFrame创建方式DataFrame索引和切片DataFrame属性DataFrame级联与合并DataFrame基本操作DataFrame分组聚合操作DataFrame数据透视与交叉表1 DataFrame简介 我们在上次课中讲到了Pandas的Series结构,还没看的点这里 ailsa:python数据分析:Pandas之S…

具有NetBeans,WebLogic 12c,JPA和MySQL数据源的Arquillian

您可能已经关注了我的文章&#xff0c;其中涉及使用嵌入式GlassFish测试更复杂的场景&#xff08; 第I部分/第II部分 &#xff09;。 我要做的下一步是使此设置与最新的WebLogic 12c一起使用。 入门 按照我的前两个帖子的入门部分中的步骤进行操作。 要使此工作正常&#xff…

lfu算法实现c语言_哈希查找算法(C语言实现)

上一节介绍了有关哈希表及其构造过程的相关知识&#xff0c;本节将介绍如何利用哈希表实现查找操作。在哈希表中进行查找的操作同哈希表的构建过程类似&#xff0c;其具体实现思路为&#xff1a;对于给定的关键字 K&#xff0c;将其带入哈希函数中&#xff0c;求得与该关键字对…

现代化Java代码的七个NetBeans提示

在“ 七个不可或缺的NetBeans Java提示”一文中 &#xff0c;我谈到了一般使用NetBeans提示的问题&#xff0c;然后重点介绍了七个提示。 接下来列出了该帖子中强调的七个提示&#xff1a; 可疑方法调用 使用或&#xff01; AND字符串构造函数比较字符串 构造函数中的可重写方…

手机屏幕宽高像素计算_2020年的智能手机拍照新设计,就全看下半年了

此前我们三易生活在总结2019年智能手机影像设计的变化时曾经提到&#xff0c;智能手机上的大底与大像素设计几乎是花了一整年的时间&#xff0c;把自己从单纯的噱头&#xff0c;逐步改进成了能够确实提高拍照画质的业界主流技术。站在现在的视角来看&#xff0c;2019年这阵“高…

yield方法释放锁吗_死磕Synchronized底层实现重量级锁

点击上方“Java知音”&#xff0c;选择“置顶公众号”技术文章第一时间送达&#xff01;作者&#xff1a;farmerjohngit链接&#xff1a;https://github.com/farmerjohngit本文为死磕Synchronized底层实现第四篇文章&#xff0c;内容为重量级锁实现。本系列文章将对HotSpot的sy…

Java应用程序上的Twitter API

是否曾想过将推文附加到Java应用程序&#xff1f; 我为此寻找了最好的API&#xff0c;很幸运&#xff0c;我找到了它&#xff01; http://twitter4j.org/ 一个简单的方法&#xff1a; 我们需要做的第一件事是在您的Twitter帐户中创建一个应用程序&#xff0c;为其授予访问权限…

MongoDB学习1——Windows 下配置及启动mongodb服务器

1.下载mongodb程序&#xff1a;http://lt1.cr173.com/soft2/mongodb.zip 2.解压程序3.在解压后的mongodb文件夹中创建 data、logs、conf文件夹4.编写配置文件conf\mongod.conf#端口号 port 12345 #数据库路径&#xff0c;也可以使用绝对路径 dbpath data #日志路径&#xff0…

JavaFX 2.0条形图和散点图(以及JavaFX 2.1 StackedBarCharts)

JavaFX 2.0提供了用于生成图表的内置功能&#xff0c;该功能可在javafx.scene.chart包中找到。 在本文中&#xff0c;我将介绍如何使用JavaFX 2.0创建条形图和散点图 。 在本文的学习过程中&#xff0c;我将一路使用Guava和一些Java 7功能。 在演示JavaFX 2.0图表API之前&#…