JavaFX和Java之间的互操作性

企业动态 后端
JavaFX和Java互操作性是很有必要的,JavaFX可以有更大的生命力。

从JavaFX官方博客上读了一篇文章,是讨论从java代码中调用JavaFX类的方法。现在的情况是,JavaFX可以调用Java的类,基本没有什么限制,而反过来,Java却不可以随便调用JavaFX的类。这点可以从JavaFX项目的编译过程看出原因。以NetBeans为例,Build的过程是先编译Java代码(javac),然后才是JavaFX代码(javafxc),这样一来,java代码不知道有javafx类,而javafx类却可以"看见"java类。搜索一下我们可以发现,很多程序员都在寻找各种从java中调用JavaFX类的方法。有一篇有趣的文章(英文)是介绍如何通过反向工程来分析JavaFX类的结构。就连那篇JavaFX官网上的文章,也采用了非标准的API来实现这一目的,而且也"保证"这种方法肯定会在下一版本中失效。

那么我们到底需不需要java和javafx之间的这种互操作性呢?我觉得这种互操作性是很有必要的。如果两者可以近似于可以混用的程度,从长远上看,JavaFX可以有更大的生命力。试想一下运用MVC的设计模式(Model-View-Controller),我们可以用java和javafx结合在一起开发应用:用java来写"M"和"C"两部分,用javaFX来写"V"部分,这将是非常有趣的一件事情。

目前,有几种"标准"的方法来从Java调用JavaFX。

1) 使用ScirptEngineManager类,Geertjan Wielenga的文章提到,我们可以这样做:

package calc;
import java.io.InputStreamReader;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class CalculatorLauncher {

public static void main(String[] args) {
 try {
 ScriptEngineManager manager=new ScriptEngineManager();
 ScriptEngine engine = manager.getEngineByExtension("fx");
 InputStreamReader reader = new InputStreamReader
 (CalculatorLauncher.class.getResourceAsStream("Calculator.fx"));
 engine.eval(reader);
   } catch (ScriptException ex) {
  }
 }
}



但是,这种方法其实没有多大意义,因为它就是象System.exec("calc")那样做个系统调用而已。我觉得还不如用System.exec("javafx Calculator.fx")更加直接一些。

2) 采用Java Reflection来解析JavaFX的bytecode,得到各个method或属性,然后进行各种调用。原理上这是可行的。但是由于reflection非常复杂,使得实用性大打折扣,同时,代码也没有什么可读性了。

3)第三种方法是定义一个java的interface,然后在JavaFX中实现这个 interface。例如:

public interface JavaInterface
{ ... }
在 MyJavaFXClass.fx中, 可以这样写:

public class MyJavaFXClass extends JavaInterface
{ ... }


在java代码中,只需按照interface来调用JavaFX对象即可。例如:

JavaMain.java

public class JavaMain {
  public static Object start( JavaInterface ji){
    return ji.createStage();
  }
}

JavaInterface.java

public interface JavaInterface {
  public Object createStage();
}

MyStage.fx

public class MyStage extends JavaInterface {

  public override function createStage(): Object{

    Stage {
      title: "Application title"
      width: 250
      height: 80
      scene: Scene {
        content: Text {
          font: Font {
            size: 24
          }
          x: 10,
          y: 30
          content: "Application content"
        }
      }
}
  }

Main.fx

var mys = MyStage{};
JavaMain.start(mys);


这种方法可以解决大部分互操作性的问题。唯一的麻烦就是必需定义一大堆interface,但是这是我目前位置发现的一种最好的解决形式。 JavaFX现在是刚发布的第一版,所以我们无需对它苛求太多了。不过我还是希望javaFX的设计者在下一版本中认真考虑这个问题。

【编辑推荐】

  1. JavaFX 1.2 已经发布 主要新功能一览
  2. RIA之争 JavaFX是否能后来居上?
  3. JavaFX市场收效甚微 需寻找新突破
  4. JavaFX对Java开发者到底意味着什么
  5. JavaFX,Flex和Silverlight横向对比


【责任编辑:志京 TEL:(010)68476606】

责任编辑:佚名 来源: JavaFXBlogs
相关推荐

2009-02-04 17:11:28

JavaFXJava兼容性

2010-03-17 12:32:07

ASP.NETjQuery开源社区

2020-03-03 21:13:20

物联网融合互操作

2017-02-06 11:50:12

NFV操作性测试

2017-02-06 14:34:24

NFV网络功能MANO

2012-09-07 09:51:07

云互操作性云可移植性云计算服务

2019-01-07 05:56:23

NFV网络功能虚拟化API

2023-10-13 09:00:00

云计算架构

2010-02-24 15:27:04

ibmdwMashup

2018-02-27 15:41:27

IOT语义操作性

2009-07-17 13:49:57

Windows Emb

2023-06-15 15:40:36

2021-08-19 14:12:30

物联网数据结构IoT

2018-10-17 10:46:54

区块链互操作性比特币

2023-12-27 14:50:10

2011-06-15 10:09:31

云计算互操作混合云

2015-06-16 09:19:12

OpenStackUnitedStack互操作

2018-03-21 16:38:19

IOT语义API

2012-05-15 16:21:25

2012-09-25 14:17:39

互操作
点赞
收藏

51CTO技术栈公众号