编程开发

JavaFX开发中的问题

09-01-04 | No Comments |

  JavaFX是一种全新的、基于Java技术、力求高效、定位于富内容市场的Sun产品。JavaFX脚本是一种高生产力的脚本语言,它能够使内容开发者建立富媒体并在Java环境中完成内容部署。作为一种声明式、静态类型编程语言,它具有第一级函数、声明式语法、列表推导和基于依赖关系的增量式求值等特性,并能够直接调用平台上的Java API。由于JavaFX脚本是静态类型的,因此它具有相同的代码结构、重用、封装特性(例如package、类、继承、分离编译、部署单元),这使其能够用于创建和维护大型Java程序。

  在利用JavaFX开发过程中,总会遇到各种问题,总结了一下,希望对你有所帮助。

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 

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

  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实现方法:
String s = "Your score is " + n + " out of " + total + ".";

JavaFX的字符串表达式操作符{}实现连接字符串的功能:
var s:String = "Your score is {n} out of {total}.";

实现方式之二:调用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 

如何将字符串转换为数字?

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

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

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

使用绑定::

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

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

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

如何设置用在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

  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 

创建 HelloWebStartJFX.jar

  jar cvf HelloWebStartJFX.jar HelloWebStart.fx

创建 HelloWebStartJFX.jnlp  文件名: HelloWebStartJFX.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 

对jar文件进行签名

  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 

连接到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文件中添加类型:

application/x-java-jnlp-file JNLP

将文件复制到Web服务器

  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/ 

启动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 这种形式的语法。为了方便使用,你也可以相应地将导入语句修改为:

import java.util.Map$Entry as Entry

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

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

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

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

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

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

  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. operation SwingWidget.createComponent():<<javax.swing.JComponent>> { 
  10.     return swingComponent; 

用法:下面提供了一个使用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" 

运行界面:

为什么我的某些.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。

示例

  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


五冠 Nokia/诺基亚 5230 5230XM 送证书V20版 内有港行 销数千台
1000.0元
批发 雷朋3025镜面反光太阳镜 太阳眼镜 19.9/副 顶级质量
19.9元
促销笔记本电脑 13.3英寸超薄N450无线网卡视频
1999.0元

相关文章

留下您的脚印


«
»