2008-11-12 95 views
2

我是否可以直接從Java中使用新的JavaFX API提供的新功能,就像我能夠使用JavaFX Script一樣?JavaFX和Java的互操作性

所有底層的JavaFX API純粹是Java還是JavaFX Script或混合?

+1

與http://stackoverflow.com/questions/359683/javafx-and-java類似。 – 2009-04-01 20:25:50

回答

3

JavaFX API是JavaFX和Java的混合。 SDK附帶一個存檔src.zip,其中包含部分API(僅包含最基本的類,但缺少javafx.scene等內容)。

在JavaFX 1.x AFAIK中不正式支持從Java調用JavaFX代碼。有一個blog entry in the JavaFX blog,告訴你如何使用不受支持的API來做它,但它很複雜,並且在將來的版本中不會以這種方式工作。

Java有兩種支持方式來使用JavaFX。您可以使用Scripting API來調用JavaFX代碼,如this article中所示。或者,這是最優雅的解決方案,使用JavaFX編寫訪問API的代碼,定義Java接口以與來自普通Java的JavaFX代碼交互,然後在JavaFX中實現這些接口。

1

我們能夠在JavaFX上使用多媒體組件,取得了一些成功。他們完全不支持這種方式,並且可能會改變,類似於JavaSE中的com.sun包。

我們將它們整合到一個Swing UI中,並能夠通過Java直接從FX完成MM可以做的事情。

希望他們很快將這些內容放入核心庫。

1

JavaFX中使用的場景圖是開源的。你可以在這裏檢查(https://scenegraph.dev.java.net)。雖然網站尚未更新以反映JavaFX 1.x附帶的最終版本,但您仍然可以使用JavaFX SDK附帶的jar,並在swing應用程序中混合使用scenegraph和swing節點。不過,你會遇到一些困難,因爲這個版本的場景圖沒有官方的API。

下面是使用JavaFX 1.0創建的場景圖的「hello world」。請記住在構建路徑中包含「Scenario.jar」。

import java.awt.Color; 
import java.awt.Paint; 
import java.awt.geom.Point2D; 

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

import com.sun.scenario.scenegraph.JSGPanel; 
import com.sun.scenario.scenegraph.SGGroup; 
import com.sun.scenario.scenegraph.fx.FXText; 



public class HelloWorldScenario101 implements Runnable { 



    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new HelloWorldScenario101()); 
    } 



    public HelloWorldScenario101() { 
     // 
    } 



    @Override 
    public void run() { 

     this.frame = new JFrame(); 
     this.panel = new JSGPanel(); 
     this.text = new FXText(); 
     this.paint = new Color(255, 0, 0, 255); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setTitle("Hello World"); 
     frame.add(this.panel); 
     frame.setContentPane(this.panel); 
     scene = new SGGroup(); 
     this.text.setText("Hello World"); 
     this.text.setFillPaint(this.paint); 
     this.text.setLocation(new Point2D.Float(10, 10)); 
     this.scene.add(this.text); 
     this.panel.setScene(scene); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 

    } 



    private JFrame frame; 

    private JSGPanel panel; 

    private SGGroup scene; 

    private FXText text; 

    private Paint paint; 



}