`

(转载)JavaFX应用问题解答

阅读更多

原帖发表于: 构客网

原文链接: http://gocom.primeton.com/modules/newbb/item40292_40292.htm?referer=csdn&utm_campaign=gocom&utm_source=csdn&utm_medium=lks

本文将JavaFX用户在日常使用、开发工作中遇到问题收集汇总,形成“JavaFX应用问题解答”。希望读者也能够将自己在使用JavaFX中的问题提交到这里或是OpenJFX maillist!

JavaFX是什么?

  “JavaFX脚本是一种声明式、静态类型编程语言。它具有一等函数(first-class functions)、声明式的语法、列表推导(list-comprehensions)及基于依赖关系的增量式求值(incremental dependency-based evaluation)等特征。”JavaFX脚本为多种多样的操作提供了声明式、无中间程序逻辑的语法,这些操作包括创建2D动画、设置属性或者声明在模式和视图对象之间的绑定依赖关系。

什么样的函数能够称为“first-class functions”?

  在编程语言中,我们常常把那些将函数作为一等对象的函数称为一等函数(first-class functions)。具体地说,就是编程语言支持在程序执行过程中构造新的函数,并将它们存储在数据结构中作为其它函数的参数的传入参数,并在函数返回时将它们作为函数值返回。本概念并不涵盖任何语言和程序的外部函数或者程序,例如通过调用编译器或者一个eval函数来创建新函数。
这里提供一等函数的一个简单示例:map或者mapcar函数,它使用一个函数和一个列表作为参数,然后将通过将函数应用到列表中的每个成员后形成的列表作为返回值。

“declarative syntax”是什么意思?

  与大多数依靠程序和显式代码来更新在变量或者属性之间关系的编程语言不同,声明式语言允许数值被声明为另一种方式。
在JavaFX的一个示例:

  1. var a : Number = bind model.attrib/2;

  无论何时model.attrib的数值发生改变,a的数值都将自动、透明地更新,更新期间无需调用任何程序。这对于在模式和视图对象之间绑定依赖关系、控制GUI行为是特别有用的。

“list-comprehensions”是什么意思?

  我们常常把“list-comprehensions”翻译为“列表推导”。列表推导是在语言级别上支持以多种方式创建、维护列表的方法。
在JavaFX中的一些示例:什么是"incremental dependency-based evaluation"?

  1. var nums = [1,2,3,4];
  2. var nums2 = [1..4]; //same as above
  3. var numsGreaterThanTwo = nums[. > 2];
  4. var numsLessThanFour = select n from n in nums where n < 4;

 

  “incremental dependency-based evaluation”译为“基于依赖关系的增量式求值”。在JavaFX中,属性值能够被声明为依赖于(绑定到)包含其它属性的表达式。这样,当某个被引用的属性数值发生变化时,所有依赖此属性的属性都将直接或者间接地改变它们的数值,此过程无需调用任何的中间程序逻辑。这和在Excel之类的电子表格中使用方程式很类似。

  这对于那些需要动态维护模式和视图属性,而又时常需要复杂的程序逻辑的GUI开发来说非常有用。

“操作(operation)” vs “函数(function)”

  函数与操作之间的不同之处是函数可以递增地反复求值、可以绑定返回值、绑定参数、绑定变量/属性,隐性绑定本地变量。

  为了进一步说明,请看下面的JavaFX代码片段:

  1. Class Foo (
  2. attribute zap;
  3. function bar(x) { x + zap }
  4. }
  5. var afoo = Foo { zap: 14 }
  6. var zing = 1;
  7. var snap = afoo.bar(zing);
  8. bind dyn = afoo.bar(zing);

  我们非常清楚地看到:无论zing和zap如何变化,snap将不会发生变化。而dyn则会随着zing和zap的变化而改变。因为在zing和zap的数值发生变化时,发生了一个增量式的求值过程:程序将变化的数值传递给依赖其的所有函数,并重新计算数值。

JavaFX的授权模式是怎么的?

  JavaFX的开发者很赞同让用户发布自己的应用,并坚信开源和社区的力量。但当前的JavaFX版本是在评估授权下发布的,因此并不能够被重新发布。你当然能够发布自己编写的基于JavaFX的应用,但不能够和JavaFX一起捆绑发布,并需要告之使用者:需要到openjfx项目站点下载JavaFX二进制代码库。并且,由于正处于早期的JavaFX代码还处在评估授权下,因此它不能用于商业用途。当Sun完成了JavaFX的商业化版本开发后,我相信这将会得到改变。

  Sun是否规定了发布JavaFX商业化产品的时间线?

  很抱歉,目前没有准确的时间约定,不过马上就会制定出来。

JavaFX Runtime像JavaFX Script那样开源吗?

  是的,JavaFX Runtime即将开放源代码。

在JavaFX和…之间的不同

  与F3比较:F3是Form Follows Function的缩写,这是JavaFX平台从前的名字。

  与Java比较:JavaFX 是一种兼容JSR-223的脚本语言。它能够使用Java类,并从Java类中被调用。

  与Java 6.0提供的Scriting Engine比较:Java 6.0提供的Scriting Engine为兼容JSR-223的脚本语言提供了运行平台,JavaFX可以在Java 6.0提供的Scriting Engine上执行。而JavaFX并不依赖于Java 6.0,它可以在任何兼容JSR-223的脚本引擎(比如javax.script.ScriptEngine)下执行。

  与SVG比较:SVG并不是一种程序语言;它是一种数据描述语言。其XML语法对于编程语言来讲是非常可怕的。但SVG的交互性、兼容性是令人满意的。目前JavaFX开发团队并没有计划直接使用SVG。由于SVG和JavaFX都源自旧的PostScript和Java2D向量图形模式,因此在某种程度上,我们已经在JavaFX中使用了SVG,但目前仍然存在某些值得注意的不兼容性。
Chris Oliver 已经编写了SVG-to-F3 转换程序。

  与Swing比较:JavaFX是一种编写Swing应用的新方式,它无需了解swing框架和java语言。

  与JavaScript比较:在JavaFX和JavaScript之间唯一相同点就是它们都是兼容JSR-223的脚本语言。

  与Ajax比较:Ajax是使用了JavaScript和异步更新的web浏览器端技术。它与JavaFX的关系:两者都是UI相关的技术。但它们在语言和环境上完全不同。

  与Savaje OS的关系:Sun正在计划使用它们购买的Saveje手机系统和JVM来发布JavaFX Mobile,后者能在移动设备上运行JavaFX脚本,它将成为Windows Mobile、Flash Lite的有力竞争者。

我能够使用JavaFX编写Java3D应用吗?它兼容VRML或者X3D标准、Xj3D之类的代码库吗?

  没有原因不能使用。JavaFX能够和任何第三方代码库互操作,并且不需要任何特殊语法。目前JavaFX开发团队正在进行开发支持Java3D的功能。

JavaFX是一种RCP(Rich Client Platform) 吗?

  是的。JavaFX不仅能够用于RCP开发,也能够用于RIA(Rich internet Applications)开发。

我能够在web应用中使用JavaFX吗?

  JavaFX能够用于编写前端应用、web应用的视图或者用户接口,不过这都需要JVM的支持。

JavaFX将代替Java EE中的JSF和JSP吗?

  不,JSF和JSP用于编写纯粹的web应用(对于支持HTML的HTTP客户端来讲是可用的),而JavaFX需要位于客户端的JVM。如果你希望编写富客户端的话,那么就需要在客户端安装JRE,JavaFX能够提供与基于Flash的Flex、基于.net的Silverlight相同的功能。常见的应用场景是开发运行在公司内网的应用。

JavaFX在运行时需要服务器吗?

  JavaFX是一种关注GUI的脚本语言;它主要用于桌面应用,因此不需服务器。如果你计划部署JNLP(Java Web Start)的话,那么你需要一台web服务器。

运行JavaFX需要什么条件?

  两种条件任选其一:

Java5以上、一个兼容JSR-223的实现、JavaFX代码库;
Java6以上、JavaFX代码库。

目前有JavaFX可用的编译器吗?

  OpenFX Compiler是JavaFX编译器项目,目前已经开放源代码。详细情况请访问:https://openjfx-compiler.dev.java.net/

开发中遇到的问题

JavaFX中有哪些固有的数据类型?

  JavaFX中的固有数据类型:String、Boolean、Number、Integer。

JavaFX与Java类型之间的对应关系:

  更多信息请访问:
https://openjfx.dev.java.net/JavaFX_Programming_Language.html#basic_types

如何连接两个字符串?“+”操作符已经不起作用了!?

  与Java有所不同,JavaFX并没有重载“+”操作符来使其用于字符串连接:

  1. import javafx.ui.*;
  2. import javafx.ui.canvas.*;
  3.  
  4. Frame {
  5. content: Label {
  6. text: "Hello " + "World"
  7. }
  8. visible: true
  9. }

如果尝试运行上面的代码,我们将看到以下的控制台输出:

  1. compile thread: Thread[AWT-EventQueue-0,6,main]
  2. compile 2.031
  3. file:/C:/workspace/F3/HelloWorld.fx:6: incompatible types: expected Number, found String in "Hello "
  4. file:/C:/workspace/F3/HelloWorld.fx:6: incompatible types: expected Number, found String in "World"
  5. file:/C:/workspace/F3/HelloWorld.fx:6: incompatible types: expected String, found Number in text: "Hello " + "World"

实现方式之一:修改代码

Java实现方法:

实现方式之二:调用concat()方法

JavaFX提供了concat()方法来连接两个字符串:如何将字符串转换为数字?

  1. import javafx.ui.*;
  2. import javafx.ui.canvas.*;
  3.  
  4. Frame {
  5. content: Label {
  6. text: "Hello ".concat("World")
  7. }
  8. visible: true
  9. }

 

  目前没有直接的方式,但可以使用下面的代码:

如何将TextField的数值绑定到一个数字类型属性?

  使用绑定::

如何设置用在Java Web Start上的JavaFX?

  JNLP (Java Network Launch Protocol)是一种基于XML的协议,它能够在网络上部署Java和JavaFX应用。

  这里提供一个用于部署JavaFXPad的JNLP示例。详细示例请见:http://download.java.net/general/openjfx/demos/javafxpad.jnlp) 。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <jnlp
  3. spec="1.5+"
  4. codebase="http://download.java.net/general/openjfx/demos"
  5. href="javafxpad.jnlp">
  6. <information>
  7. <title>JavaFX Demos:JavaFX Pad</title>
  8. <vendor>Sun Microsystems</vendor>
  9. <offline-allowed />
  10. </information>
  11. <security>
  12. <all-permissions/>
  13. </security>
  14.  
  15. <resources>
  16. <j2se version="1.5+" href="http://java.sun.com/products/autodl/j2se"
  17. java-vm-args="-Xss1M -Xmx256M"
  18. >
  19. </j2se>
  20. <jar href="javafxrt.jar" main="true"/>
  21. <jar href="Filters.jar"/>
  22. <jar href="swing-layout.jar"/>
  23. <jar href="javafxpad.jar"/>
  24. </resources>
  25. <application-desc main-class="net.java.javafx.FXShell">
  26. <argument>javafxpad.Main</argument>
  27. </application-desc>
  28. </jnlp>

“Hello Web Start FX”示例

环境需求
        • Java 5 JDK
        • 从openjfx项目下载后获得的JavaFX代码包中提取出来的/lib/javafxrt.jar and lib/swing-layout.jar

“Hello Web Start JFX”程序代码

文件名: HelloWebStart.fx

创建 HelloWebStartJFX.jar 创建 HelloWebStartJFX.jnlp

  1. jar cvf HelloWebStartJFX.jar HelloWebStart.fx

 

文件名: HelloWebStartJFX.jnlp
对jar文件进行签名

连接到HelloWebStartJFX.jnlp

文件名: index.html

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <title>Hello Web Start JFX!</title>
  7. </head>
  8.  
  9. <body>
  10. <h1>Hello Web Start JFX!</h1>
  11.  
  12. <p><a href="HelloWebStartJFX.jnlp">Java Web Start: Hello Web Start JFX!</a></p>
  13. </body>
  14. </html>

Web服务器: 设置用于.jnlp 的MIME类型

Apache服务器:在http.conf 或者 .htaccess文件中添加类型:

将文件复制到Web服务器

启动Web Start

  通过www.example.com/HelloWebStartJFX/启动web Start。

如何使用“全限定名”引用Java类?

  全限定Java类名必须使用法语引号<< >>进行修饰。

如何访问内部类和接口?

  在访问内部类和接口时,你只能使用内部类的编译名。

  例如: 在Java中的import java.util.Map.Entry,在JavaFX中将表示为import java.util.Map$Entry。

  在JavaFX中还需要注意的是在引用内部类时,你需要继续使用Outer$Inner 这种形式的语法。为了方便使用,你也可以相应地将导入语句修改为:

如何在JavaFX中轻松定制Swing组件?

  这里提供了一些对Swing组件进行快速封装的代码,它能用于JavaFX组件层中:

SwingWidget类定义:

文件名:SwingWidget.fx

用法:

  下面提供了一个使用SwingWidget的简单示例。请注意在树形列表中提供的数据来自于默认的树形模型,而不是JavaFX所特有的。

文件名:WidgetTest.fx

  1. package a.b.c;
  2.  
  3. import javafx.ui.*;
  4. import javafx.ui.canvas.*;
  5. import java.lang.System;
  6. import javax.swing.JTree;
  7. import a.b.c.SwingWidget;
  8.  
  9. Frame {
  10. onClose: operation() {
  11. System.exit(0);
  12. }
  13. content: SwingWidget {
  14. swingComponent: new JTree()
  15. }
  16. visible: true
  17. title: "WTF, the Widget Test Framework"
  18. }

运行界面:
  

为什么我的某些.fx文件不能被JavaFX Pad重新装载?

  非常抱歉地告诉你,JavaFXPad目前的功能非常有限。他并不能检测到外部文件的改变。为了让它能够“看到”你的修改,你需要以手工的方式在JavaFXPad中重新打开修改后的文件。

如何引用其它JavaFX文件?

  JavaFX能够从以下三种资源中引用静态值、变量和类:

        1.在同一文件内
        2.在相同的目录/包路径下的文件
        3.在其它的包路径下的文件

  首先,第一种方式非常简单。如果你正在引用处于相同文件中的类,那么你只需要使用类名即可(类可以被定义在引用之前或者之后)。而变量则要在它们被声明之后才能被引用。

  对于第二种方式,显而易见,你无须对处于相同包路径下的每个.fx文件都使用import语句,而只要提供具有它们所在的同一包路径的import语句即可。

  如果你有其它的内部类或者你需要从不同的包路径下引入类,那么就需要使用import语句完成一点额外工作:使用import语句将.fx文件导入,而不是在此文件中的某个特定的类。例如,如果MediaTable.fx包含两个类:MediaTableColumn和MediaTableRow,那么你只需要importing MediaTable这一条语句就可以导入这两个类。

  你也可以像使用Java一样使用 import *语句。但由于这种方式降低了代码的可读性,所以并不推荐给大家。

JavaFX脚本提供类似 __LINE__这样的魔术常量(magic constants)吗?

魔术常量

        • __DIR__ -- 返回包含当前FX源文件的目录的URL。如果当前文件是从jar文件装载的,那么返回值可能是jar文件的URL。
        • __FILE__ -- 返回当前源文件的URL。
        • __LINE__ -- 返回当前源文件中的当前行。
        • __ARCHIVE__ -- 返回包含当前文件的jar文件的URL。

示例更多信息: Christopher Oliver编写的"Magic Constants"

  1. import javafx.ui.*;
  2.  
  3. Frame {
  4. title : 'Magic Constants'
  5. width : 700
  6. height : 400
  7. content: Label {text: "<html><dl>
  8. <dt>__DOCBASE__</dt><dd>{__DOCBASE__}</dd>
  9. <dt>__DIR__</dt> <dd>{__DIR__}</dd>
  10. <dt>__FILE__</dt> <dd>{__FILE__}</dd>
  11. <dt>__LINE__</dt> <dd>{__LINE__}</dd>
  12. <dt>__ARCHIVE__</dt><dd>{__ARCHIVE__}</dd>
  13. </dl></html>"}
  14.  
  15. visible: true
  16. }// Frame


JavaFX中的保留字有哪些?

after
and
as
assert
attribute
before
bind
break
by
catch
class
continue
delete
distinct
do
dur
easeboth
easein
easeout
else
endif
extends
false
finally
first
for
foreach
format
fps
from
function
if
import
in
index
indexof
insert
instanceof
into
inverse
last
later
lazy
linear
motion
nodebug
new
not
null
on
operation
or
order
package
private
protected
public
readonly
return
reverse
select
sizeof
super
then
this
throw (请注意不是throws)
trigger
true
try
typeof
unitinterval
valueof
var
where
while
xor

 

  1. package a.b.c;
  2.  
  3. import javafx.ui.*;
  4. import javax.swing.JComponent;
  5.  
  6. class SwingWidget extends Widget {
  7. attribute swingComponent: JComponent;
  8. }
  9.  
  10. operation SwingWidget.createComponent():<<javax.swing.JComponent>> {
  11. return swingComponent;
  12. }

 

  1. import java.util.Map$Entry as Entry

  这样就不必重复地使用Outer$Inner形式了。

我能够使用Java 5的枚举(enumerations)吗?

  当然可以。你可以采用下面的方式引用它们:

  1. import java.util.management.MemoryType; // 导入枚举
  2. var value = HEAP:MemoryType; // 使用枚举值
  3. // HEAP是MemoryType中的枚举值
  4. var allValues = MemoryType.values(); // 创建包含所有枚举值的JavaFX数组

 

  1. mkdir /www/www.example.com/docs/HelloWebStartJFX/
  2. cp index.html HelloWebStartJFX.jnlp HelloWebStartJFX.jar javafxrt.jar swing-layout.jar /www/www.example.com/docs/HelloWebStartJFX/

 

  1. application/x-java-jnlp-file JNLP

 

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <jnlp spec="1.5+"
  3. codebase="http://www.example.com/HelloWebStartJFX/"
  4. href="HelloWebStartJFX.jnlp">
  5.  
  6. <information>
  7. <title>Hello Web Start JFX</title>
  8. <vendor>John Doe</vendor>
  9. <homepage href="http://www.example.com/HelloWebStartJFX/"/>
  10. <description>Web Start example for JavaFX Scripts</description>
  11. <offline-allowed/>
  12. </information>
  13.  
  14. <security>
  15. <all-permissions/>
  16. </security>
  17.  
  18. <resources>
  19. <j2se version="1.5+" href="http://java.sun.com/products/autodl/j2se">
  20. </j2se>
  21.  
  22. <jar href="javafxrt.jar" main="true"/>
  23. <jar href="swing-layout.jar"/>
  24. <jar href="HelloWebStartJFX.jar"/>
  25. </resources>
  26.  
  27. <application-desc main-class="net.java.javafx.FXShell">
  28. <argument>HelloWebStart</argument>
  29. </application-desc>
  30. </jnlp>

创建签名密钥

  1. keytool -genkey -alias jfx -dname "CN=John Doe, O=JFX Inc." -validity 9999 -keystore jfx.keystore -keypass keyPassword -storepass storePassword

 

  1. jarsigner -keystore jfx.keystore -verbose -keypass keyPassword -storepass storePassword HelloWebStartJFX.jar jfx
  2. jarsigner -keystore jfx.keystore -verbose -keypass keyPassword -storepass storePassword javafxrt.jar jfx
  3. jarsigner -keystore jfx.keystore -verbose -keypass keyPassword -storepass storePassword swing-layout.jar jfx

 

  1. import javafx.ui.*;
  2.  
  3. Frame {
  4. title : 'Hello Web Start JFX!'
  5. width : 600
  6. height : 400
  7.  
  8. content: Label {
  9. text: 'Hello Web Start JFX!'
  10. font: Font{size: 32}
  11. }
  12.  
  13. visible: true
  14. }

 

  1. var total = 10
  2. TextField {
  3. value: bind total
  4. ...
  5. }

  也可以使用format进行格式化:

  1. value: bind "{total format as <<#,##0>>}"

 

  1. var value = new DecimalFormat("0").parse(someString);

 

  1. String s = "Your score is " + n + " out of " + total + ".";

JavaFX的字符串表达式操作符{}实现连接字符串的功能:

  1. var s:String = "Your score is {n} out of {total}.";
分享到:
评论

相关推荐

    JavaFx应用实例

    JavaFx 应用小实例

    javafx应用不同的css文件

    作了一个例子,使用binding不同的css文件,变换不同的样式。界面比较漂亮。下载完后直接可用netbean6.8打开看效果。

    GMapsFX, Java API用于在JavaFX应用程序中使用 谷歌地图.zip

    GMapsFX, Java API用于在JavaFX应用程序中使用 谷歌地图 GMapsFX修正的注意:在macosx的GMapsFX中出现的问题。 ! 纯 JavaFX API允许你在不需要与底层 谷歌地图 JavaScript API交互的情况下向你的JavaFX应用程序添加...

    JavaFX的piano应用

    这是一个用JavaFX脚本语言编写的简单应用。

    javafx javafx javafx javafx

    javafx

    JavaFX API文档

    Sun公司已于2008年12月05日发布了JavaFX技术的正式版,它使您能利用 JavaFX 编程语言开发互联网应用程序(RIA)。该产品于2007年5月在JavaOne大会上首次对外公布。JavaFX技术主要应用于创建Rich Internet ...

    JavaFX 官方教程:RIA 应用开发

    JavaFX 官方教程:RIA 应用开发

    javaFX桌面应用管理系统

    学生时代JAVA结课设计,团支部管理系统,javaFX实现,数据读取由文件实现,可自由添改

    JavaFX 构建GUI 应用程序

    JavaFX 构建GUI 应用程序 第1 课:JavaFX GUI 简介 第2 课:使用声明性语法 ........ 第8 课:使GUI 元素具有交互

    JavaFX 基础

    JavaFX应用可以无缝地在桌面或者Web浏览器中运行 JavaFX为设备提供多点支持,适用于开发平板或智能手机应 用 JavaFX具有内建的2D、3D和动画支持,以及视频和音频的 回放功能,可以作为一个应用独立运行或者在浏览器中...

    JavaFX高级教程:部署JavaFX2.0应用

    JavaFX高级教程:部署JavaFX2.0应用 官方中午文档

    JAVAFX官方教程:RIA应用开发

    资源名称:JAVA FX官方教程:RIA应用开发内容简介:《JavaFX官方教程:RIA应用开发》通过使用JavaFX,开发人员和平面设计师可以协同工作来构建健壮的、拟真的应用程序,并能够将它部署到任何地方:桌面、Web、数百万...

    JavaFX PDF

    Sun公司已于2008年12月05日发布了JavaFX技术的正式版,它使您能利用 JavaFX 编程语言开发互联网应用程序(RIA)。该产品于2007年5月在JavaOne大会上首次对外公布。JavaFX技术主要应用于创建Rich Internet ...

    JavaFX:简单的JavaFX应用程序

    JavaFX 简单的JavaFX应用程序

    index.chm javaFX api document

    JavaFX 包含了一些列图形和媒体包,允许程序员设计、创建、测试、调试、和部署富客户端应用并且保持跨平台的操作一致性。 JavaFX 应用程序由 Java API 编写,可以调用任何 Java API 包。例如,可以调用 Java API ...

    javaFx 完整版项目(Spring+SpringMVC+Mybatis)

    javaFx开发ERP项目,整合Spring+SpringMVC+Mybatis(SSM)内含数据绑定、表格数据处理以及表单数据,拥有高大上的UI界面

    JAVAFX使用教程-使用布局窗格

    在JavaFX应用中,当然可以通过指定UI元素的位置和大小属性来手动布局。不过,更简单的方法是使用布局窗格。JavaFX SDK提高了多种布局容器类(称为窗格)来方便的建立和管理经典布局,如行、列、堆、拼贴等。由于窗口是...

    JavaFX2.0 桌面应用例子YahooWeather

    JavaFx的初次尝试,大家可以访问的新博客 http://zhenghaoju700.blog.163.com/blog/static/1358595182011915103814548/ 解压后双击 YahooWeather.jar文件,必须安装JavaFx 运行时环境

    javaFX Demo 模板案例

    javaFX Demo 模板案例

    javafx2.0官方例子

    言开发富互联网应用程序(RIA)。JavaFX Script编程语言(以下称为JavaFX)是Sun微系统公司开发的一种declarative,statically typed(声明性的、静态类型)脚本语言。JavaFX技术有着良好的前景,包括可以直接调用Java...

Global site tag (gtag.js) - Google Analytics