用纯Java代码调用JavaFX的功能

开发 后端
在JavaFX 1.0发布之后,本人撰写的文章讲述JavaFX和Java之间的互操作性。文中总结了3种从Java调用JavaFX的方法。本文将讲的是用纯Java代码调用JavaFX的功能。

从Java调用JavaFX的三种方法分别为:

1. 用ScriptEngineManager类。这是基于JSR-223规范的java脚本API( scripting API)。可以在java程序中运行一些脚本,如 JavaFX script, javascript等。

2. 通过JavaFX reflection API。这是JavaFX提供的反射API,几乎可以调用所有的JavaFX类。

3. 先用JavaFX类实现一个Java的interface,然后Java程序可以通过这个interface来调用JavaFX的功能。这中间的interface起了个桥梁的作用。 

第三种方法应该是比较“正规”而且“优美”的调用方式。但是也有一点不足:程序代码的入口必须从JavaFX启动。这是因为JavaFX程序比较容易生成JavaFX类的实例,从而可以供Java方使用。可是我们有时会碰到一些特定的情况,需要从Java端启动代码。例如,如果你已经有了一个较完整的Java程序,你需要用调用JavaFX的某些功能,这时候较好的方法是把Java作为程序的入口。为了解决这个问题,我把第2和第3种方法作了融合,大家可以看看下面的例子。

假定我们需要从Java中调用JavaFX的图表(charting)功能。我们首先用JavaFX reflection API生成JavaFX类的实例。然后我们再通过java的interface来使用它。因此,我们先定义一个Java的interface:

  1. /*    
  2.  * JavaInterface.java    
  3.  *    
  4.  * @author Henry Zhang  http://www.javafxblogs.com    
  5.  */    
  6. package javatest;     
  7. public interface JavaInterface {     
  8.   public void addData(String name, float data);     
  9.   public void showChart();     
  10. }    
  11.  
  12. /*  
  13.  * JavaInterface.java  
  14.  *  
  15.  * @author Henry Zhang  http://www.javafxblogs.com  
  16.  */  
  17. package javatest;  
  18. public interface JavaInterface {  
  19.   public void addData(String name, float data);  
  20.   public void showChart();  

下一步是创建JavaFX类MyChart来实现这个interface:

  1. /*    
  2.  * MyChart.fx    
  3.  *    
  4.  * @author Henry Zhang http://www.javafxblogs.com    
  5.  */    
  6. package javatest;     
  7.     
  8. import javafx.scene.chart.PieChart;     
  9. import javafx.scene.Scene;     
  10. import javafx.scene.text.Font;     
  11. import javafx.scene.text.Text;     
  12. import javafx.stage.Stage;     
  13. import javafx.scene.chart.PieChart3D;     
  14.     
  15. public class MyChart extends JavaInterface {     
  16.   var chartData :  PieChart.Data[] = [];     
  17.     
  18.   public override function addData( l:String, v: Number):Void {     
  19. var llabelString = l;     
  20.     
  21. var data =  PieChart.Data {     
  22.   label : l     
  23.   value : v     
  24.   action: function() {     
  25. println("{labelString} clicked!");     
  26.   }     
  27.  } ;     
  28.     
  29. insert data into chartData;     
  30.   }     
  31.     
  32.   public override function showChart() : Void {     
  33. var chart =     
  34.   PieChart3D {     
  35. data : chartData     
  36. pieThickness: 25    
  37. pieLabelFont: Font{ size: 9 };     
  38. pieToLabelLineOneLength: 10    
  39. pieToLabelLineTwoLength : 20    
  40. pieLabelVisible: true    
  41. pieValueVisible: true    
  42. translateY: -50    
  43.  };     
  44.     
  45. Stage {     
  46.   title: "PieChart Window"    
  47.   width: 520    
  48.   height: 300    
  49.   scene: Scene {     
  50. content: [     
  51.   Text {     
  52. font : Font {     
  53. size : 16    
  54.    }     
  55. x: 200    
  56. y: 20    
  57. content: "Pie Chart"    
  58.   },     
  59.   chart     
  60. ]     
  61.   }     
  62. }     
  63.   }     
  64. }    
  65.  
  66. /*  
  67.  * MyChart.fx  
  68.  *  
  69.  * @author Henry Zhang http://www.javafxblogs.com  
  70.  */  
  71. package javatest;  
  72.  
  73. import javafx.scene.chart.PieChart;  
  74. import javafx.scene.Scene;  
  75. import javafx.scene.text.Font;  
  76. import javafx.scene.text.Text;  
  77. import javafx.stage.Stage;  
  78. import javafx.scene.chart.PieChart3D;  
  79.  
  80. public class MyChart extends JavaInterface {  
  81.   var chartData :  PieChart.Data[] = [];  
  82.  
  83.   public override function addData( l:String, v: Number):Void {  
  84. var llabelString = l;  
  85.  
  86. var data =  PieChart.Data {  
  87.   label : l  
  88.   value : v  
  89.   action: function() {  
  90. println("{labelString} clicked!");  
  91.   }  
  92.  } ;  
  93.  
  94. insert data into chartData;  
  95.   }  
  96.  
  97.   public override function showChart() : Void {  
  98. var chart =  
  99.   PieChart3D {  
  100. data : chartData  
  101. pieThickness: 25  
  102. pieLabelFont: Font{ size: 9 };  
  103. pieToLabelLineOneLength: 10  
  104. pieToLabelLineTwoLength : 20  
  105. pieLabelVisible: true  
  106. pieValueVisible: true  
  107. translateY: -50  
  108.  };  
  109.  
  110. Stage {  
  111.   title: "PieChart Window"  
  112.   width: 520  
  113.   height: 300  
  114.   scene: Scene {  
  115. content: [  
  116.   Text {  
  117. font : Font {  
  118. size : 16  
  119.    }  
  120. x: 200  
  121. y: 20  
  122. content: "Pie Chart"  
  123.   },  
  124.   chart  
  125. ]  
  126.   }  
  127. }  
  128.   }  

***就是从java类JavaTest中调用图表功能:

  1. /*    
  2.  * JavaTest.java    
  3.  * @author Henry Zhanghttp://www.javafxblogs.com    
  4.  */    
  5. package javatest;     
  6.     
  7. import javafx.reflect.FXClassType;     
  8. import javafx.reflect.FXLocal;     
  9. import javafx.reflect.FXLocal.Context;     
  10. import javafx.reflect.FXLocal.ObjectValue;     
  11.     
  12. public class JavaTest {     
  13.   public static void main(String args[]) {     
  14. Context context = FXLocal.getContext();     
  15. FXClassType instance = context.findClass("javatest.MyChart");     
  16. ObjectValue obj = (ObjectValue)instance.newInstance();     
  17.     
  18. JavaInterface ji = (JavaInterface)obj.asObject();     
  19.     
  20. String [] labels = {"January", "Febuary", "March", "April"};     
  21. int [] values = { 18, 20, 25, 37 };     
  22.     
  23. for ( int i=0; i < values.length; i++ ) {     
  24.   ji.addData(labels[i], values[i]);     
  25. }     
  26.     
  27. ji.showChart();     
  28.   }     
  29. }    
  30.  
  31. /*  
  32.  * JavaTest.java  
  33.  * @author Henry Zhanghttp://www.javafxblogs.com  
  34.  */  
  35. package javatest;  
  36.  
  37. import javafx.reflect.FXClassType;  
  38. import javafx.reflect.FXLocal;  
  39. import javafx.reflect.FXLocal.Context;  
  40. import javafx.reflect.FXLocal.ObjectValue;  
  41.  
  42. public class JavaTest {  
  43.   public static void main(String args[]) {  
  44. Context context = FXLocal.getContext();  
  45. FXClassType instance = context.findClass("javatest.MyChart");  
  46. ObjectValue obj = (ObjectValue)instance.newInstance();  
  47.  
  48. JavaInterface ji = (JavaInterface)obj.asObject();  
  49.  
  50. String [] labels = {"January", "Febuary", "March", "April"};  
  51. int [] values = { 18, 20, 25, 37 };  
  52.  
  53. for ( int i=0; i < values.length; i++ ) {  
  54.   ji.addData(labels[i], values[i]);  
  55. }  
  56.  
  57. ji.showChart();  
  58.   }  

在代码中,这3句是创建JavaFX类javatest.MyChart实例,

  1. Context context = FXLocal.getContext();     
  2. FXClassType instance = context.findClass("javatest.MyChart");     
  3. ObjectValue obj = (ObjectValue)instance.newInstance();    
  4.  
  5. Context context = FXLocal.getContext();  
  6. FXClassType instance = context.findClass("javatest.MyChart");  
  7. ObjectValue obj = (ObjectValue)instance.newInstance(); 

而一下这句则是把JavaFX实例转化为Java可用的对象:

  1. JavaInterface ji = (JavaInterface)obj.asObject(); 

如果你用的是NetBeans IDE, 你可以在项目属性中把javatest.JavaTest类设为主类(Main class)(即启动类)。编译之后会生成一个javatest.jar文件。程序运行的结果如图:

Java PieChart via JavaFX

在命令行中可以采用以下方式:

  1. javafx -jar javatest.jar 

实际上,可以用纯Java的方式来启动程序,只要把JavaFX的运行环境带上即可,如:

  1. java -Djava.library.path="" 
  2.  -classpath "" -jar javatest.jar 

因为JavaFX需要的jar文件很多,因此这种“最纯”的Java方法使用起来比较麻烦。我觉得还是用JavaFX命令简洁些, 而且JavaFX就是上述java命令的封装而已。

【编辑推荐】

  1. 主流RIA技术JavaFX、Flex和SilverLight、AJAX比较
  2. 使用JavaFx创建可拖动的Applet示例
  3. JavaFX和Java之间的互操作性
  4. JavaFX对Java开发者到底意味着什么
  5. RIA之争 JavaFX是否能后来居上?
责任编辑:彭凡 来源: javafxblogs
相关推荐

2009-07-14 16:07:59

调用JavaFX代码Swing程序

2011-08-12 11:22:53

Oracle存储过程Java

2009-06-12 10:58:30

GroovyJavaFXJava平台

2009-07-17 17:00:20

JavaFX功能Swing

2017-02-24 12:00:35

iOS代码AutoLayout

2020-08-13 06:56:57

Javascript插件前端

2009-11-26 14:16:06

Java 7

2009-06-15 14:59:31

Java代码Java

2012-07-10 13:29:30

Java

2009-06-19 13:03:31

JavaFX

2024-01-31 09:43:55

模型训练

2011-08-16 16:59:58

PLSQL分页存储过程Java

2021-09-09 06:55:43

Web剪辑视频

2009-06-02 09:38:26

javafx发布JavaFX介绍JavaFX

2011-03-16 09:46:54

Eclipse代码模板

2011-11-23 09:54:32

AndroidAlarm

2021-09-08 11:02:32

Java代码图片

2009-02-13 10:04:02

AntXSLXML

2020-02-19 15:02:23

代码开发工具

2012-01-17 12:39:09

JavaSwing
点赞
收藏

51CTO技术栈公众号