程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JavaFX和Java之間的互操作性

JavaFX和Java之間的互操作性

編輯:關於JAVA

從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;importjava.io.InputStreamReader;importjavax.t.tEngine;importjavax.t.tEngineManager;importJavax.t.tException;public classCalculatorLauncher public staticvoid main(String args) trytEngineManager manager=newtEngineManager();tEngine engine=manager.getEngineByExtension("fx");InputStreamReader reader =newInputStreamReader(CalculatorLauncher.class.getResourceAsStream("Calculator.fx"));engine.eval(reader);catch(tException ex)

但是,這種方法其實沒有多大意義,因為它就是象System.exec("calc")那樣做個系統調用而已。我覺得還不如用System.exec("JavafxCalculator.fx")更加直接一些。

2)采用JavaReflection來解析JavaFX的bytecode,得到各個method或屬性,然後進行各種調用。原理上這是可行的。但是由於reflection非常復雜,使得實用性大打折扣,同時,代碼也沒有什麼可讀性了。

3)第三種方法是定義一個java的interface,然後在JavaFX中實現這個 interface。例如:

public interface JavaInterface

...

在 MyJavaFXClass.fx中, 可以這樣寫:

public class MyJavaFXClass extends JavaInterface

...

在java代碼中,只需按照interface來調用JavaFX對象即可。例如:

JavaMain.javapublic class JavaMain public static tstart(JavaInterface ji)returnji.createStage();JavaInterface.javapublicinterface JavaInterfacepublic t createStage();MyStage.fxpublicclass MyStage extendsJavaInterface public override ncreateStage(): tStage title:"Application title"width: 250border="1" Height:80scene: Scenecontent: Text font: Font size: 24x: 10,y: 30content:"Applicationcontent"

Main.fx

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

這種方法可以解決大部分互操作性的問題。唯一的麻煩就是必需定義一大堆interface,但是這是我目前位置發現的一種最好的解決形式。JavaFX現在是剛發布的第一版,所以我們無需對它苛求太多了。不過我還是希望JavaFX的設計者在下一版本中認真考慮這個問題。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved