我是否可以直接从Java使用新JavaFX API提供的新功能,其程度与使用JavaFX Script的程度相同?
所有底层JavaFX API是纯Java还是JavaFX Script还是混合?
答案 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;
}