Graphics2D和GraphicsContext之间的互操作性

我正在与一个寻求以Java为目标的图形渲染器的小组合作。 目前我正在试图弄清楚目标java.awt.Graphics2D是否会向前兼容。 也就是说,像JavaFX这样的其他库可以显示来自Graphics2D实例的渲染吗? java.awt.Graphics2Djavafx.scene.canvas.GraphicsContext之间是否存在互操作性?

或者,如果不直接在Graphics2DGraphicsContext之间,是否有任何方法在JavaFX应用程序中显示Graphics2D渲染,类似于Swing在Panels中显示Graphics2D渲染?

编辑:

如果问题不明显,我对Java生态系统还不熟悉。 对于更多上下文,我在互联网搜索中发现的大多数内容都是示例/教程,解释了如何在JavaFX中完成AWT中的事情(参见示例文章 ),这不能回答我的问题,但是让我猜想没有互操作性。 但是,我希望更熟悉生态系统的人可以直接回答这个问题。

在awt Graphics2D和JavaFX GraphicsContext之间没有内置的互操作性,它们是完全独立的UI工具包的完全独立的API。

建议

是否需要修改或插入现有的Swing应用程序?

是=> java.awt.Graphics接口的代码和(当嵌入JavaFX时)将您的awt渲染图形包装在SwingNode中,或使用如下定义的桥接器。

否=>代码直接指向JavaFX图形上下文或JavaFX场景图。

在JavaFX中显示Swing(和AWT)

要在JavaFX中显示Swing,可以使用SwingNode ,它可以在Java 8早期版本中使用 。

在Swing中显示JavaFX

要在Swing中显示JavaFX,可以使用JFXPanel 。 将JavaFXcanvas放入JFXPanel。 有关更多信息,请参阅JavaFX for Swing Developers教程。

桥接AWT和JavaFX图形

您可以实现桥接模式来开发抽象接口,然后委托给配置的Graphics实现。 我链接的维基页面提供了一个很好的例子,说明了如何做到这一点。 我认为这样一座桥梁的实施将非常简单。 例如,您可以实现java.awt.Graphics并将api调用映射到JavaFX GraphicsContext操作。 桥接完成后,您只需编写桥接接口的代码,桥接器就会根据您选择的实现将您的api调用转换为适合线程安全的awt或javafx方法调用。


更新:2014年5月20日

大卫吉尔伯特( JFreeChart创作者)创建了一座桥梁。 该项目是FXGraphics2D:

FXGraphics2D是针对JavaFX Canvas的Graphics2D API的免费实现。 该代码是为使用Orson Charts和JFreeChart而开发的,但对于使用Graphics2D API的任何代码通常都很有用。

FXGraphics2D需要JDK 1.8.0或更高版本,并根据(三个子句)BSD风格的许可条款获得许可。

FXGraphics2D主页和github位置 。


线程建议

如果要混合使用JavaFX和Swing Code,请注意如何管理线程。 两个工具包都是单线程的,并且两个工具包都在自己的线程上运行它们的处理,因此JavaFX代码必须在JavaFX线程上运行,Swing代码必须在Swing线程上运行。

考虑一下JavaFX SceneGraph

JavaFX包括一个能够渲染2D形状的场景图 。 考虑使用场景图而不是直接绘制canvas。

未来的可能性

未来版本的JavaFX可能包含类似OpenGLNode的东西,允许您直接渲染到OpenGL缓冲区。 用于在这样的节点上绘制的API可能与JavaFXcanvasAPI明显不同(例如,它将使用类似于jogl的东西)。

关于您链接的示例文章的说明

您在问题中链接的文章与JavaFX 1.x有关。 一般来说,完全忽略所有与JavaFX 1.x相关的旧文章,因为它已经完全过时,而且这些文章中的任何信息都可能让您大为困惑。

与JavaFX 2+相关的文章是相关的,它们的最佳来源是官方的Oracle JavaFX 2文档 。