javafx 项目_JavaFX,Jigsaw项目和JEP 253

javafx 项目

因此, Java 9可能会破坏您的代码 ……

如果您的项目使用JavaFX,则这尤其可能,因为许多自定义和自制控件都需要使用内部API。 借助Project Jigsaw,这些内容将无法在Java 9中访问。幸运的是, Oracle在几天前宣布了 JEP 253 。 其目标:

为JavaFX UI控件和CSS功能定义公共API,这些公共API当前仅可通过内部API使用,因此由于模块化而变得不可访问。

JEP 253 – 2015年5月14日

让我们看一下JavaFX,Jigsaw项目和JEP 253是如何交互的。

总览

为了更好地了解内部API在JavaFX中的作用,了解其控制体系结构将很有帮助,因此我们将从此开始。 然后,我们将研究为什么在使用JavaFX时经常使用内部API。 这将有助于将新的JEP置于上下文中。

因为我熟悉它,所以我经常以ControlsFX为例。 我假设类似的库(例如JFXtras )以及其他自定义JavaFX的项目都处于相同的情况。

JavaFX控制架构

模型视图控制器

JavaFX控件是根据model-view-controller实现的 。 无需赘述,让我们快速了解一下如何完成。 (有关详细信息,请参见GuiGarage 。)

所有正式控件都扩展了抽象类Control 。 这是MVC的模型。

该控件定义一个skinProperty ,其中包含一个Skin实现。 它可视化控件的当前状态,即它是MVC的视图。 默认情况下,它还负责捕获和执行用户交互,这在MVC中是控制器的任务。

皮肤通常是通过扩展BehaviorSkinBase实现的。 它创建了BehaviorBase的实现,将所有用户交互委托给该BehaviorBase的实现,并相应地更新了模型。 因此,这里有MVC的控制器。

按键绑定

还值得注意的是控件如何解决用户输入。 为了将动作链接到输入(例如,“ CTRL +鼠标单击”中的“在后台打开新选项卡”),它们创建了KeyBindings列表。 然后将输入事件与所有创建的绑定进行比较,并调用正确的操作。

由Flosweb在CC-BY-SA下发布-我添加了拼图效果。

由Flosweb在CC-BY-SA下发布 -我添加了拼图效果。

JavaFX中的内部API

使用JavaFX时,通常依赖于内部API。 这样做是为了创建新控件,调整现有控件或修复错误。

创建新控件

虽然ControlSkin甚至SkinBase都是公共API,但经常使用的BehaviorSkinBaseBehaviorBase不是。 使用拼图项目,将无法访问它们。

不过,该API的使用率很高。 ControlsFX包含大约二十个控件,其中大约一半需要这些类之一的实现。

同样,键KeyBindings没有发布,因此创建键KeyBindings来管理用户交互会增加另一个有问题的依赖性。

调整现有控件

自定义现有控件通常会更改可视化效果或调整某些用户交互的行为。

对于前者,简单地扩展和修改现有的外观通常是最容易的。 不幸的是,现有控件的所有外观都位于com.sun.javafx.scene.control.skin 。 当它们变得不可访问时,许多自定义控件将不再编译。

要更改控件对用户交互的React,必须干预BehaviorBase定义的BehaviorBase 。 这类似于创建新控件,通常通过扩展BehaviorSkinBaseBehaviorBase并创建新的KeyBindings

通过CSS设置控件的样式

在JavaFX中,可以实现控件,以便可以通过CSS设置样式。 所有官方控件都具有此功能,其他一些控件也由其他项目提供。

设置控件样式的中心步骤是将属性的文本表示形式从CSS文件转换为NumberPaint ,enum…的实例,以便可以将它们分配给属性。 为了确保统一,高质量的转换,JavaFX为此提供了一个API。 不幸的是,它位于com.sun.javafx.css.converters

高级样式要求必须在StyleManager帮助下实现,您猜想它也没有发布。

解决错误

JavaFX相对来说还很年轻,但仍然包含一些很难接触的错误。 通常,唯一的解决方法是侵入控件的内部工作原理,从而使用私有API。 (此类情况的示例可以在OpenJFX邮件列表中找到,例如RobertKrüger , Stefan Fuchs和Tom Schindl在这些邮件中。)

这些变通办法将在Java 9中失败。由于似乎所有错误均已修复,因此它们不必要变得不必要,因此可以理解以下问题:

当然,从理论上讲,如果所有[那些bug]都已在[Java] 9中得到了修复,那我很好,但是如果有一段时间将其中的一半修复在9中,而另一半只能在8,我该如何处理我的产品?

罗伯特·克鲁格– 2015年4月9日

杰普253

我们已经了解了为什么在使用JavaFX时普遍使用内部API。 那么, JEP 253如何解决这个问题?

(除非另有说明,否则本节中的所有引号均取自JEP。)

目标,非目标和成功指标

该提案恰好解决了到目前为止所描述的问题。 而且它认识到“在很多情况下,要获得理想的结果,开发人员别无选择,只能使用这些内部API”。 因此,“此JEP的目标是为内部API当前提供的功能定义公共API”。

(请注意,当开发人员将其代码从内部移动并且现在无法访问新的公共API时,这仍然会带来编译错误。)

同时,该JEP既不计划对现有已发布的代码进行任何更改,也不进行任何改进:“不受模块化影响的所有其他现有API都将保持不变。”

定义了两个成功指标:

  • “依赖JavaFX内部API的项目,尤其是Scene Builder,ControlsFX和JFXtras,在更新到新的API之后仍可以继续工作,而不会失去功能。”
  • “最终,如果所有工作都按计划进行,那么第三方控件应该是可构建的,而不依赖于内部API。”

三个项目

JEP分为三个项目:

项目一:使UI控件外观成为公共API

现有控件的外观将从com.sun.javafx.scene.control.skin移至
javafx.scene.control.skin 。 这将使它们成为已发布的API。 (请注意,这不包括行为类。)

项目二:改进对输入映射的支持

行为将通过输入映射来定义。 这允许在运行时更改控件的行为,而无需扩展任何特定(且未发布)的类。

项目三:审查并公开相关CSS API

com.sun.*软件包中当前可用CSS API将进行审查和发布。 该提案将更加详细,并描述每个项目的当前状态以及一些风险和假设。

这些项目解决了上述四个用例中的三个。 可以合理地假设可以满足这些要求,并且在Java 9中,即使无法访问内部API,也可以正确地创建,调整和皮肤控件。

如何解决错误? 至少其中一些似乎可以用相同的工具解决(例如,扩展现有的皮肤)。 但是我不能说这是否对所有人都适用,以及没有解决方法留下来的重要性有多重要。

时间表

如果您想试用新的API,则必须耐心等待一段时间。 JFX 253的所有者,JavaFX UI控件团队的Oracle技术负责人乔纳森·吉尔斯(Jonathan Giles)在推文中说,“他可能在几个月内不会合并到存储库中……”。

另一方面,由于Java 9的功能完整性计划于12月发布 ,因此它必须在接下来的七个月内可用。

反射

我们已经看到,使用JavaFX常常需要使用私有API。 这发生在三个截然不同的区域:

  • 根据控件体系结构(MVC)创建新控件。
  • 通过扩展其外观或更改键绑定来调整现有控件。
  • 通过CSS设置控件的样式。
  • 解决错误。

JEP 253分为三个项目,分别针对前三个领域。 (对于我来说)尚不清楚它们是否足以仅使用公共API来解决错误。

翻译自: https://www.javacodegeeks.com/2015/05/javafx-project-jigsaw-and-jep-253.html

javafx 项目

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

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

相关文章

C语言结构体用法很多,坑也很多

点击上方蓝字关注我,了解更多咨询还在使用89年版C语言的Linux内核,现在终于要做出改变了。今天,Linux开源社区宣布,未来会把内核C语言版本升级到C11,预计5.18版之后生效,也就是今年5月。这个决定很突然&…

java 消息队列服务_ActiveMQ 消息队列服务

1 ActiveMQ简介1.1 ActiveMQ是什么ActiveMQ是一个消息队列应用服务器(推送服务器)。支持JMS规范。1.1.1 JMS概述全称:Java Message Service ,即为Java消息服务,是一套java消息服务的API标准。(标准即接口)实现了JMS标准的系统,称之…

第一个C语言编译器是怎样编写的?

点击上方蓝字关注我,了解更多咨询以我们嵌入式开发中经常使用的C语言为例,我们来介绍一下第一个C语言编译器的来源。还是让我们回顾一下C语言历史:1970年Tomphson和Ritchie在BCPL(一种解释型语言)的基础上开发了B语言&…

C语言fgets()函数:以字符串形式读取文件

点击上方蓝字关注我&#xff0c;了解更多咨询C语言 fgets() 函数从文本文件中读取一个字符串&#xff0c;并将其保存到内存变量中。fgets() 函数位于 <stdio.h> 头文件中&#xff0c;其使用格式如下&#xff1a;fgets(字符串指针,字符个数n,文件指针);格式说明&#xff1…

摆脱冷气_摆脱匿名类

摆脱冷气我真的很喜欢编写和阅读lambda表达式-它们简洁&#xff0c;富于表现力和时尚&#xff08;来吧&#xff0c;这样就没关系了&#xff01;&#xff09;。 将此与匿名类进行比较。 这就是为什么我喜欢摆脱它们&#xff01; 在过去的几个月里&#xff0c;这种认识慢慢地实现…

深入了解C语言

点击上方蓝字关注我&#xff0c;了解更多咨询c语言在编程语言中是偏底层的语言&#xff0c;像JavaScript&#xff0c;以及java。都是在c语言的基础上编译出来的。像操作系统&#xff1a;unix &#xff0c;linux &#xff0c;windows都是依靠c语言开发出来的&#xff0c;使用c语…

C语言函数注意点有哪些?

点击上方蓝字关注我&#xff0c;了解更多咨询构成C程序的基本单位是函数 C语言程序是由函数构成的&#xff0c;不存在过程。函数名代表该函数的入口地址C语言函数可以嵌套调用&#xff0c;例如&#xff1a;fun(fun(x)) &#xff1b;于C语言中&#xff0c;子程序的…

C语言中的逻辑值

点击上方蓝字关注我&#xff0c;了解更多咨询C语言中的逻辑值1.C语言中的逻辑值2.逻辑运算符的运算规律3.逻辑值的举例说明一&#xff0e;C语言中的逻辑值逻辑值即逻辑运算操作的结果。在C语言中&#xff0c;逻辑运算包括关系运算与逻辑运算。关系运算包括大于(>),小于(<…

java page size_java ducument.pagesize.a2打印时用a4可以吗

展开全部概述Document是itext的基础&#xff0c;你可以添加文档数据(用户阅读62616964757a686964616fe58685e5aeb931333339666161的信息)和元数据(pdf内部使用的信息)。在创建document对象时&#xff0c;你可以定义page size&#xff0c;page color and page margins。构造函数…

C/C++语言重要语法之输入输出

点击上方蓝字关注我&#xff0c;了解更多咨询C语言是一种编译式的、通用的、大小写敏感的编程语言&#xff0c;完全支持面向对象开发。基本的输入输出cin和cout在C语言中&#xff0c;标准的键盘输入和屏幕输出功能分别使用scanf()和printf()两个函数实现。在C语言中&#xff0c…

mysql int number_Oracle/MySQL decimal/int/number 转字符串

有时客户需要流水数据&#xff0c;当导出为excel的时候&#xff0c;客户编号等很长数字的栏位&#xff0c;被excel变成科学记数法&#xff0c;无法正常查看。因此&#xff0c;需要将Oracle/MySQL中的decimal/int 转 varchar&#xff0c;这样在excel中就可以放心查看了。Oracle的…

C语言的“递归函数”这么难理解,为什么不丢弃它呢?

点击上方蓝字关注我&#xff0c;了解更多咨询变量就是在程序运行期间其值可以变化的量。每个变量都属于一种类型&#xff0c;每种类型都定义了变量的格式和行为。因此&#xff0c;一个变量应该有属于自己的名称&#xff0c;并且在内存中占有存储空间&#xff0c;其中&#xff0…

apache lucene_Apache Lucene的结构

apache lucene无可估量的高贵的Apache软件基金会&#xff08;Apache Software Foundation&#xff09;产生了许多巨大的产品&#xff08;Ant&#xff0c;CouchDB&#xff0c;Hadoop&#xff0c;JMeter&#xff0c;Maven&#xff0c;OpenOffice&#xff0c;Subversion等&#xf…

mysql 排序 过滤_【MYSQL】-3 排序与过滤

上周加入数据蛙二期培训&#xff0c;结束了孤独战斗的现状。断断续续自学了3个月(当然看了各种视频和各种书&#xff0c;一把辛酸泪。。。)&#xff0c;现在选择报班&#xff0c;主要还是觉得一个靠谱的组织和团队&#xff0c;可以极大缓解我学习过程中不时闪现的焦虑和无助&am…

构造函数 构造代码块_构造函数必须没有代码

构造函数 构造代码块构造函数中应完成多少工作&#xff1f; 在构造函数内部进行一些计算然后封装结果似乎是合理的。 这样&#xff0c;当对象方法需要结果时&#xff0c;我们将准备好它们。 听起来是个好方法&#xff1f; 不&#xff0c;这不对。 这是一个坏主意&#xff0c;原…

C语言按位逻辑运算符总结-与、或、非、异或

点击上方蓝字关注我&#xff0c;了解更多咨询C中有按位逻辑运算符&#xff1a;按位取反、按位与、按位或、按位异或。这4个运算符可以用于整型&#xff0c;包括char类型。按位操作针对每一个位进行操作&#xff0c;不影响左右两边的位。4个运算符的作用总结如下&#xff1a;一、…

C语言的本质——位运算

点击上方蓝字关注我&#xff0c;了解更多咨询位运算是指按二进制进行的运算。在系统软件中&#xff0c;常常需要处理二进制位的问题。C语言提供了6个位操作运算符。这些运算符只能用于整型操作数&#xff0c;即只能用于带符号或无符号的char,short,int与long类型。C语言提供的位…

Java创新型模式_java设计模式--创建型模式(一)

2016-04-24 10:10:34创建型模式&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式注意&#xff1a;工厂模式可以分为三类&#xff1a; 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory)这三种模式从上…

原来这就是C语言的基本结构—循环结构?!

点击上方蓝字关注我&#xff0c;了解更多咨询今天我们就着重说说循环结构。循环结构分为三种&#xff0c;分别是for、while、dowhile;我们首先说第一种&#xff1a;for循环..他的代码格式为&#xff1a;for(判断的数值初始化;判断条件;改变判断数值大小){循环语句块&#xff1b…

java count 在哪一类里_java 5线程中 Semaphore信号灯,CyclicBarrier类,CountDownLatch计数器以及Exchanger类使用...

先来讲解一下Semaphore信号灯的作用:可以维护当前访问自身的线程个数&#xff0c;并提供了同步机制&#xff0c;使用semaphore可以控制同时访问资源的线程个数例如&#xff0c;实现一个文件允许的并发访问数。请看下面的演示代码:1 public classSemaphoreTest2 {3 public stati…