JavaFX和Java互操作性

时间:2008-11-12 11:12:15

标签: java api interop javafx

我是否可以直接从Java使用新JavaFX API提供的新功能,其程度与使用JavaFX Script的程度相同?

所有底层JavaFX API是纯Java还是JavaFX Script还是混合?

3 个答案:

答案 0 :(得分: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中所示。或者,这是最优雅的解决方案IMHO,使用JavaFX编写API访问代码,定义Java接口以与来自普通Java的JavaFX代码交互,然后在JavaFX中实现这些接口。

答案 1 :(得分:1)

我们能够使用JavaFX的多媒体组件取得一些成功。它们以这种方式完全不受支持,并且可能会像com.sun包在JavaSE中一样发生变化。

我们将它们集成到Swing UI中,并且能够直接从Java中完成从FX中完成的MM。

希望他们很快将其中的一部分放在核心库中。

答案 2 :(得分:1)

JavaFX中使用的场景图是opensource。你可以在这里查看(https://scenegraph.dev.java.net)。虽然该站点尚未更新以反映JavaFX 1.x附带的最终版本,但您仍然可以使用JavaFX SDK附带的jar并在swing应用程序中混合使用scenegraph和swing节点。但是,你会遇到一些困难,因为这个版本的scenegraph没有官方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;



}