2008-11-12 120 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; 



}